安卓異常:android.os.FileUriExposedException:
android.os.FileUriExposedException: file:///storage/emulated/0/picture1537259111.jpg exposed beyond app throughClipData.Item.getUri() at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799) at android.net.Uri.checkFileUriExposed(Uri.java:2346) at android.content.ClipData.prepareToLeaveProcess(ClipData.java:832) at android.content.Intent.prepareToLeaveProcess(Intent.java:8909) at android.content.Intent.prepareToLeaveProcess(Intent.java:8894) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1517) at android.app.Activity.startActivityForResult(Activity.java:4224) at android.app.Activity.startActivityForResult(Activity.java:4183) at com.zxyoyo.apk.xunfei.voicedemo.faceonline.OnlineFaceDemo.onClick(OnlineFaceDemo.java:393) at android.view.View.performClick(View.java:5610) at android.view.View$PerformClick.run(View.java:22265) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
起因:開啟相機打算拍照
解決:編寫file-provider
authorities:自己的包名+隨便一個名稱(整個字串程式碼中會呼叫)
resource:下一步需要新建的一個檔案
<provider android:authorities="com.zxyoyo.apk.xunfei.fileprovider" android:name="android.support.v4.content.FileProvider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepath"/> </provider>
res目錄下新建xml資料夾(存在的話就不用了)
新建filepath檔案
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path name="my_img" path="img/" /> <external-path name="img" path="img/" /> // 說明:name的對應關係 path為資料夾的名稱 files-path ------>Context.getFilesDir() cache-path ------>Context.getCacheDir() external-path ------>Environment.getExternalStorageDirectory() external-files-path ------>Context.getExternalFilesDir() external-cache-path ------>Context.getExternalCacheDir() </paths>
java程式碼呼叫:
Uri uri;
mPictureFile = new File(Environment.getExternalStorageDirectory(),
"/img/picture" + System.currentTimeMillis()/1000 + ".jpg");
System.out.println(mPictureFile.getAbsolutePath()+"--file path");
if (Build.VERSION.SDK_INT >= 24) {
uri =FileProvider.getUriForFile(this.getApplicationContext(),"com.zxyoyo.apk.xunfei.fileprovider", mPictureFile);
}else {
uri = Uri.fromFile(mPictureFile);
}