Android - Image - Take Photo, Choose Photo from Gallery - Xử lý chụp ảnh, lấy ảnh trong Android Studio
Chụp ảnh hay lấy ảnh trong máy sử dụng các thành phần có sẵn trên máy --> sử dụng Intent
1. Chụp ảnh
Trong manifest file cần khai báo:
Chú ý cần tạo request code:
Chú ý: Phương thức trả về một Uri chứa đường dẫn file ảnh
1. Chụp ảnh
Trong manifest file cần khai báo:
<uses-feature android:name="android.hardware.camera" android:required="false" />
Trong Activity thực hiện:<uses-feature android:name="android.hardware.camera2" android:required="false" />
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) { startActivityForResult(takePictureIntent, CAMERA_REQUEST);}
else {
}
private static final int CAMERA_REQUEST = 111;
Xử lý kết quả sau khi chụp ảnh:
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) { Bitmap photo = (Bitmap) data.getExtras().get("data"); return;
} }
Chú ý: Dữ liệu ảnh trả về dạng bitmap.
Ta có thể lưu lại ảnh tạm thời trong thư mục của ứng dụng với hàm sau:
private Uri saveToInternalStorage(Bitmap bitmapImage) { ContextWrapper cw = new ContextWrapper(getApplicationContext());
File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
File myPath = new File(directory, "your_image_name");
FileOutputStream fos = null;
try { fos = new FileOutputStream(myPath);
bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos);
}
catch (Exception e) { e.printStackTrace();
}
finally { try { fos.close();
}
catch (IOException e) { e.printStackTrace();
} } return Uri.fromFile(myPath);
}
Để thực hiện cần check-permission( với api 23 trở lên) và khai báo trong manifest file:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2. Lấy ảnh từ Gallery hoặc các ứng dụng khác (cho phép lấy ảnh)
Chú ý trước khi thực hiện phải check-permission( với api 23 trở lên)
Trong manifest file khai báo:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Trong Activity thực hiện:
Khai báo request code:
private static final int PICK_IMAGE = 222;
Tạo intent:
Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT);getIntent.setType("image/*"); Intent pickIntent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
pickIntent.setType("image/*"); Intent chooserIntent = Intent.createChooser(getIntent,
getString(R.string.supervisor_profile_choose_image_title));
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{pickIntent}); startActivityForResult(chooserIntent, PICK_IMAGE);
Xử lý kết quả trả về:
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PICK_IMAGE && resultCode == Activity.RESULT_OK) { try { Uri imageUri = data.getData();
Bitmap photo = MediaStore.Images.Media.getBitmap(this.getContentResolver(),
imageUri); } catch (IOException e) { } return; } }
Chú ý: dữ liệu trả về trong intent là Uri, lấy bitmap bằng hàm sau:
MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
3. Check-permission runtime với API 23 trở lên
private boolean checkPermissionReadExternalStorage() { if (Build.VERSION.SDK_INT >= 23) { if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
&& checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) { return true; } else { ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
return false; } } else { return true; } }
Xử lý kết quả trả về:
@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//xử lý ở đây } }
Chú ý: trước thực hiện các phương thức đọc/ghi dữ liệu từ bộ nhớ cần check-permission trước
Nhận xét
Đăng nhận xét