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