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());
  • (•́ ✖ •̀)
    알 수 없는 사용자
  • bucket_display_name 를 사용했다면 query를 사용한거 같은데.. query에 where 문으로 원하는 파일 리스트를 가져올수 있지 않을까요? 소스내용이 있다면 좀 더 도움을 드릴수 있을거 같습니다. 알 수 없는 사용자 2016.12.27 17:17
  • 앗 수정해서 바로 올리겠습니다! 알 수 없는 사용자 2016.12.27 17:47
  • 1. 갤러리 처럼 사진이 있는 폴더를 리스트로 뿌려준 후 해당 폴더 진입시 사진이 Display 되도록 앱을 만들 의도인가요? 2. String.endwith 로 쿼리를 해봤다는건 어떤 의미인지 소스상에서 확인이 안되서 물어봅니다. 알 수 없는 사용자 2016.12.28 10:40
  • 네 로빈퀸님 맞습니다 너무 설명이 장황했죠 제가 미쳐 사진이라도 올렸어야 했는데 ㅠㅠ 죄송합니다.. 알 수 없는 사용자 2016.12.28 10:39
  • 의도를 알려주시면 예제소스라도 하나 만들어 드릴께요~ 알 수 없는 사용자 2016.12.28 10:46
  • 진짜진짜 감사합니다.. 로비퀸님이 말씀해주신 1번이 제 의도이구요 2번에 말씀하신 String.endwith는 MediaStore.Images.Media 를 쓰게 되면 실제로 있는 파일과 매치가 안되는 경우가 있다고 봐서 File 클래스를 통해서 파일 확장자들을 다시 필터링 해서 매치(?) 시켜줘야 한다고 봐서 써놨었습니다~! 결과적으로 제가 지금 안되는 부분은 말씀해주신 1번입니다 알 수 없는 사용자 2016.12.28 10:46

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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)