갤러리 앱의 이미지 추출하는 방법으로 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);
}
}
}
}
'Android(Java)' 카테고리의 다른 글
[Java] SMS 인증번호 자동 등록하기 (1) | 2024.06.13 |
---|---|
[Java] Permission 설정 및 거부시 처리 (0) | 2024.04.22 |
[Java]WebView사용시 target=_blank 사용에 따른 onCreateWindow 호출되는 문제 (0) | 2024.04.12 |
[Java] Log 가독성있게 찍기 (0) | 2024.04.08 |
[Java] ConstraintLayout LinearLayout Height 자동크기변경 (0) | 2024.04.05 |