最近在做app自动更新,遇到了一些问题。在as的自带模拟器中运行没有问题,放到手机上就出现了问题。原本的安装apk的代码如下:
protected void installApk(File file) {
Uri uri = FileProvider.getUriForFile(context, "com.gzairports.xxbjkb.gza_fids.fileprovider", file);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
//执行的数据类型
intent.setDataAndType(uri, "application/vnd.android.package-archive");
context.startActivity(installIntent);
LogUtil.writeLogtoFile(LogType.LOG_TYPE_INFO, LogType.LOG_SOURCE_APP,"安装完成!");
LoginMain();
}
传入的file参数是下载得到的文件
查询了很多大佬的解释,决定在下载完成之后从本地目录获取file,进行安装。
修改代码:
file = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS + "/update.apk");
String path = file.getAbsolutePath();
Uri downloadFileUri = Uri.parse("file://" + path);
Intent installIntent=new Intent(Intent.ACTION_VIEW);
installIntent.setDataAndType(downloadFileUri, "application/vnd.android.package-archive");
installIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
主要是将file从下载的路径中获取,并在进行Uri转换的时候加上file://头。
发现可以没有报错了,但是出现了安装的时候:解析安装包时出现问题,直接安装是没问题的。就是通过更新就安装不了。。。。。哭
好吧,继续查资料,有的说是文件权限的问题,但是我的安卓版本是5.0的。以为不是这个问题,但是我发现自己开发的编译版本等都是26.所以还是试一下。通过比较版本的方式选择不同的Uri获取方式。
修改后代码如下:
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Intent.ACTION_VIEW);
if (Build.VERSION.SDK_INT >= 24) {
Uri apkUri = FileProvider.getUriForFile(context, "com.gzairports.xxbjkb.gza_fids.fileprovider", file);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
} else {
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
}
context.startActivity(intent);
发不上去一试,完美搞定。下一次把整个apk更新的代码和过程发布上来。刚开始搞安卓,很多原理上的东西还一知半解,很多都是借鉴的。