對於面向 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);