1

Я пытаюсь получить все музыкальные файлы в устройстве с помощью Mediastore. Я извлекаю все файлы асинхронно, но для получения всей песни требуется 6-7 секунд, поэтому в течение этого времени пользователь должен увидеть встроенный индикатор прогресса.Удовлетворение запросов Mediastore

Я использовал запрос в запросе для получения AlbumArt каждой песни

Есть ли способ или лучший подход для борьбы с ним

public ArrayList<SongList> getSongs() { 
     ContentResolver musicResolver = context.getContentResolver(); 
     Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 

     Cursor musicCursor = musicResolver.query(musicUri, new String[] {MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media._ID 
     ,MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media.DATA,MediaStore.Audio.Media.ALBUM,MediaStore.Audio.Media.ALBUM_ID, 
       MediaStore.Audio.Media.COMPOSER,MediaStore.Audio.Media.YEAR,MediaStore.Audio.Media.TRACK 
     }, null, null, MediaStore.Audio.Media.TITLE); 

     if (musicCursor != null && musicCursor.moveToFirst()) { 
      //int value=0; 
      //get columns 
      int titleColumn = musicCursor.getColumnIndex 
        (MediaStore.Audio.Media.TITLE); 
      int idColumn = musicCursor.getColumnIndex 
        (MediaStore.Audio.Media._ID); 
      int artistColumn = musicCursor.getColumnIndex 
        (MediaStore.Audio.Media.ARTIST); 
      int pathColumn = musicCursor.getColumnIndex 
        (MediaStore.Audio.Media.DATA); 
      int albumColumn = musicCursor.getColumnIndex 
        (MediaStore.Audio.Media.ALBUM); 
      int albumIDColumn = musicCursor.getColumnIndex 
        (MediaStore.Audio.Media.ALBUM_ID); 
      int composerColumn = musicCursor.getColumnIndex 
        (MediaStore.Audio.Media.COMPOSER); 
      int yearColumn = musicCursor.getColumnIndex 
        (MediaStore.Audio.Media.YEAR); 
      int trackColumn = musicCursor.getColumnIndex 
        (MediaStore.Audio.Media.TRACK); 
      String thisAlbumArt = ""; 

      //add songs to list 
      do { 
       long thisId = musicCursor.getLong(idColumn); 
       String thisTitle = musicCursor.getString(titleColumn); 
       String thisArtist = musicCursor.getString(artistColumn); 
       String thisPath = musicCursor.getString(pathColumn); 
       String thisAlbum = musicCursor.getString(albumColumn); 
       long thisalbumID = musicCursor.getLong(albumIDColumn); 
       String thisComposer = musicCursor.getString(composerColumn); 
       int thisyear = musicCursor.getInt(yearColumn); 
       int track = musicCursor.getInt(trackColumn); 

       songQueryList.add(thisTitle); 
       Cursor cursor = musicResolver.query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, 
         new String[]{MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART}, 
         MediaStore.Audio.Albums._ID + "=?", 
         new String[]{musicCursor.getString(musicCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID))}, 
         null); 
       if (cursor!=null && cursor.moveToFirst()) { 

        thisAlbumArt = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART)); 
        cursor.close(); 
       } 
       if(thisPath.endsWith(".mp3")|| thisPath.endsWith(".m4p") || thisPath.endsWith(".wav")) { 

        songs.add(new SongList(thisId, thisTitle, thisAlbum, thisArtist, thisPath, thisAlbumArt ,thisyear,track ,thisComposer ,thisalbumID)); 
       } 
       else{ 

       } 
       //cursor.moveToNext(); 
      } 
      while (musicCursor.moveToNext()); 
     } 
     if(musicCursor!=null) { 
      musicCursor.close(); 
     } 
     //Log.e("HI"," "+musicCursor.isClosed()); 

     /*Collections.sort(songs, new Comparator<SongList>(){ 
      public int compare(SongList a, SongList b){ 
       return a.getTitle().compareToIgnoreCase(b.getTitle()); 
      } 
     });*/ 

     return songs; 

    } 

Thankyou в развитых

ответ

0

Я нашел решение. Фактически это несколько строк кодов, вызывающих задержку, которую я вызывал внутри цикла do-while-

Cursor cursor = musicResolver.query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, 
        new String[]{MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART}, 
        MediaStore.Audio.Albums._ID + "=?", 
        new String[]{musicCursor.getString(musicCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID))}, 
        null); 

Я хочу добавить, что запрос на курсор является очень дорогой и временной линией, поэтому использование его в несколько раз вызывает задержку.

Скорее я использовал 3 разных запроса для SONG, ALBUM и ARTIST, а затем использовал некоторую логику для их взаимосвязи.

Надеюсь, это поможет. Счастливое кодирование.

0

Вот 2 метода для извлечения, первый использует идентификатор альбома, а второй использует идентификатор песни.

// requires WRITE_EXTERNAL_STORAGE on N+ 
public void loadAlbumArt(int albumId, ImageView view){ 
    Uri artworkUri = Uri.parse("content://media/external/audio/albumart"); 
    Uri path = ContentUris.withAppendedId(artworkUri, albumId); 
    Glide.with(view.getContext()).load(path).into(view); 
} 

public static void loadAlbumArt(int songId, ImageView view){ 
    Uri artworkUri = Uri.parse("content://media/external/audio/media/" + songId + "/albumart"); 
    Glide.with(view.getContext()).loadFromMediaStore(artworkUri).into(view); 
} 
Смежные вопросы