尝试以编程方式请求权限时,未找到 Activity 处理 Intent

No Activity found to handle Intent when trying to programmatically ask for permissions

我需要获取 MANAGE_ALL_FILES_ACCESS_PERMISSION 才能从我的应用程序下载和安装 APK。
当我以 SDK 27 及更低版本为目标时,一切正常,当我声明

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

在清单中并使用 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);

请求许可

但现在我需要以 SDK 30 为目标,这意味着 WRITE_EXTERNAL_STORAGE 已弃用并且不适用于 API 版本 29 和 30。

我一直在努力寻找解决方法,我能想到的是启动 Intent 以允许用户自行打开权限,但我无法让它工作。

我使用的代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    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);
    }
} else {
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
            100);
}

以及我在尝试打开 intent 时遇到的错误:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.settings.MANAGE_ALL_FILES_ACCESS_PERMISSION }

错误来自 catch 块,但 Exception ex 给出了相同的错误。

我做错了什么,或者这在我正在使用的当前 phone 上是不允许的 (XCover 4s Android 10)。

获得对我有用的存储权限的答案。

我不得不更改 Manifest.permission. strings 所以我使用的不是问题中写的内容。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    ActivityCompat.requestPermissions(
            activity,
            new String[]{
                    Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.MANAGE_EXTERNAL_STORAGE
            },
            1
    );
} else {
    ActivityCompat.requestPermissions(activity,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
            100);
}

或者类似地可以这样使用:

if (ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}

if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}

然后得到允许用户安装的提示 Apps from unkown sources :

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    if (!activity.getPackageManager().canRequestPackageInstalls()) {
        activity.startActivityForResult(new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES).setData(Uri.parse(String.format("package:%s", activity.getPackageName()))), 1234);
    } else {
    }
}