android - 尝试以编程方式安装 APK 时出错
问题描述
在此之后,我下载后安装 apk 的代码是:
var downloadIntent: Intent;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
val apkFile = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "update.apk")
val contentUri = FileProvider.getUriForFile(appContext, "${activity?.packageName}.fileprovider", apkFile)
downloadIntent = Intent(Intent.ACTION_INSTALL_PACKAGE)
downloadIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
downloadIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
downloadIntent.setDataAndType(contentUri, "application/vnd.android.package-archive")
}
appContext.startActivity(downloadIntent);
这是清单:
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
...
<provider
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true"
android:name="androidx.core.content.FileProvider">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
结果是包安装程序静默停止。
解决方案
感谢@Selvin,标志必须像这样设置:
downloadIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION
推荐阅读
- spring - 在 kotlin 中转换为未知类型时杰克逊 IntelliJ 错误
- typescript - 扩展类型以创建子类型
- python-3.x - 如何从 datetime.timedelta 中提取秒数
- docker - Docker 中的 IdentityServer4 + MVC 客户端
- macos - 在 MAC OS 中将音频数据从应用程序路由到虚拟音频驱动程序
- vue.js - vue-utils 在 keydown 事件后获取模型的值
- javascript - React Hooks:在钩子组件的子组件之间传递状态的最佳实践
- android - Flutter:通过调用 STF 小部件将变量从一个页面发送到另一个页面
- angular - 离子项问题
- dart - 值可以为“空”的表达式必须先进行空检查,然后才能取消引用