玄学Bug某些手机某些应用上出现
今天在开发的过程中发现了一个神奇的Bug。就是当APK下载完成后调起系统安装时出现解析包时出现错误。
而相同的代码在项目B中是好的,到了项目A中就出现了,而项目A部署在A手机中是好的而B手机中就出现了。
![](https://img.haomeiwen.com/i5417336/3601cfce34593e44.png)
下面是出现问题的代码(调起系统安装Apk的代码)
public static boolean installApk(Context context, File apkFile) {
if (apkFile == null || !apkFile.exists()) {
return false;
}
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addCategory("android.intent.category.DEFAULT");
// 判断版本大于等于7.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// 给目标应用一个临时授权
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri uri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".fileProvider", apkFile);
intent.setDataAndType(uri, context.getContentResolver().getType(uri));
} else {
intent.setDataAndType(Uri.fromFile(apkFile), getIntentType(apkFile));
}
context.startActivity(intent);
try {
android.os.Process.killProcess(android.os.Process.myPid());
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
有人说是intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)的问题,还有人说是intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)的问题,还有人说是killProcess导致的。
我都试过了,根本没有解决。
最后终于在stackoverflow上找到了解决方案,就是添加下面的代码。
List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
context.grantUriPermission(resolveInfo.activityInfo.packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
最终的代码:
public static boolean installApk(Context context, File apkFile) {
if (apkFile == null || !apkFile.exists()) {
return false;
}
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addCategory("android.intent.category.DEFAULT");
// 判断版本大于等于7.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// 给目标应用一个临时授权
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri uri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".fileProvider", apkFile);
intent.setDataAndType(uri, context.getContentResolver().getType(uri));
List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
context.grantUriPermission(resolveInfo.activityInfo.packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
} else {
intent.setDataAndType(Uri.fromFile(apkFile), getIntentType(apkFile));
}
context.startActivity(intent);
try {
android.os.Process.killProcess(android.os.Process.myPid());
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
由于这个问题比较坑爹所以在这里记录一下,也许能帮到跟我一样倒霉的人。
网友评论