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); }新聞熱點
疑難解答