尝试以编程方式请求权限时未找到处理 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 版本。 一般来说,设备制造商不需要支持所有可能的SettingsIntent操作。所以,我的猜测是您的设备不支持那些所有文件权限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

未找到处理 Intent com.instagram.share.ADD_TO_STORY 的活动

未找到使用有效 url 处理 Intent 错误的活动