【问题标题】:No Activity found to handle Intent when trying to programmatically ask for permissions尝试以编程方式请求权限时未找到处理 Intent 的 Activity
【发布时间】: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 操作。

标签: java android android-intent android-manifest android-permissions


【解决方案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 {
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 2012-02-20
    • 2021-03-09
    相关资源
    最近更新 更多