Delphi 10.3.1 為Android項目提供了Secure File Sharing選擇項,默認是False。這一項是設置什么呢?
原來,Android 7及以后的版本,為了加強OS的安全性,不允許一個app訪問其他app的文件,如果訪問,則會出現這樣的錯誤:
java.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
為了解決這個問題,將Secure File Sharing設置為True。設置后,ide會為我們在AndroidManifest.template.xml增加如下內容:
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.embarcadero.CCSuperPlayer.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" /> </provider>
同時生成文件provider_paths.xml,內容如下:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external_files" path="." /> </paths>
關於上面生成的內容如何理解,可以參考:
1.Android 7.0適配-應用之間共享文件(FileProvider)
2.Android7.0行為變更之適配File Provider的方法
最后總結下,如果你的代碼中用到File://,則需要按上面的方法解決。
后記:如果你的項目是用舊版delphi建的,如10.2,那么,需要在10.3.1下重建這個項目,才能確保Secure File Sharing選擇項生效,生成正確的配置文件,不然,不會生成配置文件,有朋友遇到過。