1. 程式人生 > >解決Android 7.0, 8.0手機相機崩潰問題

解決Android 7.0, 8.0手機相機崩潰問題

android 7.0之後的手機上用以上程式碼開啟相機、相簿會報如下錯誤:

android.os.FileUriExposedException: ** exposed beyond app through Intent.getData()

 解決方法: 

1、在manifest清單檔案中註冊provider

  1. <provider
    1. android:name="android.support.v4.content.FileProvider"
    2. android:authorities="包名.fileprovider"
    3. android:grantUriPermissions="true"
    4. android:exported="false">
    5. <meta-data android:name="android.support.FILE_PROVIDER_PATHS"
    6. android:resource="@xml/file_paths" />
    7. </provider>

也就是在application內加了一個provider:

  • name是固定的;
  • android:authorities推薦寫您的應用包名+“.fileprovider”,其實這裡不一定要寫fileprovider,您也可以隨便寫,只要與後面使用FileProvider.getUriForFile()這個方法中的第二個引數authority對應起來即可;
  • android:grantUriPermissions固定true,表示uri訪問授權;
  • android:exported固定的false,我試著寫了true報安全異常。
  • android:resource表示我們app要共享檔案的路徑的資原始檔。
  1. 2.res資料夾下,新建一個xml資料夾,名字就是上一步 android:resource=”@xml/file_paths”對應的內容
  •  <?xml version="1.0" encoding="utf-8"?>
  • <resources>
    • <paths>
      • <external-path path="" name="camera_photos" />
      • </paths>
      • </resources>

 

ps:另外發現嚴苛模式(StrictMode)也可以避免這個FileUriExposedException問題,在您的Application中OnCreate()方法中加入以下程式碼即可。這樣您可以按照7.0之前方法呼叫相機。 

 

  • if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
  • { StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
  • StrictMode.setVmPolicy(builder.build());
  • }

 但畢竟這方法不是官方推薦的,所以知道就行,不建議使用