對於面向 Android 7.0 的應用,Android 框架執行的 StrictMode API 政策禁止在您的應用外部公開 file:// URI。如果一項包含文件 URI 的 intent 離開您的應用,則應用出現故障,並出現 FileUriExposedException 異常。
要在應用間共享文件,您應發送一項 content:// URI,並授予 URI 臨時訪問權限。進行此授權的最簡單方式是使用 FileProvider 類。
解決方法:
首先在AndroidManifest.xml的<application>標簽內添加<provider>
<!-- 文件共享 -->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${APPLICATION_ID}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
接下來在res文件夾下創建xml子文件夾(如果已存在,忽略),並新建文件provider_paths.xml
內容如下
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path path="." name="external_files"/>
</paths>
接下來在跳轉時,傳入的Uri不再是使用
Uri.fromFile(tmpFile);
而是使用FileProvider的getUriForFile()方法獲取
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); tempFile = File.createTempFile("head", null, StorageUtils.getImageDir(context)); Uri imgUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", tempFile); intent.putExtra(MediaStore.EXTRA_OUTPUT, imgUri); startActivityForResult(intent, REQUEST_TAKE);
