android 尝试以编程方式请求权限时未找到用于处理Intent的Activity

xienkqul  于 2023-01-11  发布在  Android
关注(0)|答案(2)|浏览(152)

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

<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给出了相同的错误。
我做错了什么,或者这只是不允许在目前的手机我正在使用(XCover 4S Android 10).

1qczuiv0

1qczuiv01#

得到存储许可的答案对我很有效。
我不得不更改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 {
    }
}
olmpazwi

olmpazwi2#

当我试图导航用户直接在应用程序屏幕上启用所有文件访问权限时,我遇到了这个问题。
这个问题的解决方案是添加包名,如下所示:

val storageIntent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION,
                    Uri.parse("package:$packageName"))

相关问题