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:
<uses-feature    android:name="android.hardware.camera"    android:required="false" />
<uses-feature    android:name="android.hardware.camera2"    android:required="false" />
Trong Activity thực hiện:
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
    startActivityForResult(takePictureIntent, CAMERA_REQUEST);} 
else {

     }

Chú ý cần tạo request code:
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);
   }

Chú ý: Phương thức trả về một Uri chứa đường dẫn file ảnh
Để 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

Bài đăng phổ biến từ blog này

Android - Date Time - Lấy giá trị ngày, giờ theo định dạng tùy biến trong Android Studio

Android - Custom SearchView - Tạo khung tìm kiếm đơn giản trong Android Studio