在项目使用过程中调用拍照功能并从onActivityResult返回的结果中获取到图片。今天使用过程中出现这个异常:android.os.FileUriExposedException: file:///storage/emulated/0/temp.jpg exposed beyond app through ClipData.Item.getUri();
因为android 7.0 引起的兼容问题了。 <manifest xmlns:android="http://schemas.android.com/apk/res/android" ? ? package="com.hnj.wxxdzsprint" ? ? android:versionCode="1" ? ? android:versionName="2.3.3" >? ?? ? ? <uses-sdk ? ? ? ? android:minSdkVersion="18" ? ? ? ? android:targetSdkVersion="30" />??
targetSdkVersion>23的时候出现闪退问题的。小于23不会出现这个问题。
解决方法如下:
第一步先在res目录下创建一个xml文件夹,然后在创建一个file_paths文件,文件里的内容如下:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="" />
</paths>
然后在AndroidManifest.xml文件里面添加:

<provider
android:authorities="com.hnj.wxxdzsprint.fileprovider"
android:name="android.support.v4.content.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
到这里还没有完工,继续到java文件里面代码调用:这里调用拍照功能
File tempFile = new File(Environment.getExternalStorageDirectory(),"temp.jpg");
Uri photoOutputUri = FileProvider.getUriForFile(
MainActivity.this,
MainActivity.this.getPackageName() + ".fileprovider",
tempFile);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,photoOutputUri);
// intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(tempFile));//直接这样子用回闪退
startActivityForResult(intent, 1);
如果不使用intent.putExtra(MediaStore.EXTRA_OUTPUT,photoOutputUri); 这个方法行不行,当然也是可以调取拍照功能的。但是返回的图片会被压缩变小。
接收拍照好的图片:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
switch (requestCode) {
case PHOTO_REQUEST_TAKEPHOTO:
// if (data != null) {
// Bundle bundle = data.getExtras();
// if (bundle != null) {
// Bitmap mbtp = bundle.getParcelable("data");//这种方式获取的拍照图片会被压缩。
// Toast_Util.ToastString(getApplicationContext(), "宽度:"+mbtp.getWidth()+"高度:"+mbtp.getHeight());
// getimage("",mbtp);
// pimage_iv.setImageBitmap(bitmap);
// }
// }
Bitmap mbtp = null;
try {
mbtp = BitmapFactory.decodeStream(getContentResolver().openInputStream(Uri.fromFile(tempFile)));
getimage("",mbtp);
pimage_iv.setImageBitmap(mbtp);
} catch (FileNotFoundException e) {
e.printStackTrace();
Log.e(TAG, "=====FileNotFoundException===="+e.getMessage());
}
break;
到这里就可以了。
|