Android 13中ACTION_VIEW意图是否失效?应用更新安装方案咨询
Android 13 下应用更新安装适配方案
关于ACTION_VIEW的弃用问题
不是必须弃用ACTION_VIEW,你的代码在SDK33下失效主要是两个原因:Android 13新增了安装未知应用的权限要求,以及高版本系统对文件URI的限制。
适配步骤
- 添加安装权限到Manifest
在AndroidManifest.xml中声明权限:
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
- 动态申请安装权限(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 } }
- 使用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>
- 修改安装逻辑代码
整合权限检查和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
相关产品推荐
相关产品推荐

