项目内提示升级的时候,有部分华为用户报下载完APP后应用闪退。赶紧找机型复现了下,报错信息如下:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.qding.guanjia, PID: 30428
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file:///storage/emulated/0/Android/data/***包名****/files/download/test.apk typ=application/vnd.android.package-archive flg=0x10000000 }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2113)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1739)
at android.app.Activity.startActivityForResult(Activity.java:5343)
at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:68)
at android.app.Activity.startActivityForResult(Activity.java:5284)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:751)
基本能定位到代码里覆盖安装的问题,我们原来覆盖安装的代码如下:
public static void install(Context mContext, String filepath) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(new File(filepath)), "application/vnd.android.package-archive");
mContext.startActivity(intent);
}
解决方法,Android7.0以后访问手机内文件的时候要使用FileProvider的方式:
public static void install(Context mContext, String filepath) {
Intent intent = new Intent(Intent.ACTION_VIEW);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Uri apkUri = FileProvider.getUriForFile(mContext, "包名.FileProvider", new File(filepath));
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(new File(filepath)), "application/vnd.android.package-archive");
}
mContext.startActivity(intent);
}
如上,问题解决。