Android7.0开始,uri不能直接传递文件名,需要使用FileProvider,常见的异常就是,原先在低api版本下正常的程序,升级到api26及以上时,图片分享,文字分享,程序下载更新后的启动安装,都会出错,比如出现 ava.lang.nullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.PackageInfo.LoadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object referance 或者提示 android os. FileUriExposed Exception
file: ///storage/emulated/0/Android
/data/com xxx. xxx
/files/123. jpg exposed beyond app
through Clip Data Item. getUri() 之类的错误。
那么我们可以勾选 option里面的 entitlement list 下的 Secure File Sharing 选项。
如果是新建项目,这没问题。但如果你是老项目用xe10.3.1打开的,那么勾选后实际上会不起作用。有网友说重建一下项目,但这很麻烦。经过观察,只要把新建空白项目下的 AndroidManifest.template.xml 文件拷贝覆盖掉老项目内的同名文件即可。或者直接在老项目的AndroidManifest.template.xml 文件的大概22行左右位置插入内容:<%provider%> (注:后面的方法未经实践,没仔细比较过新老两个文件的全部差异)。
经过这么折腾后重新编译,图片分享和文字分享功能已经正常,但下载更新功能还需进一步修改为provider支持 具体可参考GitHub上
https://github.com/yangyxd/FMXUI/blob/c01fb797c73af604b53091eed7f1fc66217155b4/source/UI.Utils.pas
这个文件内的 InstallApk 函数。