Android 7.0 以后胰柑,Android系統(tǒng)不再允許 Intent 攜帶 "file:// “開頭的uri截亦,會拋出信息暴露的異常。
發(fā)送者需要在 AndroidManifest.xml 中添加一個 FileProvider:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
然后定義一個 file_paths.xml
<paths>
<external-path
name="external_storage_root"
path="." />
</paths>
在請求查看文件時柬讨,指定 uri崩瓤, 填充文件的mime信息。
File file = Environment.getExternalStorageDirectory().getAbsolutePath()+"/Download/test.jpg";
String mime = "image/jpeg";
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//判斷是否是AndroidN以及更高的版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Uri contentUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".fileProvider", file);
intent.setDataAndType(contentUri, mime);
} else {
intent.setDataAndType(Uri.fromFile(file), mime);
}
try {
startActivity(intent);
}catch (Exception e){
}
這個方式會調(diào)用系統(tǒng)的選擇框列出支持的應(yīng)用踩官。但是這時候傳入的文件却桶,好多應(yīng)用都打不開,提示”請求資源失敗“啥的蔗牡。
原因在于颖系,這些應(yīng)用遇到 content:// 開頭的 Uri 資源,首先就去 MediaStore 查詢這個 Uri辩越,因為這是應(yīng)用私有Uri嘁扼,自然查不到,就返回這個錯誤区匣。
解決辦法,就是讓被調(diào)用的應(yīng)用使用 MediaStore查不到后,采用 ContentResolver 的 OpenFileDescriptor 再嘗試打開亏钩,當(dāng)然自己的應(yīng)用可以這么干莲绰,別家的只能期待他們這么做。
https://developer.android.google.cn/reference/android/content/ContentResolver.html#openFileDescriptor(android.net.Uri,%20java.lang.String)
最后一個辦法就是姑丑,把發(fā)送者的 targetSdkVersion 設(shè)為 23 或者更低蛤签,然后直接傳遞 file://開頭的Uri,Android系統(tǒng)就不報錯了栅哀,應(yīng)該是兼容舊版震肮。而大部分第三方應(yīng)用還是兼容支持file://開頭的Uri的,只要你能傳遞給他留拾。那么這樣就解決問題了~~