You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 13中ACTION_VIEW意图是否失效?应用更新安装方案咨询

Android 13 下应用更新安装适配方案

关于ACTION_VIEW的弃用问题

不是必须弃用ACTION_VIEW,你的代码在SDK33下失效主要是两个原因:Android 13新增了安装未知应用的权限要求,以及高版本系统对文件URI的限制。

适配步骤

  1. 添加安装权限到Manifest
    在AndroidManifest.xml中声明权限:
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
  1. 动态申请安装权限(Android 8.0及以上)
    Android 8.0(API26)开始,安装未知来源应用需要用户手动授权,Android 13进一步强化了这个权限,必须在运行时检查并引导用户开启:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    if (!packageManager.canRequestPackageInstalls()) {
        val intent = Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES)
            .setData(Uri.parse("package:$packageName"))
        startActivity(intent)
        return
    }
}
  1. 使用FileProvider生成合法的Content URI
    从Android 7.0(API24)开始,直接使用file:// URI会抛出FileUriExposedException,必须改用FileProvider生成content://格式的URI:
  • 首先在Manifest中配置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>
  • 在res/xml目录下创建file_paths.xml文件,配置你存放APK的目录(示例为应用外部文件目录,可根据实际路径调整):
<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-files-path name="external_files" path="." />
    <!-- 如果APK存放在公共Download目录,添加以下配置:
    <external-public-path name="downloads" path="Download/" /> -->
</paths>
  1. 修改安装逻辑代码
    整合权限检查和URI生成,最终的openNewVersion方法如下:
private fun Context.openNewVersion(location: String) {
    val apkFile = File(location)
    if (!apkFile.exists()) {
        // 处理文件不存在的情况
        return
    }

    // 检查安装权限
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        if (!packageManager.canRequestPackageInstalls()) {
            val intent = Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES)
                .setData(Uri.parse("package:$packageName"))
            startActivity(intent)
            return
        }
    }

    // 生成适配不同版本的URI
    val apkUri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        FileProvider.getUriForFile(this, "${packageName}.fileprovider", apkFile)
    } else {
        Uri.fromFile(apkFile)
    }

    // 启动安装Intent
    val intent = Intent(Intent.ACTION_VIEW).apply {
        setDataAndType(apkUri, "application/vnd.android.package-archive")
        addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
    }

    startActivity(intent)
}

替代方案说明

如果你不想用ACTION_VIEW,Android 13也支持ACTION_INSTALL_PACKAGE,但该Intent需要INSTALL_PACKAGES权限,这个权限仅授予系统应用,第三方应用无法获取,所以ACTION_VIEW仍是第三方应用实现应用更新安装的最优选择。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 09:35:26