烦恼一般都是想太多了。

0%

安卓9.0应用内升级失败的一种情况解决

本来应用内升级一切工作良好。但是在换了新设备,安卓9.0,华为机型后,突然就出现了死活更新不了的问题。首先的问题是总是提示更新失败请重试。通过调试代码发现问题所在。

错误代码

onError: 
android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

意思就是 如果是在 Activity 上下文中调用 startActivity() 方法的话,需要设置 FLAG_ACTIVITY_NEW_TASK 标志。

追踪一下我们的代码,启动安装新 apk 包的地方。

private void startInstallApk() {
myBinder.cancelDownload();
//apk文件的本地路径
File apkfile = new File(filePath);
//会根据用户的数据类型打开android系统相应的Activity。
Intent intent = new Intent(Intent.ACTION_VIEW);
//设置intent的数据类型是应用程序application
//判读版本是否在7.0以上
if (Build.VERSION.SDK_INT >= 24) {
Uri apkUri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", apkfile);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
} else {
//为这个新apk开启一个新的activity栈
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");
}
//开始安装
startActivity(intent);
//关闭旧版本的应用程序的进程
android.os.Process.killProcess(android.os.Process.myPid());
}

代码中只有在 24 以下才添加了这个标志。OK,那么我们把这个标志加上。

为什么在我小米的 8.1 系统上正常?

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

继续编译看看是否能够更新了,此时我的 小米8.1 运行也正常,但是依然还不可以:

Writing exception to parcel
java.lang.SecurityException: Permission Denial: reading android.support.v4.content.FileProvider uri content://cn.nanming.smart.fileprovider/root_path/storage/emulated/0/Android/data/cn.nanming.smartenterprise/cache/smartEnterprise_4.4.114.apk from pid=27641, uid=10054 requires the provider be exported, or grantUriPermission()

这下读取我们下载包的请求又被拒绝了。这怎么破?

根据 官方文档,我们需要临时进行授权,StackOverFlow 上也有这个问题的解答

grantUriPermission(getPackageName(),apkUri,Intent.FLAG_GRANT_READ_URI_PERMISSION);

最终:发觉我们的下载路径,并不是放在 provider 里面的,采用 Uri.fromFile 的形式能够正常执行升级了。

为什么后面又没有出现第二个问题了?这个问题很苦恼啊。