拍照功能比较常见,实现也比较简单,一般分成如下几步
首先得有拍照的权限,也就是调用系统相机的权限,申请系统权限一般有几种方式
- 直接用Activity和Fragment的requestPermissions方法
//检查是否已经获取权限
ActivityCompat.checkSelfPermission(activity.getApplication(), Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
//没有权限则申请权限,这里用的是fragment的requestPermissions
requestPermissions(new String[]{Manifest.permission.CAMERA},1);//1是requestCode,用于回调
//申请权限的结果会回调onRequestPermissionsResult接口,需要在申请权限的fragment里面复写
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1://对应requestPermissions的requestCode
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {//如果一次申请多个权限,就按顺序依次grantResults[1]、grantResults[2]判断
Toasts.showShort("再次点击即可拍照");
} else {
// 权限被拒绝的逻辑处理
}
break;
}
}
- 以上是简单的权限动态申请,如果项目中需要申请的权限比较多的话,可以考虑三方库,用得比较多的有2款
有了权限以后就是拍照的具体处理了
- 生成intent,用于调用系统的相机应用,就是启动相机程序的Activity
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
UUID uuid = UUID.randomUUID();
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), uuid.toString() + ".jpeg");
//判断是否是AndroidN以及更高的版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri uri = FileProvider.getUriForFile(getContext(), BuildConfig.APPLICATION_ID + ".fileProvider", file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
} else {
Uri uri = Uri.fromFile(file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
}
startActivityForResult(intent, 1);
可以看到上面对于android7.0以上的系统会做特殊处理,主要是android7.0以后的安全策略更加严格了。
- 因为我们使用的是startActivityForResult方法来调用系统相机,所以拍照完成以后会回调onActivityResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
switch (requestCode) {
case 1:
//处理拍照成功以后的逻辑
break;
}
}
}
需要注意的是,用以上的方法,只有拍照成功resultCode才会为Activity.RESULT_OK,否则是不会执行Activity.RESULT_OK条件下的逻辑的!
OK!以上就是调用系统相机的简单实现啦!
欢迎关注我的公众号,和我一起每天进步一点点!
