Android 7.0[API24]以及以上版本不支持file://,使用content://URI
所以跳转到系统相机,并传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){ // 测试时发现 当小于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下设置文件路径
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="camera_pictures" path="."/>
</paths>
path = "." ,该路径由启动拍照时写入Uri的路径决定,这里也可以写具体路径,但必须与拍照时写入的路径一样,否则会报错.
三 , 对FileProvider进行设置
<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>
四, 获取手机存储的媒体文件的Uri
在24之后,获取手机中的媒体文件的uri,老方法 Uri.fromFile(photoFile) 也会报错,所以只能转换成 content://
/**
* 获取内存中的媒体文件获取 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;
}
}
}
参考文献:
Android7.0拍照失败FileUriExposedException,你的拍照代码升级了吗
Android7.0适配之图片裁剪