尝试以编程方式请求权限时未找到处理 Intent 的 Activity
Posted
技术标签:
【中文标题】尝试以编程方式请求权限时未找到处理 Intent 的 Activity【英文标题】:No Activity found to handle Intent when trying to programmatically ask for permissions 【发布时间】:2021-11-26 10:58:36 【问题描述】:我需要获得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);
以及我在尝试打开意图时遇到的错误:
android.content.ActivityNotFoundException: No Activity found to handle Intent act=android.settings.MANAGE_ALL_FILES_ACCESS_PERMISSION
错误来自 catch 块,但 Exception ex
给出了相同的错误。
我做错了什么,或者我正在使用的当前手机(XCover 4s Android 10)上不允许这样做。
【问题讨论】:
catch (Exception ex)
您没有打印堆栈跟踪,也没有记录 ex.getMessage()。那你知道什么?
the error that I get when trying to open intent:
那是在尝试第二个意图时。
need to get the MANAGE_ALL_FILES_ACCESS_PERMISSION to be able to download and install APK's from my application.
我对此表示怀疑。不用我想你也可以做这样的事情。
I am using (XCover 4s).
但不告诉该设备的 Android 版本。
一般来说,设备制造商不需要支持所有可能的Settings
Intent
操作。所以,我的猜测是您的设备不支持那些所有文件权限Intent
操作。
【参考方案1】:
获得对我有用的存储权限的答案。
我不得不更改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
【讨论】:
以上是关于尝试以编程方式请求权限时未找到处理 Intent 的 Activity的主要内容,如果未能解决你的问题,请参考以下文章
未找到处理 Intent 的活动 - android.intent.action.OPEN_DOCUMENT
未找到处理 Intent act=android.media.action.IMAGE_CAPTURE 的 Activity
未找到处理 Intent act=com.android.camera.action.CROP 的 Activity