【问题标题】:IsExternalStorageManager == true, but access to external storage denied (Android 11)IsExternalStorageManager == true,但拒绝访问外部存储(Android 11)
【发布时间】:2021-08-12 17:16:11
【问题描述】:

我有这样一个代码,我可以在其中获得对外部存储的写入权限。在那里我也检查了是否获得了这个权限。

private void ExternalStoragePermission()
    {

        ActivityCompat.RequestPermissions(this,
                    new String[]{Manifest.Permission.ReadExternalStorage,
                            Manifest.Permission.ManageExternalStorage}, 1);

        //Android 11
        if (Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.R)
        {
            if (!Android.OS.Environment.IsExternalStorageManager)
            {
                try
                {
                    Intent intent = new Intent(Android.Provider.Settings.ActionManageAllFilesAccessPermission);
                    intent.AddCategory("android.intent.category.DEFAULT");
                    intent.SetData(Android.Net.Uri.Parse(String.Format("package:%s", new object[] { Application.Context.PackageName })));
                    StartActivityForResult(intent, 2000);
                }
                catch (Exception e)
                {
                    Intent intent = new Intent();
                    intent.SetAction(Android.Provider.Settings.ActionManageAllFilesAccessPermission);
                    StartActivityForResult(intent, 2000);
                }
            }
        }
        //Below Android 11
        else
        {
            if ((ContextCompat.CheckSelfPermission(this, Manifest.Permission.WriteExternalStorage) != (int)Permission.Granted)
            || (ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadExternalStorage) != (int)Permission.Granted))
            {
                ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.ReadExternalStorage, Manifest.Permission.WriteExternalStorage }, 0);
            }
        }
    }

即使我有这个权限,我仍然无法将文件上传到外部存储

我不知道,请帮帮我

【问题讨论】:

  • 我可以创建文件夹,但不能处理文件
  • 显示您的代码。我们不知道您想要什么或尝试过什么。
  • //Below Android 11 11 日你也应该请求并获得它。
  • Android 11 和 12 不需要所有文件权限即可在公共 Documents 目录中创建文件。

标签: c# android xamarin.forms android-11


【解决方案1】:

Android 10 为应用引入了一种新的存储范式,称为范围存储,它改变了应用在设备外部存储上存储和访问文件的方式。如果您以 Android 10(API 级别 29)或更高版本为目标,请在应用的清单文件中将 requestLegacyExternalStorage 的值设置为 true。

<application android:requestLegacyExternalStorage="true" android:label="FormsSample.Android" android:theme="@style/MainTheme"></application>

然后在AndroidManifest.xml

中添加READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE权限

最后,我做了一个示例,将 txt 文件保存在下载文件夹中。

public class MainActivity : AppCompatActivity
{
    private Button btn1;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.activity_main);
        btn1 = FindViewById<Button>(Resource.Id.button1);
        btn1.Click += Btn1_Click;

    }

    private void Btn1_Click(object sender, System.EventArgs e)
    {
        requestpermission();
        CreateFile("test.txt");
    }

    public void CreateFile(string FileName)
    {
        string text = "hello world";
        byte[] data = Encoding.ASCII.GetBytes(text);
        string rootPath = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, Android.OS.Environment.DirectoryDownloads);
        var filePathDir = Path.Combine(rootPath, "folder");
        if (!File.Exists(filePathDir))
        {
            Directory.CreateDirectory(filePathDir);
        }
        string filePath = Path.Combine(filePathDir, FileName);
        File.WriteAllBytes(filePath, data);
    }
    public void requestpermission()
    {
        if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.WriteExternalStorage) != (int)Permission.Granted)
        {
            ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.WriteExternalStorage }, 1);
        }


        if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadExternalStorage) != (int)Permission.Granted)
        {
            ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.ReadExternalStorage }, 1);
        }
    }
    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
    {
        Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

        base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多