您如何在Android中请求管理外部存储权限?

您如何在Android中请求管理外部存储权限?,android,Android,从Android文档中 “应用程序可以通过执行以下操作请求用户访问所有文件: 在清单中声明管理外部存储的权限 使用“意图”操作将用户引导到系统设置页面,用户可以在该页面上为应用程序启用以下选项:允许访问管理所有文件。“ 我试过的 我知道如何请求权限的唯一方法是使用ActivityCompat。我试过: ActivityCompat.requestPermissions(这个新字符串[]{Settings.ACTION\u MANAGE\u ALL\u FILES\u ACCESS\u PERMI

从Android文档中

“应用程序可以通过执行以下操作请求用户访问所有文件:

在清单中声明管理外部存储的权限

使用“意图”操作将用户引导到系统设置页面,用户可以在该页面上为应用程序启用以下选项:允许访问管理所有文件。“

我试过的 我知道如何请求权限的唯一方法是使用
ActivityCompat
。我试过:

ActivityCompat.requestPermissions(这个新字符串[]{Settings.ACTION\u MANAGE\u ALL\u FILES\u ACCESS\u PERMISSION},1)

ActivityCompat.requestPermissions(这个新字符串[]{Manifest.permission.MANAGE_EXTERNAL_STORAGE},1)

他们两个都不做任何事

Android文档非常广泛,但对新手来说并不那么受欢迎。我了解意图,知道它们可以用于在活动之间切换,但我不知道什么是“意图操作”,以及如何在Kotlin中使用它来请求权限

    val uri = Uri.parse("package:${BuildConfig.APPLICATION_ID}")

    startActivity(
      Intent(
        Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION,
        uri
      )
    )
(来自)

您可能已经习惯了隐式的
Intent
Intent(this,SomeActivity::class.java)
)。文档要求您使用一个显式的
意图
,一个带有操作字符串,在本例中是一个
Uri
Uri
将具有
方案,并通过应用程序ID识别您的应用程序

该代码片段将启动系统提供的活动,理论上,该活动将允许用户选择授予您的应用程序“管理外部存储”权限

Android文档非常广泛,但并不完全是最受新用户欢迎的


你可能会考虑读一本书或修一门课程。任何一本像样的书或课程都将涵盖
意图
操作的概念。

1您是否在AndroidManifest.xml中添加了使用权限? 比如:


2您可以参考此github库:

它包装了google sdk的api,并提供了一种简单的应用权限的方法。

如果在Intent中使用Uri,则可以使用Settings.ACTION\u MANAGE\u APP\u ALL\u FILES\u ACCESS\u PERMISSION代替Settings.ACTION\u MANAGE\u ALL\u FILES\u ACCESS\u PERMISSION

if(SDK_INT >= 30){
if(!Environment.isExternalStorageManager()){
    Snackbar.make(findViewById(android.R.id.content), "Permission needed!", Snackbar.LENGTH_INDEFINITE)
            .setAction("Settings", new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    try {
                        Uri uri = Uri.parse("package:" + BuildConfig.APPLICATION_ID);
                        Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, uri);
                        startActivity(intent);
                    } catch (Exception ex){
                        Intent intent = new Intent();
                        intent.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
                        startActivity(intent);
                    }
                }
            })
            .show();
}

}

1。我按照文档2中的规定管理外部存储。我都看不懂哦,也许它的自述是中文的。但是你可以试着用谷歌翻译。它为Android 11中的权限提供了一种更简单的方式,您可以直接检查代码。你也可以在github中找到其他android权限库。我一直在学习关于android的Udemy课程,其中涵盖了意图,但不是以这种方式。我尝试了
urifoo=Uri.parse(“包:”+BuildConfig.APPLICATION\u ID);startActivity(新意图(Settings.ACTION\u MANAGE\u ALL\u FILES\u ACCESS\u PERMISSION,foo))
并得到一个致命错误,
原因是:android.content.ActivityNotFoundException:找不到处理意图的活动{act=android.settings.MANAGE\u ALL\u FILES\u ACCESS\u PERMISSION dat=package:com.example.storagecleaner}
@ChrisA:Udemy没有涵盖隐式
意图,这让人相当失望。关于崩溃,隐式的
意图可能与可用的活动不匹配,因此可能会发生此崩溃。包装您的
startActivity()
调用
try
/
catch
并优雅地处理异常将是必需的。另外,请注意,此权限和
意图
操作仅在Android 11+上相关,因此在Android 10及以下版本上肯定会失败。如果你在安卓11上进行测试,你测试的设备品牌和型号是什么?我的AVD是API 29(安卓10)。然后我尝试了API 30(在某些地方被混淆地标记为10+,在其他地方被标记为11)。Nexus6API30。还是一样吗error@ChrisA:我刚刚安装了一个全新的Android 11/API 30模拟器,我的示例应用程序将毫无问题地启动此活动(如果运行该应用程序,请单击“无限符号”工具栏按钮)。因此,我不确定你的应用程序或仿真器有什么不同导致了问题。我也从零开始,只是在清单中添加了权限,以及我在中的第一条评论中的行。没有骰子。你能在Git上分享整个项目吗?只是为了让我排除代码,并将其缩小到一个配置/仿真器问题。(我没有看到无限符号,只有绿色的“播放”按钮可以运行)
if(SDK_INT >= 30){
if(!Environment.isExternalStorageManager()){
    Snackbar.make(findViewById(android.R.id.content), "Permission needed!", Snackbar.LENGTH_INDEFINITE)
            .setAction("Settings", new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    try {
                        Uri uri = Uri.parse("package:" + BuildConfig.APPLICATION_ID);
                        Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, uri);
                        startActivity(intent);
                    } catch (Exception ex){
                        Intent intent = new Intent();
                        intent.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
                        startActivity(intent);
                    }
                }
            })
            .show();
}