Android 请求外部存储读写权限一直返回Denied

思密达 100 信誉分
2025-01-13T09:01:14.5166667+00:00

测试环境:.net8 android api 33,权限的弹窗没弹出,默认返回的Denied,怎么解决,这个android版本是不支持吗。

 
		public static async Task<PermissionStatus> CheckAndRequestStorageWritePermission ()
        {
            var status = await Permissions.CheckStatusAsync<Permissions.StorageWrite>();

            if ( status != PermissionStatus.Granted )
            {
                status = await Permissions.RequestAsync<Permissions.StorageWrite>();
            }

            return status;
        }
//> Page.cs
//> 业务逻辑
        public async void Initialized ()
        {
            string workerspaceRoot = Path.Combine(StorageDirectory,"测试目录");
            if ( !Directory.Exists(workerspaceRoot) )
            {
                var status = await PermissionsMgr.CheckAndRequestStorageWritePermission();
                if ( status == PermissionStatus.Unknown )
                {
                    //> 用户拒绝权限
                    Console.WriteLine("用户拒绝权限");
                }
                else
                {
                    // 创建目录
                    Directory.CreateDirectory(workerspaceRoot);
                }
            }
        }
.NET MAUI
.NET MAUI
一种 Microsoft 开源框架,用于构建跨移动设备、平板电脑、台式机的原生设备应用程序。
130 个问题
{count} 票

接受的答案
  1. Leon Lu (Shanghai Wicresoft Co,.Ltd.) 79,781 信誉分 Microsoft 供应商
    2025-01-14T02:00:13.2266667+00:00

    https://developer.android.com/training/data-storage/manage-all-files#all-files-access-google-play

    你好,

    从Android12 以及以上版本,你将不能从赋予app StorageWrite 权限进而访问外部存储。 您可以 打开 AndroidManifest.xml 并添加 <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> 权限.

    然后在代码中使用条件编译 去调用Android 平台的代码,弹出一个Snackbar, 让用户点击设置,去赋予MANAGE_EXTERNAL_STORAGE 权限

    private void OnCounterClicked(object sender, EventArgs e)
            {
    #if ANDROID
                var activity=Platform.CurrentActivity;
                if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.R)
                {
                    if (!Android.OS.Environment.IsExternalStorageManager)
                    {
                        Google.Android.Material.Snackbar.Snackbar.Make(activity.FindViewById(Android.Resource.Id.Content), "Permission needed!", Google.Android.Material.Snackbar.Snackbar.LengthIndefinite)
                                .SetAction("Settings", new MyClickHandler()).Show();
                    }
     
                }
    #endif
            }
    

    接下来,你需要为 SnackBar 实现 Android.Views.View.IOnClickListener 接口。它将打开应用程序设置页面;用户需要授予管理器外部权限。

    #if ANDROID
        internal class MyClickHandler : Java.Lang.Object, Android.Views.View.IOnClickListener
        {
    
    public void OnClick(Android.Views.View v)
            {
                try
                {
     
                    Android.Net.Uri uri = Android.Net.Uri.Parse("package:" + Platform.CurrentActivity.ApplicationInfo.PackageName);
                   Android.Content.Intent intent = new Android.Content.Intent(Android.Provider.Settings.ActionManageAppAllFilesAccessPermission, uri);
                    Platform.CurrentActivity.StartActivity(intent);
                }
                catch (Exception ex)
                {
                    Android.Content.Intent intent = new Android.Content.Intent();
                    intent.SetAction(Android.Provider.Settings.ActionManageAppAllFilesAccessPermission);
                    Platform.CurrentActivity.StartActivity(intent);
                }
            }
        }
     
    #endif
    

    你可以参考这篇的Google文档

    如果你带不开上面的文档,这是文档的截图

    enter image description here

    如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。

    注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。


0 个其他答案

排序依据: 非常有帮助

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。