1、在项目中有可能使用到系统的相机,以及根据授权状态做相应的处理, 2、在一开始我的项目里面没有判断相机的授权状态,直接就调用了系统的相机功能,但是当我拒绝了授权使用相机之后,项目仍然可以调用相机并且可以正常使用(如果是自定义打开相机的话,可能会崩掉),但是考虑到用户体验,还是需要判断一下授权状态,没有授权的话,就不用调用相机,下面是我的代码,在这里备份一下:
3、判断系统相机的授权状态和打开系统相机
/** * 启动相机,使用系统路径存储图片(不需要自定义路径,默认为Environment.DIRECTORY_PICTURES) * 返回存储路径 /storage/emulated/0/Pictures/1487908088865.jpg */ PRivate String startCameraWithSystemPath(Activity activity, int requestCode) { if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { /* * @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_TAKE_PHOTO_PERMISSION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //申请成功,可以拍照 } else { Toast.makeText(this, "CAMERA PERMISSION DENIED", Toast.LENGTH_SHORT).show(); } return; } super.onRequestPermissionsResult(requestCode, permissions, grantResults); } * */ // 没有授权,可用申请授权或者提示信息 // 申请权限,REQUEST_CODE是自定义的常量,如果申请授权的话,需要重写上面的onRequestPermissionsResult方法,但是好像不怎么管用(没准确测试) // ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE); Log.d("111", "没有授权,请到应用设置界面手动打开权限"); return null; } else { // 已经权限 Log.d("111", "已经授权"); // 获得sd卡的状态信息 String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)) { // SDK可用 Intent intent = new Intent(); // 指定开启系统相机的Action intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); File publicDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); // 获取系统SDK公共的文件夹路径 if (!publicDirectory.exists()) { publicDirectory.mkdirs(); } File saveFile = new File(publicDirectory, System.currentTimeMillis() + ".jpg"); // 拼接存储文件路径 // 把文件地址转换成Uri格式 Uri uri = Uri.fromFile(saveFile); Log.d("111", "getAbsolutePath=" + saveFile.getAbsolutePath()); // 设置系统相机拍摄照片完成后图片文件的存放地址 intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); // 此值在最低质量最小文件尺寸时是0,在最高质量最大文件尺寸时是1 intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0); activity.startActivityForResult(intent, requestCode); return saveFile.getAbsolutePath(); // 返回绝对路径(系统路径) } else { // SDK不可用 Toast.makeText(activity, "请确认已经插入SD卡", Toast.LENGTH_LONG).show(); return null; } } }调用方法获取图片的存储路径
private final static int REQUEST_CAMERA_CAPTURE_CODE = 3; // 相机回调codeprivate String cameraPath; // 存储路径// 调用cameraPath = startCameraWithSystemPath(MainActivity.this,REQUEST_CAMERA_CAPTURE_CODE); // 系统路径REQUEST_CAMERA_CAPTURE_CODE是自己定义的一个常量,用于标示activity,在调用系统相机之后,可以在回调函数中获得图片路径:
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // requestCode:可以通过resultCode来判断是哪一个activity的返回结果 if (resultCode == Activity.RESULT_OK) { if (requestCode == REQUEST_CAMERA_CAPTURE_CODE) { // 打开相机 Log.d("111", "path=" + cameraPath); Uri uri = Uri.fromFile(new File(cameraPath)); imageView.setImageURI(uri); } else if (requestCode == REQUEST_IMAGE_CAPTURE_CODE) { // 打开相册 try { Uri uri = data.getData(); String path = uri.getPath(); String last = uri.getLastPathSegment();// final String absolutePath= getAbsolutePath(mActivity, uri); Log.d("111", "uri=" + uri); Log.d("111", "path=" + path + ",last=" + last); imageView.setImageURI(uri); } catch (Exception e) { e.printStackTrace(); } } } }4、打开系统相册,同样在 public void onActivityResult(int requestCode, int resultCode, Intent data) {}中回调
public final static int REQUEST_IMAGE_CAPTURE_CODE = 1; // 相册回调code// 调用startPhotoLibrary(REQUEST_IMAGE_CAPTURE_CODE); /* * 打开相册 * */ private void startPhotoLibrary(int requestCode) { Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(intent, requestCode); }新闻热点
疑难解答