2016-07-06 130 views
2

我在設備上使用以下代碼至scan all media/mp3文件,但設備上音樂太多時需要很長時間。安卓媒體掃描時間太長

我想知道是否有更快捷的方式獲取並顯示所有音樂?

注:該代碼不會導致崩潰或掛斷或任何其他事情......

class GetLocals extends AsyncTask<Void,Void,Void> { 

    @Override 
    protected void onPreExecute() { 
    super.onPreExecute(); 
    SongCover_lc.clear(); 
    SongID_lc.clear(); 
    Singer_lc.clear(); 
    Path_lc.clear(); 
    AlbumName_lc.clear(); 
    SongName_lc.clear(); 
    } 

    @Override 
    protected Void doInBackground(Void... voids) { 

    try { 
     String[] STAR = {"*"}; 
     Cursor cursor; 
     Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
     String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0"; 

     cursor = context.getContentResolver().query(uri, STAR, selection, null, null); 

     if (cursor != null) { 
     if (cursor.moveToFirst()) { 
      do { 
      String songName = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)); 
      String path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)); 
      String albumName = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM)); 
      String singer = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)); 
      String songid = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID)); 

      MediaMetadataRetriever mmr = new MediaMetadataRetriever(); 
      mmr.setDataSource(path); 
      byte[] artBytes = mmr.getEmbeddedPicture(); 
      if (artBytes != null) { 
       InputStream is = new ByteArrayInputStream(mmr.getEmbeddedPicture()); 
       Bitmap bm = BitmapFactory.decodeStream(is); 
       SongCover_lc.add(bm); 
      } else { 
       SongCover_lc.add(BitmapFactory.decodeResource(getResources(), R.color.white)); 
      } 

      SongName_lc.add(songName); 
      AlbumName_lc.add(albumName); 
      Path_lc.add(path); 
      Singer_lc.add(singer); 
      SongID_lc.add(songid); 

      } while (cursor.moveToNext()); 
     } 
     } 
    } catch (Exception e){ 
     System.out.println("CAAAAAAAAAAATCH"); 
    } 
    return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
    super.onPostExecute(aVoid); 
    lazyAdapter_localSongs = new LazyAdapter_LocalSongs(activity,SongName_lc,Singer_lc,SongCover_lc,AlbumName_lc,Path_lc); 
    listviewloclas.setAdapter(lazyAdapter_localSongs); 
    } 
} 
+0

請注意,掃描速度可能在很大程度上取決於設備上各自使用的SD卡(如果在外部SD上)(以及使用哪個內部存儲器H/W)。 – Fildor

+0

@Fildor以及我已經測試過許多設備,甚至有免費空間的模擬器!但我仍然有一個低速 –

+0

此外,您可以將其分成:1.獲取音樂列表,2.稍後更新查看專輯封面。您可能不會始終顯示完整列表,因此不需要獲取所有位圖。只需獲取您實際需要的圖片(也許預取接下來的幾個用戶可以到的頁面) – Fildor

回答

0
> I was wondering if there is a faster way to get 
> and show all musics ... 

換上CursorAdapter將按需加載的歌曲你的基於陣列的適配器。

因此,在您的listview/grid變得可用之前,您不需要預先加載1000首歌曲到數組中,而只需加載一次可見的10首歌曲。

+0

完美運作 –