1. 程式人生 > >安卓判斷系統相機授權狀態以及呼叫系統相機

安卓判斷系統相機授權狀態以及呼叫系統相機

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; // 相機回撥code
private 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);

    }