尝试以编程方式请求权限时,未找到 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 {
}
}
我需要获取 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 {
}
}