Использование Manage_External_Storage с .net Maui

Итак, я создаю приложение для Android с .net Maui, которое считывает XML-файл из папки «Документы» (/storage/emulated/0/Documents). Приложение на 100% способно генерировать собственный XML-файл, чтобы гарантировать его постоянное существование. Однако, если я заменю XML, приложение выйдет из строя с исключением отказа в доступе. Я считаю, что это связано с тем, что я использую разрешения Storage_Read и Storage_Write вместо Manage_External_Storage. Сейчас я ищу обходной путь для получения этого разрешения, поскольку .net maui еще не обновил свою систему разрешений до уровня API 34.

Код, который запрашивает разрешения:

PermissionStatus lReadStatus = await Permissions.RequestAsync<Permissions.StorageRead>();  
PermissionStatus lWriteStatus =await Permissions.RequestAsync<Permissions.StorageWrite>();

Мой Android Manifest.xml:

    <uses-permission android:name = "android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name = "android.permission.MANAGE_DOCUMENTS" />
    <uses-permission android:name = "android.permission.MANAGE_EXTERNAL_STORAGE" />

Можете ли вы предоставить дополнительную информацию, особенно о том, как сохранить XML-файл? Я столкнулся с похожей проблемой, может быть, проверка на мой ответ на вопрос может вам помочь?

GChapX 26.03.2024 16:13

Не позволяйте вашему приложению аварийно завершить работу, перехватив это исключение. Если есть исключение, отобразите тост пользователю, сообщающему об этом.

blackapps 26.03.2024 16:19

Эти разрешения на чтение и запись необходимы только для Android 12 и более ранних версий.

blackapps 26.03.2024 16:20

Разрешение на чтение никогда не работает для файлов, созданных не вашим приложением.

blackapps 26.03.2024 16:20
Manage_External_Storage. I am now Looking for a workaround to geting that permission since .net maui has not yet updated its permission system to API level 34. Управление внешним хранилищем есть начиная с Android 11. Не имеет никакого отношения к SDK 34.
blackapps 26.03.2024 16:22

Используйте платформу доступа к хранилищу, чтобы позволить пользователю выбирать файл. Ни одного разрешения не требуется.

blackapps 26.03.2024 16:23

Пожалуйста, уточните вашу конкретную проблему или предоставьте дополнительную информацию, чтобы выделить именно то, что вам нужно. Поскольку сейчас написано, трудно точно сказать, о чем вы спрашиваете.

Community 26.03.2024 17:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
608
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Чтобы проверить разрешение внешнего хранилища, вы можете использовать собственный код Android. Вот простой пример.

в Платформы -> Android добавьте файл CheckPermissions.cs

namespace CheckPermissionManager
{
    public static class CheckPermission
    {
        public static bool CheckExternalStoragePermission()
        {
            if (Build.VERSION.SdkInt >= BuildVersionCodes.R)
            {
                var result = Android.OS.Environment.IsExternalStorageManager;
                if (!result)
                {
                    var manage = Settings.ActionManageAppAllFilesAccessPermission;
                    Intent intent = new Intent(manage);
                    Android.Net.Uri uri = Android.Net.Uri.Parse("package:" + AppInfo.Current.PackageName);
                    intent.SetData(uri);
                    Platform.CurrentActivity.StartActivity(intent);
                }
                return result;
            }

            return true;
        }
    }
}

затем в любом месте кода:

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }

    private async void OnClicked(object sender, EventArgs e)
    {
#if ANDROID
        CheckPermissionManager.CheckPermission.CheckExternalStoragePermission();
#endif
    }
}

Разрешение можно добавить только вручную со страницы настроек приложения. Приведенный выше код открывает страницу управления внешними разрешениями, если эти разрешения не добавлены.

Сменить его на сервис, вероятно, было бы хорошей идеей.

Вот реализация, которая ожидает завершения активности, а затем проверяет, дал ли пользователь разрешение.

public static class StorageHelper
{
    public const int RequestCode = 2296;
    private static TaskCompletionSource<bool>? GetPermissionTask { get; set; }

    public static async Task<bool> GetManageAllFilesPermission()
    {
        try
        {
            Uri? uri = Uri.Parse("package:" + Platform.CurrentActivity.ApplicationInfo.PackageName);

            GetPermissionTask = new();
            Intent intent = new(global::Android.Provider.Settings.ActionManageAppAllFilesAccessPermission, uri);
            Platform.CurrentActivity.StartActivityForResult(intent, RequestCode);
        }
        catch (Exception ex)
        {
            // Handle Exception
        }

        return await GetPermissionTask.Task;
    }

    public static void OnActivityResult()
    {
        GetPermissionTask?.SetResult(Environment.IsExternalStorageManager);
    }
}

MainActivity.cs

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent? data)
    {
        if (requestCode == StorageHelper.RequestCode)
            StorageHelper.OnActivityResult();

        base.OnActivityResult(requestCode, resultCode, data);
    }

Другие вопросы по теме