Unity 在安卓7+以上调用安装apk

814 阅读1分钟

问题

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属性也是直接匹配得上。

禁用检查方式

另寻其他方法,有可以通过反射来禁用系统进行检查,详见: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成功。