换了Android8.1.0的调试机后,发现先前(6.0)做的自动升级功能在安装APK时会出现“java.lang.NullPointerException Attempt to invoke virtual method 'android.content.res.XmlResourcePars”异常。后百度解释是Android7.0及以上版本对隐私权限进行了修改,app内使用的uri不能用intent提供给外部使用,否则会报这个异常。
解决方案
1.在AndroidManifest.xml中的application节点里添加共享文件的设置
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="程序包名.provider"
android:grantUriPermissions="true"
android:exported="false"
>
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
2.安装apk
if (Build.VERSION.SDK_INT>=24){
String packName=BluetoothContext.pIns.appContext.getPackageName();
Uri apkUri = FileProvider.getUriForFile(BluetoothContext.pIns.appContext, packName+".provider", apkfile);
Intent install = new Intent(Intent.ACTION_VIEW);
install.addCategory(Intent.CATEGORY_DEFAULT);
install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
install.setDataAndType(apkUri, "application/vnd.android.package-archive");
mContext.startActivity(install);
} else {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setType("application/vnd.android.package-archive");
intent.setData(Uri.fromFile(apkfile));
intent.setDataAndType(Uri.fromFile(apkfile), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}