2016-09-14 16 views
-3

アンドロイドギャラリーアプリを作成したいと思います。画像や動画を持つフォルダのパスを取得する方法

写真や動画を含むフォルダのパスをスキャンして取得する方法。

このコードを使用して作業しました。しかし、私はそれをプレイストアのQuickpic Galleryと比較すると、私のアプリのフォルダ数がQuickpicのフォルダより少ないことがわかります

このコードに問題はありますか?

 Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
    Cursor cursor = ba.context.getContentResolver().query(uri, null, null, 
      null, MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME); 
    if (cursor != null) { 
     cursor.moveToFirst(); 
     int data = cursor 
       .getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
     int displayName = cursor 
       .getColumnIndex(MediaStore.Images.ImageColumns.DISPLAY_NAME); 
     imageFolders = new HashMap<>(); 
     do { 
      String imageAddress = cursor.getString(data); 
      String imageName = cursor.getString(displayName); 
      String folderAddress = imageAddress.substring(0, 
        imageAddress.lastIndexOf(imageName) - 1); 

      if (!imageFolders.containsKey(folderAddress)) { 
       imageFolders.put(folderAddress, imageAddress); 
      } 
     } while (cursor.moveToNext()); 
     for (String str : imageFolders.keySet()) { 

      ba.raiseEventFromDifferentThread(
        null, 
        null, 
        0, 
        "result", 
        true, 
        new Object[] { String.format("%s", str), 
          String.format("%s", imageFolders.get(str)) }); 
     } 

    } 
+1

スキャンすべてのフォルダを検索するすべての画像のフォルダパス ます。private void getImageFolderList(){

 String[] projection = new String[] { MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID, MediaStore.Images.Media.BUCKET_DISPLAY_NAME, MediaStore.Images.Media.DATE_TAKEN }; Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; final String orderBy = MediaStore.Images.Media.DATE_TAKEN; Cursor cur = getContentResolver().query(images, projection, // Which // columns // to return null, // Which rows to return (all rows) null, // Selection arguments (none) orderBy + " DESC" // Ordering ); ArrayList<String> imagePath; if (cur.moveToFirst()) { String bucket, date; int bucketColumn = cur.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME); int dateColumn = cur.getColumnIndex(MediaStore.Images.Media.DATE_TAKEN); do { bucket = cur.getString(bucketColumn); date = cur.getString(dateColumn); if (!allFolder.contains(bucket)) { allFolder.add(bucket); } imagePath = listImageByFolder.get(bucket); if (imagePath == null) { imagePath = new ArrayList<String>(); } imagePath.add(cur.getString(cur .getColumnIndex(MediaStore.Images.Media.DATA))); listImageByFolder.put(bucket, imagePath); } while (cur.moveToNext()); } } 

を見つけます。写真や動画があるかどうかを確認してください。リストを作る。 –

+0

@JasonC私の2番目の答えをご覧ください。 –

+0

質問を編集して回答を追加してください。その後、あなたの答えを削除します。 –

答えて

1

この方法で、すべてのビデオと画像の親を見つけることができます。

ArrayList<String> allFolder; 
    HashMap<String, ArrayList<String>> listImageByFolder; 
    ArrayList<String> allVideoFolder; 
    HashMap<String, ArrayList<String>> listVideoByFolder; 

すべての動画フォルダパス

private void getVideoFolderList() { 
     String[] projection = new String[] { MediaStore.Video.Media.DATA, 
       MediaStore.Video.Media._ID, 
       MediaStore.Video.Media.BUCKET_DISPLAY_NAME, 
       MediaStore.Video.Media.DATE_TAKEN }; 
     Uri images = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; 
     final String orderBy = MediaStore.Video.Media.DATE_TAKEN; 
     Cursor cur = getContentResolver().query(images, projection, // Which 
                    // columns 
                    // to return 
       null, // Which rows to return (all rows) 
       null, // Selection arguments (none) 
       orderBy + " DESC" // Ordering 
     ); 
     ArrayList<String> imagePath; 
     if (cur.moveToFirst()) { 
      String bucket, date; 
      int bucketColumn = cur.getColumnIndex(MediaStore.Video.Media.BUCKET_DISPLAY_NAME); 
      int dateColumn = cur.getColumnIndex(MediaStore.Video.Media.DATE_TAKEN); 
      do { 
       bucket = cur.getString(bucketColumn); 
       date = cur.getString(dateColumn); 
       if (!allVideoFolder.contains(bucket)) { 
        allVideoFolder.add(bucket); 
       } 
       imagePath = listVideoByFolder.get(bucket); 
       if (imagePath == null) { 
        imagePath = new ArrayList<String>(); 
       } 
       imagePath.add(cur.getString(cur 
         .getColumnIndex(MediaStore.Images.Media.DATA))); 
       listVideoByFolder.put(bucket, imagePath); 
      } while (cur.moveToNext()); 
     } 
    } 
+0

ありがとう、魅力のような仕事。 しかし、ExternalStorageとSDcard Like(Cameraフォルダ)に同じ名前のフォルダが2つある場合、このコードはその1つを返します。 –

+0

この問題を解決できますか?ありがとう –

+0

@Sadeq NameniバケットIDは各フォルダで一意であるため、BUCKET_IDを使用することができます。 – Smeet

関連する問題