来自 Android 文档,https://developer.android.com/training/data-storage/manage-all-files#all-files-access
“应用程序可以通过执行以下操作来请求用户访问所有文件:
在清单中声明MANAGE_EXTERNAL_STORAGE权限。
使用ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION 意图操作将用户引导至系统设置页面,他们可以在其中为您的应用启用以下选项:允许访问管理所有文件。”
我知道如何请求权限的唯一方法是使用ActivityCompat. 我试过了:
ActivityCompat.requestPermissions(this, new String[]{Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION},1);
和
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.MANAGE_EXTERNAL_STORAGE},1);
两者都不做任何事情。
Android 文档内容广泛,但对新手来说并不是最欢迎的。我了解意图,并且知道它们可用于在活动之间切换,但我不知道什么是“意图操作”以及如何使用它来请求权限
shu*_*rg1 20
您可以创建这样的意图:
Intent intent = new Intent(ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, Uri.parse("package:" + BuildConfig.APPLICATION_ID));
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用 startActivityForResult 启动此意图。
final static int APP_STORAGE_ACCESS_REQUEST_CODE = 501; // Any value
startActivityForResult(intent, APP_STORAGE_ACCESS_REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)
在 onActivityResult 方法中,您可以检查用户是否授予您权限。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == APP_STORAGE_ACCESS_REQUEST_CODE && Environment.isExternalStorageManager())
// Permission granted. Now resume your workflow.
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以通过使用新的 ActivityResultAPI 启动活动来执行此操作:
// Initialize the variable in before activity creation is complete.
val storagePermissionResultLauncher = registerForActivityResult(StartActivityForResult(),
ActivityResultCallback<ActivityResult?> {
if (Environment.isExternalStorageManager())
{
// Permission granted. Now resume your workflow.
}
})
// launch the above intent.
storagePermissionResultLauncher.launch(intent)
Run Code Online (Sandbox Code Playgroud)
另外,请确保在 AndroidManifest.xml 中添加此权限条目。
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" />
Run Code Online (Sandbox Code Playgroud)
小智 19
如果在 Intent 中使用 Uri,则可以使用 Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION 代替 Settings.ACTION_MANAGE_ALL_FILES_ACCESS_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();
}
Run Code Online (Sandbox Code Playgroud)
}
在科特林:
val uri = Uri.parse("package:${BuildConfig.APPLICATION_ID}")
startActivity(
Intent(
Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION,
uri
)
)
Run Code Online (Sandbox Code Playgroud)
(来自这个示例项目)
您可能已经习惯了隐式Intent( Intent(this, SomeActivity::class.java))。文档要求您使用显式Intent, 带有操作字符串的,在本例中为Uri. 在Uri将有package计划,并通过应用ID识别您的应用程序。
该代码片段将启动系统提供的活动,理论上,该活动将让用户选择授予您的应用程序MANAGE_EXTERNAL_STORAGE权限。
Android 文档很广泛,但对新手来说并不是最欢迎的
您可能希望考虑阅读一本书或参加一门课程。任何像样的书或课程都会涵盖Intent行动的概念。
| 归档时间: |
|
| 查看次数: |
5205 次 |
| 最近记录: |