首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在安卓系统中申请MANAGE_EXTERNAL_STORAGE许可?

如何在安卓系统中申请MANAGE_EXTERNAL_STORAGE许可?
EN

Stack Overflow用户
提问于 2021-01-24 22:34:20
回答 5查看 24.7K关注 0票数 17

来自Android,https://developer.android.com/training/data-storage/manage-all-files#all-files-access

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

在清单中声明MANAGE_EXTERNAL_STORAGE权限。

使用https://developer.android.com/reference/android/provider/Settings#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文档非常广泛,但并不是最受新用户欢迎的。我理解意图,并知道它们可以用于在活动之间切换,但我不知道“意图操作”是什么以及如何使用它来请求权限

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2021-01-24 23:00:08

在科特林:

代码语言:javascript
复制
    val uri = Uri.parse("package:${BuildConfig.APPLICATION_ID}")

    startActivity(
      Intent(
        Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION,
        uri
      )
    )

(来自此示例项目)

您可能已经习惯了隐式Intent。文档要求您使用一个显式Intent,其中一个带有动作字符串,在本例中是一个UriUri将拥有package方案,并通过应用程序ID标识应用程序。

该代码片段将启动一个系统提供的活动,理论上,该活动将允许用户选择授予您的应用程序MANAGE_EXTERNAL_STORAGE权限。

票数 13
EN

Stack Overflow用户

发布于 2021-04-24 01:34:32

如果打算使用Uri,则可以使用Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION而不是Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION.。

代码语言:javascript
复制
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();
}

}

票数 15
EN

Stack Overflow用户

发布于 2021-06-28 19:21:16

您可以创建这样的意图:

代码语言:javascript
复制
Intent intent = new Intent(ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, Uri.parse("package:" + BuildConfig.APPLICATION_ID));

现在,您可以使用startActivityForResult启动此意图。

代码语言:javascript
复制
final static int APP_STORAGE_ACCESS_REQUEST_CODE = 501; // Any value
startActivityForResult(intent, APP_STORAGE_ACCESS_REQUEST_CODE);    

在onActivityResult方法中,可以检查用户是否授予了权限。

代码语言:javascript
复制
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == RESULT_OK && requestCode == APP_STORAGE_ACCESS_REQUEST_CODE)
    {
        if (Environment.isExternalStorageManager())
        {
            // Permission granted. Now resume your workflow.
        }

    }
}

您还可以使用新的ActivityResultAPI通过以下方式启动该活动:

代码语言:javascript
复制
// 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)

此外,请确保在AndroidManifest.xml中添加此权限项。

代码语言:javascript
复制
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" />
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65876736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档