android 이미지 폴더 관련 질문입니다 !!
조회수 3353회
안녕하세요 다름이 아니라 이미지 폴더를 구현하던중에 어떻게 연결을 시켜야 하는지 몇일동안 되지를 않아서 이렇게 질문을 올립니다.
일단 Media.store 를 통해서 이미지를 가져오는데 까지 성공하였습니다. 그래서 Bucket Dispalyname을 통해 각각 사진의 폴더까지 가져왔구요 첫번째 문제는 모든 사진마다 폴더를 가져와야 하기 때문에 배열이라서 1000개의 배열이 생기고 또한 패턴이 있는게 아니라서 각각 인덱스로 가져올수도 없더라구요 그리고 파일 클래스를 이용해서 sd카드의 폴더들을 리스트뷰로 뿌리는데 까지 성공을 했는데 거기서 String.endwith 라는 것을 가지고 쿼리를 해봤지만 안되더군요 ㅠㅠ 구글로 열심히 찾고 있는데도 잘 안나와서 고수분들께 이렇게 도움을 요청합니다 ㅠㅠ ... 도와주세요 ..
String[] projection = new String[]{
MediaStore.Images.Media._ID,
MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
MediaStore.Images.Media.DATE_TAKEN
};
Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
Cursor cur = managedQuery(images,
projection, // Which columns to return
null, // Which rows to return (all rows)
null, // Selection arguments (none)
null // Ordering
);
Log.i("ListingImages", " query count=" + cur.getCount());
if (cur.moveToFirst()) {
int bucketColumn = cur.getColumnIndex(
MediaStore.Images.Media.BUCKET_DISPLAY_NAME);
Log.d(TAG, "bucketColumn" + cur.getString(bucketColumn));
int dateColumn = cur.getColumnIndex(
MediaStore.Images.Media.DATE_TAKEN);
int id = cur.getColumnIndex(
MediaStore.Images.Media._ID);
do {
// Get the field values
bucket = cur.getString(bucketColumn);
Log.d(TAG, "bucketColumn" + bucket);
date = cur.getString(dateColumn);
String id_str = cur.getString(id);
temp.add(bucket.toString());
// Log.i("folder", "temp : " + temp);
// Do something with the values.
// Log.i("ListingImages", " bucket=" + bucket
// + " date_taken=" + date);
} while (cur.moveToNext());
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
위의 소스로 간단하게 예제 만들어봤습니다. 잘 돌아가는지는 저도 테스트를 많이 안해봤지만 어느정도 돌아가는지 확인은 했습니다.
private HashSet<String> mBucketDispalyList; private ArrayList<String> mFolderArrayList; private ListView mListView; private ListAdapter mListAdapter; private Context mContext; private static final String[] PROJECTION = new String[] { MediaStore.Images.Media._ID, MediaStore.Images.Media.BUCKET_DISPLAY_NAME, MediaStore.Images.Media.DATA, MediaStore.Images.Media.TITLE}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = this; mListView = (ListView) findViewById(R.id.view_list); mBucketDispalyList = new HashSet<String>(); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); getBucketDisplayList(); if (DEBUG) { Iterator<String> iterator = mBucketDispalyList.iterator(); while (iterator.hasNext()) { Log.e(TAG, "hashset : " + iterator.next()); } } mFolderArrayList = new ArrayList<String>(mBucketDispalyList); mListAdapter = new ListAdapter(); mListAdapter.setData(mFolderArrayList); mListView.setAdapter(mListAdapter); mListView.setOnItemClickListener(this); } public void getBucketDisplayList() { String bucket, dataPath; Cursor cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, PROJECTION, null, null, null); if (cursor != null && cursor.moveToFirst()) { int bucketColumn = cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME); int dataPathColumn = cursor.getColumnIndex(MediaStore.Images.Media.DATA); do { bucket = cursor.getString(bucketColumn); dataPath = cursor.getString(dataPathColumn); Log.d(TAG, "bucketColumn : " + bucket); mBucketDispalyList.add(bucket.toString()); Log.e(TAG, "bucket = " + bucket + " , dataPath = " + dataPath); } while (cursor.moveToNext()); cursor.close(); } } public ArrayList<String> getPictureList(String bucket) { String title = null; ArrayList<String> pictureList = new ArrayList<String>(); String selection = MediaStore.Images.Media.BUCKET_DISPLAY_NAME + " == " + "\""+bucket+"\""; Cursor cursor = getContentResolver().query(Images.Media.EXTERNAL_CONTENT_URI, PROJECTION, selection, null, null); if (cursor != null && cursor.moveToFirst()) { int titleColumn = cursor.getColumnIndex(MediaStore.Images.Media.TITLE); do { title = cursor.getString(titleColumn); Log.d(TAG, "title : " + title); pictureList.add(title.toString()); } while (cursor.moveToNext()); cursor.close(); } return pictureList; }
-
(•́ ✖ •̀)
알 수 없는 사용자
- 정말정말 감사드립니다 ㅠㅠㅠㅠㅠ.. 얼른 구현해보도록 하겠습니다... 진짜 감사드려요 알 수 없는 사용자 2016.12.28 18:08
- 로빈퀸님 정말정말 감사합니다 정말 잘되고 있습니다. 그런데 예를 들자면 Camera같은 경우는 위에 상위 폴더에 DCIM이라는 곳이 있어서 카메라 폴더를 가져와도 null값이 뜨게 됩니다. 이런 경우에는 path값이나 다른 값들을 통해서 그 폴더가 DCIM 아래에 있다는 것을 인식 시켜줘야 하나요?! ㅠㅠ 알 수 없는 사용자 2016.12.29 09:55
- 위 코드에는 몇가지 문제가 있습니다. (사실 방식 자체의 문제이기도 하고요..) bucket_display_name의 경우 해당 데이터의 폴더 name의 값이 있습니다. 예를들면 DCIM/camera 폴더와 root/camera 폴더 밑의 데이터의 경우 동일한 camera 값이 들어가 있죠.. 말씀하신것 처럼 위에서 해당 bucket_display_name으로 query시 위 두 폴더에 대한 값을 서로 구분해서 가져오지 못하고 있죠.. media provider의 값중 MediaStore.Images.Media.DATA에는 해당 파일의 전체 경로가 있습니다. 해당 데이터를 가지고 실제 path를 구분을 하는것이 바람직할것으로 보입니다. 개인적으로 제가 구현한다면 좀 더 다른 방법으로 접근을 할것 같습니다. 알 수 없는 사용자 2016.12.29 10:08
- 그렇군요~!! 감사합니다 ㅠㅠ 개인적으로 구현하신다는건 실제 path 값을 이용해서 하시는거 말고도 다른 방법이 있으시다는 말씀인가요?~ 초보가 하기에는 어려운거일수도 있겠군요 알 수 없는 사용자 2016.12.29 10:16
- 실제 Data 값을 이용할것 같습니다. 예를 든다면 MediaInfo라는 클래스를 만들고 파일의 실제 Path, title등 필요한 항목을 만들고 query시 해당 미리 데이터를 만들어서 표기해주거나, app에 따로 db를 만들어서 필요한 항목을 만들어서 사용할것 같네요. 만들고자 하는 앱의 전체 플랜을 만들어서 차근차근히 하나씩 만들어 나간다면 어렵지 않을것 같습니다. 알 수 없는 사용자 2016.12.29 10:30
- 어제 오늘 귀한 시간 내주셔서 감사합니다 :D 정말로 감사드려요 한번씩 산이 찾아와서 ㅠㅠ... 덕분에 조금 수월하게 넘을거 같습니다. 눈도오고 날씨가 많이 춥네요 감기 조심하시고 즐거운 하루 보내셨으면 좋겠습니다 감사합니다 :) 알 수 없는 사용자 2016.12.29 10:32
- 요즘 일이 없어서 시간이 남는지라..;;;; 도움이 되었다니 다행이네요...좋은 하루되세요~ 알 수 없는 사용자 2016.12.29 10:44
-
댓글 입력