You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android 11 Package Visibility问题:无法启动下载APK的安装流程

Android 11预览版4无法触发APK安装流程的问题排查与解决

从你的描述和代码来看,这个问题大概率是Android 11包可见性规则+文件URI适配问题,而非系统Bug,下面一步步分析并给出解决方案:

1. 核心问题:Android 11下file:// URI不再被安装器接收,StrictMode hack失效

在Android 7.0(API 24)及以上,官方就明确推荐用FileProvider生成content://类型的URI来替代file://,你之前注释掉的那部分FileProvider代码才是正确的方向。而你用StrictMode.disableDeathOnFileUriExposure绕过限制的方式,在Android 11上已经完全失效——系统对安装器的包可见性和URI接收规则做了更严格的限制,file:// URI无法再被系统安装器识别,直接导致ActivityNotFoundException

2. 修复步骤:

步骤一:恢复并正确配置FileProvider

  1. 删掉StrictMode相关的hack代码,取消注释FileProvider的代码块;
  2. AndroidManifest.xml<application>标签内添加FileProvider配置:
<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>
  1. res/xml目录下创建file_paths.xml文件,配置你的APK存放路径(对应代码里的pathname路径):
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 对应你代码里的/storage/emulated/0/Android/data/x.x.x/files/ApkDownload/路径 -->
    <external-files-path name="apk_download" path="ApkDownload/" />
</paths>
  1. 修改callInstallProcess方法里的FileProvider调用,注意authorities要和Manifest里的一致:
fileUri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", file);

步骤二:优化包可见性配置

你已经添加了<queries>标签,可以再补充系统安装器的包名查询,确保应用能“看到”这个系统组件:

<queries>
    <intent>
        <action android:name="android.intent.action.VIEW" />
        <data android:mimeType="application/vnd.android.package-archive" />
    </intent>
    <!-- 直接指定系统安装器包名,强化可见性 -->
    <package android:name="com.android.packageinstaller" />
</queries>

步骤三:添加Intent有效性校验

启动Intent前先判断是否有可用的Activity处理,避免崩溃:

// 先校验Intent是否可被处理
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivityForResult(intent, PERMISSIONS_REQUEST);
} else {
    // 提示用户当前没有可用的APK安装器
}

3. 为什么Chrome可以正常工作?

Chrome作为系统级应用,本身拥有更高的权限和专属的系统适配接口,它的APK安装流程不受普通应用的包可见性和URI规则限制,所以能正常触发安装。

按上面的步骤修复后,你的应用应该就能在Android 11预览版4的模拟器上正常启动APK安装流程了。

内容的提问来源于stack exchange,提问作者saksham

火山引擎 最新活动