2016-09-14 1 views
-3

Je souhaite créer une application de galerie Android.Comment obtenir des chemins de dossiers contenant une image ou une vidéo

Comment numériser et obtenir des chemins de dossiers qui comprend des photos ou des vidéos.

J'ai utilisé ce code et travaillé. mais quand je le compare avec la Galerie QuickPic en magasin de jeu, je vois le nombre de dossiers dans mon application est inférieure dossiers QuickPic

Avez-vous un problème dans ce code?

 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

analyser tous les dossiers. Vérifiez pour voir s'il y a des photos ou des vidéos dedans. Fais une liste. –

+0

@JasonC s'il vous plaît voir ma deuxième réponse. –

+0

Modifiez votre question et ajoutez votre réponse. Ensuite, supprimez votre réponse. –

Répondre

1

De cette façon, vous pouvez trouver tous les parents de vidéo et d'image.

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

trouver tous les chemins de dossier images getImageFolderList private void() {

 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()); 
     } 
    } 

trouver toutes les vidéos dossier chemin

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

Merci, son travail comme un charme. mais lorsque nous avons 2 dossiers avec le même nom dans ExternalStorage et SDcard Like (dossier Caméra), ce code renvoie l'un d'entre eux. –

+0

Pouvez-vous résoudre ce problème? merci –

+0

@Sadeq Nameni Vous pouvez utiliser BUCKET_ID pour cela, car l'identifiant du compartiment est unique pour chaque dossier. – Smeet