android開發(fā)中,調用相機拍照和選取相冊圖片是很常見的功能,自己就寫了一個小demo,流程簡單,方便參考;
實現(xiàn)相機功能基本思路
- 判斷權限.
- 通過Intent調用相機或者獲取相冊圖片
- 在onActivityResult回調用設置數(shù)據(jù)
判斷權限
android6.0開始需要設置動態(tài)權限,Manifest中設置了權限,仍需要重新設置一下動態(tài)獲取權限;
##調用了系統(tǒng)自帶的權限檢測方法
語句:ContextCompat.checkSelfPermission ( Context context, String permission);
public static int checkSelfPermission(@NonNull Context context, @NonNull String permission) {
if (permission == null) {
throw new IllegalArgumentException("permission is null");
}
return context.checkPermission(permission, android.os.Process.myPid(), Process.myUid());
}
##和權限請求方法
語句:ActivityCompat.requestPermissions ( Activity activity, String[] permissions, int requestCode) ;
public static void requestPermissions(final @NonNull Activity activity,
final @NonNull String[] permissions, final @IntRange(from = 0) int requestCode) {
if (Build.VERSION.SDK_INT >= 23) {
ActivityCompatApi23.requestPermissions(activity, permissions, requestCode);
} else if (activity instanceof OnRequestPermissionsResultCallback) {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
final int[] grantResults = new int[permissions.length];
PackageManager packageManager = activity.getPackageManager();
String packageName = activity.getPackageName();
final int permissionCount = permissions.length;
for (int i = 0; i < permissionCount; i++) {
grantResults[i] = packageManager.checkPermission(
permissions[i], packageName);
}
((OnRequestPermissionsResultCallback) activity).onRequestPermissionsResult(
requestCode, permissions, grantResults);
}
});
}
}
## 請求權限的結果回調
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
// 設置寫入權限
if (requestCode == PERMISSION_REQUEST_TAKE_PHONE) {
// 打開了讀寫權限
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
takePhoto();
} else {
Toast.makeText(MainActivity.this, "請打開應用相機權限", Toast.LENGTH_LONG).show();
}
}
}
調用相機或者相冊
調用相機直接通過 Intent 調用 MediaStroe.ACTION_IMAGE_CAPTURE 即可調用
## 創(chuàng)建拍照保存圖片的文件
// 創(chuàng)建的是存放圖片的文件夾
File file = new File(Environment.getExternalStorageDirectory(), "takePhotoDemo");
if (!file.exists()) {
// 如果文件路徑不存在則直接創(chuàng)建一個文件夾
file.mkdir();
}
// 把時間作為拍攝照片的保存路徑;
output = new File(file, System.currentTimeMillis() + ".jpq");
// 如果該照片已經存在就刪除它,然后新創(chuàng)建一個
try {
if (output.exists()) {
output.delete();
}
output.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
## 調用相機
// 兩種方式都可以
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
// Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 更改系統(tǒng)默認存儲路徑
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(intent, REQUEST_TAKE_PHOTO);
## 調用相冊
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_CHOOSE_PHOTO);
回調參數(shù)設置
通過BitMapFactory 可以獲取BiaMap圖片設置到ImageView中
## 通過bitmap設置
Bitmap bit = BitmapFactory.decodeStream(getContentResolver().openInputStream(photoUri));
picture.setImageBitmap(bit);