Android 7.0[API24]以及以上版本不支持file://,使用content://URI
所以跳轉(zhuǎn)到系統(tǒng)相機(jī),并傳Uri會報錯.
解決辦法:
一 , 更新獲取Uri方法
private void camera(Context context,String name) {
if (new PermissionUtils((Activity) context).needPermission(2)) {
File path = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));
if(!path.exists()) {
path.mkdirs();
}
String picName = name + System.currentTimeMillis() + ".jpg";
File file = new File(path, picName);
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri imageUri ;
if(Build.VERSION.SDK_INT>Build.VERSION_CODES.KITKAT){ // 測試時發(fā)現(xiàn) 當(dāng)小于API19 時,用新的方法獲取Uri時會報錯.
imageUri = FileProvider.getUriForFile(context,context.getPackageManager()+".FileProvider",file); // 新的獲取Uri 的方法
}else{
imageUri = Uri.fromFile(file);
}
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
if(cameraIntent.resolveActivity(context.getPackageManager()) != null){
listener.onCamera(cameraIntent,file);
}else{
Toast.makeText(context, R.string.msg_no_camera, Toast.LENGTH_SHORT).show();
}
}
}
二 , 在Res/xml下設(shè)置文件路徑
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="camera_pictures" path="."/>
</paths>
path = "." ,該路徑由啟動拍照時寫入Uri的路徑?jīng)Q定,這里也可以寫具體路徑,但必須與拍照時寫入的路徑一樣,否則會報錯.
三 , 對FileProvider進(jìn)行設(shè)置
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="包名.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_path" />
</provider>
四, 獲取手機(jī)存儲的媒體文件的Uri
在24之后,獲取手機(jī)中的媒體文件的uri,老方法 Uri.fromFile(photoFile) 也會報錯,所以只能轉(zhuǎn)換成 content://
/**
* 獲取內(nèi)存中的媒體文件獲取 content Uri
* @param context
* @param imageFile 原媒體文件
* @return content Uri
*/
public static Uri getImageContentUri(Context context, File imageFile) {
String filePath = imageFile.getAbsolutePath();
Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[] { MediaStore.Images.Media._ID },
MediaStore.Images.Media.DATA + "=? ",
new String[] { filePath }, null);
if (cursor != null && cursor.moveToFirst()) {
int id = cursor.getInt(cursor
.getColumnIndex(MediaStore.MediaColumns._ID));
Uri baseUri = Uri.parse("content://media/external/images/media");
return Uri.withAppendedPath(baseUri, "" + id);
} else {
if (imageFile.exists()) {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, filePath);
return context.getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
} else {
return null;
}
}
}
參考文獻(xiàn):
Android7.0拍照失敗FileUriExposedException,你的拍照代碼升級了嗎
Android7.0適配之圖片裁剪