问题
Unity 游戏项目在进行大版本更新时,会自动下载apk,然后调用安装apk。然而,在安卓系统7+上调用安装apk没任何反应,查看日志为:
android.os.FileUriExposedException: file:///storage/emulated/0/xxx.apk exposed beyond app through Intent.getData()
原因
在安卓系统7+上为了安全性,限制了文件路径,官方文档说明如下:
传递软件包网域外的 file:// URI 可能给接收器留下无法访问的路径。因此,尝试传递 file:// URI 会触发 FileUriExposedException。分享私有文件内容的推荐方法是使用 FileProvider。
解决
FileProvider 方式
尝试使用FileProvider的方式来解决问题,发现始终还是无法成功调用安装apk,查看日志为:
java.lang.NullPointerException: Attempt to invoke virtual method ‘android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)’ on a null object reference: com.xx.xxx
检验配置无错,xml文件也放置在aar库里,authorities属性也是直接匹配得上。
禁用检查方式
另寻其他方法,有可以通过反射来禁用系统进行检查,详见:https://stackoverflow.com/a/42437379
在库的onCreate方法里,添加如下代码:
if(Build.VERSION.SDK_INT>=24){
try{
Method m = StrictMode.class.getMethod("disableDeathOnFileUriExposure");
m.invoke(null);
}catch(Exception e){
e.printStackTrace();
}
}
经测试,在安卓7,安卓8,安卓9成功。