IsExternalStorageManager == верно, но доступ к внешнему хранилищу запрещен (Android 11)

#c# #android #xamarin.forms #android-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);
            }
        }
    }
 

Даже если у меня есть это разрешение, я все равно не могу загружать файлы во внешнее хранилище
введите описание изображения здесь

У меня нет идей, пожалуйста, помогите мне

Комментарии:

1. Я могу создавать папки, но я не могу работать с файлами

2. Покажите свой код. Мы понятия не имеем, чего вы хотите или пытались.

3. //Below Android 11 Вы должны запросить и получить это тоже за 11.

4. Вам не нужно разрешение на все файлы для Android 11 и 12, чтобы создавать файлы в каталоге общедоступных документов.

Ответ №1:

Android 10 представил новую парадигму хранения для приложений под названием хранилище с областью действия, которая изменяет способ хранения приложений и доступа к файлам на внешнем хранилище устройства. Если вы нацелены на Android 10 (уровень API 29) или выше, установите значение requestLegacyExternalStorage равным true в файле манифеста вашего приложения.

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

Затем добавьте разрешение READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE в AndroidManifest.xml

Наконец, я делаю один пример, чтобы сохранить файл 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);
    }
}
}