안드로이드에서 사진 찍은 이미지를 가져오거나 갤러리에서 선택한 이미지의 썸네일을 가져올 요구가 종종 있다.

 

먼저 Camera, Read External Storage 권한이 필요하다. Android 6.0 이상에서는 게시글과 같이 권한에 대한 사용자 허가를 요청할 필요가 있다.

 

다음으로.. 물론... 카메라 없는 스마트폰은 없겠지만, 시스템에 확인을 요청할 수 있다.

 

PackageManager pm = mContext.getPackageManager();
if (pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
    // 다행이도 카메라 모듈이 있다.
}

 

이제 두 가지로 구분되는데 첫 번째는 '카메라 촬영 후 해당 썸네일을 획득하는 방법', 두 번째는 '갤러리에서 선택 후 해당 썸네일을 획득하는 방법'이다.

 

<카메라 촬영 요청>

 

Intent를 통해 카메라 애플리케이션을 호출한다.

 

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (intent.resolveActivity(mContext.getPackageManager()) != null) {
    startActivityForResult(intent, TAKE_PICTURE);
}

 

사용자가 카메라로 촬영을 완료하면 onActivityResult로 콜백이 호출된다.

 

<갤러리 선택 요청>

 

Intent를 통해 갤러리 애플리케이션을 호출한다.

 

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
if (intent.resolveActivity(mContext.getPackageManager()) != null) {
    startActivityForResult(Intent.createChooser(intent, ""), PICK_IMAGE);
}

 

사용자가 갤러리에서 선택을 완료하면 카메라 촬영과 마찬가지로 onActivityResult로 콜백이 호출된다.

 

위 두 예제에서 TAKE_PICTURE와 PICK_IMAGE는 requestCode 구분을 위한 int 값이다.

 

onActivityResult에서 다음과 같이 썸네일 비트맵을 획득할 수 있다.

 

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    switch(requestCode) {
        case TAKE_PICTURE:
            if(resultCode == Activity.RESULT_OK) {
                Bundle extras = data.getExtras();
                Bitmap imageBitmap = (Bitmap) extras.get("data");
                if(imageBitmap != null && imageBitmap.getByteCount() > 0) {
                    mImageView.setImageBitmap(imageBitmap);
                }
            }
            break;
        case PICK_IMAGE:
            if(resultCode == Activity.RESULT_OK) {
                Uri imageUri = data.getData();
                if (imageUri != null) {
                    List uriPath = imageUri.getPathSegments();
                    if (uriPath.size() > 0) {
                        long imageId = Long.parseLong(uriPath.get(uriPath.size() - 1).split(":")[1]);
                        Bitmap imageBitmap = MediaStore.Images.Thumbnails.getThumbnail(
                                                mContext.getContentResolver(),
                                                imageId,
                                                MediaStore.Images.Thumbnails.MINI_KIND, 
                                                null);
                        if(imageBitmap != null && imageBitmap.getByteCount() > 0) {
                            mImageView.setImageBitmap(imageBitmap);
                        }
                    }
                }
            }
            break;
    }
}

 

갤러리에서 선택한 이미지의 경우에는 Uri를 가져오고 그로부터 썸네일을 획득하는 과정이 카메라 촬영 방법에 비해 조금 더 필요하다.

 

여기서 MediaStore.Images.Thumbnails.getThumbnail을 통해 썸네일 비트맵을 획득하는 과정에서 Thumbnail 크기를 설정할 수 있다.

 

// MediaStore.Images.Thumbnails
public static final int MINI_KIND = 1; // 512 x 384
public static final int MICRO_KIND = 3; // 96 x 96

 

이 결과로 해당 ImageView에서 썸네일 비트맵을 정상적으로 확인할 수 있다.

 

 

블로그 이미지

나뷜나뷜

,