前言
前段時間寫了一個調用Camera拍照,并從圖庫中選取圖檔的小程式,但是當它在7.0的系統上運作時,直接崩潰,根本不能使用。
原來Android5.0、6.0、7.0增加了很多特性,我并沒有對此進行适配,進而導緻了很多錯誤。
android.os.FileUriExposedException: file:///storage/emulated/0/camera/1513393885728.jgp exposed beyond app through ClipData.Item.getUri() java.lang.SecurityException: Permission Denial: reading android.support.v4.content.FileProvider uri content://com.zxl.test_picture_camera/camera_gallery/camera/1514101205911.jgp from pid=5847, uid=10048 requires the provider be exported, or grantUriPermission()java.lang.SecurityException: Permission Denial: writing android.support.v4.content.FileProvider uri content://com.zxl.test_picture_camera/camera_gallery/camera/1514101317846.jgp from pid=8336, uid=10048 requires the provider be exported, or grantUriPermission()
-權限校驗
-權限申請
-賦予第三方應用Uri權限
-打開照相機
-打開相冊
-裁剪圖檔
1.權限校驗
Manifest.permission.CAMERA
Manifest.permission.READ_EXTERNAL_STORAGE Manifest.permission.WRITE_EXTERNAL_STORAGE
2.權限申請
AndroidManifest.xml添權重限:
android.permission.CAMERA
android.permission.READ_EXTERNAL_STORAGE
android.permission.WRITE_EXTERNAL_STORAGE
在Android6.0以後有的權限需要主動去申請 requestPermissions
requestPermissions Manifest.permission.CAMERA
requestPermissions Manifest.permission.READ_EXTERNAL_STORAGE
通過Activity回調接口擷取結果 onRequestPermissionsResult
PackageManager.PERMISSION_GRANTED
3.賦予第三方應用Uri權限
當擷取到圖檔後,需要進行裁剪,這需要将原圖檔、裁剪後到圖檔的儲存路徑都要給裁剪應用,并且要封裝成Uri通過Intent傳遞,在Android7.0增加了第三方應用讀取Uri的權限校驗
在res/xml下建立資源檔案file_path.xml files-path與Context.getFilesDir()相同的目錄 external-path與Environment.getExternalStorageDirectory()相同的目錄 cache-path與getCacheDir()相同的目錄 name為别名 path為表示對應類型的根目錄
AndroidManifest.xml添加provider
FileProvider.getUriForFile
Intent.FLAG_GRANT_READ_URI_PERMISSION
通過Intent找到符合的要打開的Activity activity.grantUriPermission Intent.FLAG_GRANT_WRITE_URI_PERMISSION
4.打開照相機
5.打開相冊
6.裁剪圖檔