갤러리 앱의 이미지 추출하는 방법으로  SDK 28 이하 SDK 29 이상 추출 방식이 분리됩니다.

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_gallery);
    
    // Todo : 휴대폰 갤러리 이미지 로드
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { //>= 29
        loadImageOSVersion(mCurrentPage);
    } else {
        loadImage(mCurrentPage);
    }
}

 

SDK 28이하 

public void loadImage(int page) {
    Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    String[] projection = {
            MediaStore.Images.Media._ID,
            MediaStore.Files.FileColumns.MIME_TYPE,
            MediaStore.Files.FileColumns.DISPLAY_NAME,
            MediaStore.Files.FileColumns.SIZE
    };

    /** 참고자료
     * https://velog.io/@nagosooo/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EA%B0%A4%EB%9F%AC%EB%A6%AC%EC%97%90%EC%84%9C-%EC%82%AC%EC%A7%84-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0
     * https://hooun.tistory.com/344
     */

    String selection = MediaStore.Images.Media.MIME_TYPE + "='image/jpeg'";
    String sortOrder = MediaStore.Images.Media.DATE_ADDED + " DESC LIMIT " + (page * IMAGES_PER_PAGE) + "," + IMAGES_PER_PAGE;

    Cursor imageCursor = getContentResolver().query(
            //Uri: 찾고자하는 데이터의 Uri입니다. 접근할 앱에서 정의됨. 내 앱에서 만들고 싶다면 manifest에서 만들 수 있음.
            uri,
            //Projection: 일반적인 DB의 column과 같습니다. 결과로 받고 싶은 데이터의 종류를 알려줍니다.
            projection,
            //Selection: DB의 where 키워드와 같습니다. 어떤 조건으로 필터링된 결과를 받을 때 사용합니다.
            selection,
            //Selection args: Selection과 함께 사용됩니다. SELECT 절에 있는 ? 자리표시자를 대체합니다.
            null,
            //SortOrder: 쿼리 결과 데이터를 sorting할 때 사용합니다.(반환된 Cursor 내에 행이 나타나는 순서를 지정합니다.)
            sortOrder);

    if (imageCursor != null) {
        int idColumn = imageCursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
        int fileSizeIndex = imageCursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.SIZE);
        ArrayList<Uri> images = new ArrayList<>();
        while (imageCursor.moveToNext()) {
            long id = imageCursor.getLong(idColumn);
            int file_size = imageCursor.getInt(fileSizeIndex);
            Uri contentUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);
            Log.d("IMAGE URI", contentUri.toString());

            // 시스템 카메라에서 사진 촬영 후 사용안하고 취소시 0사이즈 더미이미지파일 생성됨.
            if (file_size > 0) {
                images.add(contentUri);
            }
        }
        if (images.size() > 0) {
            mGalleryAdapter.setItemAdd(images);
        }
    }
 }

 

SDK 29이상

public void loadImageOSVersion(int page) {
    Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    String[] projection = {
            MediaStore.Images.Media._ID,
            MediaStore.Files.FileColumns.MIME_TYPE,
            MediaStore.Files.FileColumns.DISPLAY_NAME,
            MediaStore.Files.FileColumns.SIZE
    };
    
    String orderBy = MediaStore.Images.Media.DATE_ADDED + " DESC";
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
        Bundle queryArg = new Bundle();
        queryArg.putInt(ContentResolver.QUERY_ARG_LIMIT, IMAGES_PER_PAGE);
        queryArg.putInt(ContentResolver.QUERY_ARG_OFFSET, IMAGES_PER_PAGE * page);
        queryArg.putString(ContentResolver.QUERY_ARG_SQL_SORT_ORDER, orderBy);
        
        Cursor imageCursor = getContentResolver().query(uri, projection, queryArg, null);
        Cursor imageCursor = getContentResolver().query(uri, projection, selection, null, MediaStore.Files.FileColumns.DATE_ADDED );
        
        if (imageCursor != null) {
            int idColumn = imageCursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
            int nameIndex = imageCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); // 파일이름이 저장된 열의 위치 반환 후 저장
            int mimeTypeIndex = imageCursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.MIME_TYPE);
            int fileSizeIndex = imageCursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.SIZ
            String file_name = "";
            String mime_type = "";
            int file_size = 0;
            ArrayList<Uri> images = new ArrayList<>();
            while (imageCursor.moveToNext()) {
                long id = imageCursor.getLong(idColumn);
                Uri contentUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, i
                if (nameIndex != -1) { // 해당 열이 존재할 경우 내부 코드 실행
                    file_name = imageCursor.getString(nameIndex); // 열에 있는 데이터 반환
                    mime_type = imageCursor.getString(mimeTypeIndex);
                    file_size = imageCursor.getInt(fileSizeIndex);
                }
                Log.d("IMAGE URI", file_name + "(" + mime_type + ")" + "<"+ file_size + ">" + "/" + contentUri.toString(
                if (mime_type.equals("image/jpeg") && file_size > 0) {
                    images.add(contentUr
                }
          
            if (images.size() > 0) {
                mGalleryAdapter.setItemAdd(images);
            }
        }
    }
}

+ Recent posts