Android中调用摄像头拍照非常简单,利用MediaStore.ACTION_IMAGE_CAPTURE创建Intent,即可调用相机app来拍照。
主要思路如下
- 首先在自己的app文件夹下,利用FileProvider分享给相机.
- 在Manifest配置FileProvider
- 调用相机拍照,最终的照片会保存在该文件夹下
- 动态申请权限
- 解析图片Uri
添加权限
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
调用相机拍照
//调用照相机拍照
public void toCamera(Activity mActivity){
//创建intent 开启相机进行拍照
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//防止图片重名, 使用当前时间为图片命名
String fileName =simpleDateFormat.format(new Date());
//获取外部存储目录
File dir=mActivity.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
//以dir文件为父级文件夹创建子文件 用来保存我们拍照的图片
File folder=new File(dir,"my_pictures");
//如果图片保存目录不存在,则创建
if(!folder.exists()){
//创建目录
folder.mkdir();
}
//tempFile是用来存储每一张拍照的图片, 当前拍照的图片会最终存在这个目录中
tempFile = new File(folder,fileName+".jpg");
//兼容Android N
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.N){
//图片的Uri
imageUri = Uri.fromFile(tempFile);
}else{
//利用FileProvider 将每一张拍照的图片保存到tempFile里面
imageUri = FileProvider.getUriForFile(mActivity,
mActivity.getPackageName() + ".fileprovider", //需要在配置文件声明
tempFile);
//添加权限
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
//跳转到相机,并接收回调
mActivity.startActivityForResult(intent,CAMER_REQUEST_CODE);
}
拍照完毕后,imageUri 就存储我们拍照的图片;
在Manifests配置FileProvider
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.example.meet.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
@xml/filepaths
<?xml version="1.0" encoding="utf-8"?>
<resources>
//外部存储空间根目录,等同于 Environment.getExternalStorageDirectory() 所获取的目录路径;
<external-path
name="external_files"
path="." />
</resources>
参数说明
name:provider的类名
authorities:一个签名认证,可以自定义,但在获取uri的时候需要保持一致;
grantUriPermissions:使用FileProvider的使用需要我们给流出的URI赋予临时访问权限(READ和WRITE),该设置是允许我们行使该项权力;
meta-data:meta-data配置的是我们可以访问的文件的路径配置信息,需要使用xml文件进行配置,FileProvider会通过解析xml文件获取配置项,其中name名字不可改变为:android.support.FILE_PROVIDER_PATHS,resource为配置路径信息的配置项目。
在onActivityResult解析Uri
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if(resultCode == Activity.RESULT_OK){
//如果requestCode == 相机的code 获取图片的Uri
Uri uri = data.getData();
//解析Uri,获取图片的绝对路径
String uploadFile= FileHelper.getmInstance().getRealPathFromUri(this, uri);
if(uploadFile!=null){
//通过BitmapFactory.decodeFile 从路径中获取Bitmap图片 然后设置到ImageView里面
Bitmap bitmap = BitmapFactory.decodeFile(uploadFile.getPath());
iv_photo.setImageBitmap(bitmap);
}
}
super.onActivityResult(requestCode, resultCode, data);
}
至于上图中解析Uri的方法,这里就不再贴出了,具体的可看我的另外一篇博客。
Android根据图片Uri获取绝对路径