没有谁的幸运,是凭空而来,只有当你足够努力,你才会足够幸运。这世界不会辜负每一份努力和坚持,时光不会怠慢执着而勇敢的每一个人。
做过类似需求的童鞋都知道,在activity通过如下代码可以启动相机,然后重写onActivityResult,
//启动相机程序
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
startActivityForResult(intent,TAKE_PHONE);
在此方法中可以获取拍照返回的数据,那么问题来了,在onActivityResult方法里通过intent.getdata获取的图片是经过默认压缩的,显示浏览是非常模糊的,如何解决这个问题呢?我是这样做的。
在启动的时候先指定图片的保存路径
1.创建路径
File filesDir;
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//判断sd卡是否挂载
//路径1:storage/sdcard/Android/data/包名/files
filesDir = getExternalFilesDir("");
} else {//手机内部存储
//路径:data/data/包名/files
filesDir = getFilesDir();
}
//创建一个File对象用于存储拍照后的照片
File outputImage=new File(filesDir,BitmapUtils.getImgName());
try{
if(outputImage.exists()){
outputImage.delete();
}
outputImage.createNewFile();
}catch (Exception e){
e.printStackTrace();
}
//判断Android版本是否是Android7.0以上
if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.N){
imageUri=FileProvider.getUriForFile(MainActivity.this,"com.rt.rtplasma",outputImage);
}else{
imageUri= Uri.fromFile(outputImage);
}
//启动相机程序
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
System.out.println("imageUri==="+imageUri);
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
startActivityForResult(intent,TAKE_PHONE);
}
2.在AndroidManifest中注册存储照的容器
<!--
name:属性值,固定写法
authorities:组件标识,按照江湖规矩,都以包名开头,避免和其它应用发生冲突。和FileProvider.getUriForFile()方法的第二个参数一致
exported:要求必须为false,为true则会报安全异常。
grantUriPermissions:true,表示授予 URI 临时访问权限。
-->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.rt.rtplasma"
android:exported="false"
android:grantUriPermissions="true">
<!--指定Uri的共享路径-->
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
3.创建file_paths文件 在res目录创建一个xml文件夹,再在xml文件夹只创建一个file_paths.xml文件,文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<paths >
<external-path name="my_image" path="" />
//name属性值可以随便填 path属性值表示共享的具体路径,设置为空,表示将整个SD卡目录进行共享,也可以设置共享的具体路径
</paths>