安卓判断系统相机授权状态以及调用系统相机

来源:互联网 发布:电话亭女孩 知乎 编辑:程序博客网 时间:2024/06/06 11:40

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);    }
0 0
原创粉丝点击