安卓判斷系統相機授權狀態以及呼叫系統相機
阿新 • • 發佈:2018-12-30
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);
}