您如何在 Android 中请求 MANAGE_EXTERNAL_STORAGE 权限?

Chr*_*s A 5 android

来自 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)

}


Com*_*are 8

在科特林:

    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行动的概念。

  • 抱歉,我看错了。我以为你创建了一个全新的项目。再次阅读它是最初链接的项目,但是一个新的模拟器。我注意到您的应用使用了“ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION”,而不是“ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION”。我在我的应用程序中更改了它,它很有魅力:) (2认同)
  • 将“Bu​​ildConfig.APPLICATION_ID”替换为“BuildConfig.LIBRARY_PACKAGE_NAME”,因为“APPLICATION_ID”已弃用 (2认同)