2016-07-06 11 views
2

私は以下のコードをデバイスのscan all media/mp3ファイルに使用していますが、デバイスに多くの音楽がある場合は時間がかかりすぎます。Androidメディアスキャンに時間がかかりすぎる

私はすべての音楽を入手して表示するためのより速い方法があるかどうか疑問に思っていましたか?

注:コードは、クラッシュが発生したり、ハングアップや他のものはありません...

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

スキャンスピードは、デバイス(および内部メモリH/Wが使用されている)で使用されているSDカード(外部SDの場合)に大きく依存することがあります。 – Fildor

+0

@Fildorよく私は多くのデバイスとエミュレータの空き容量でテストしました!しかし私はまだ低速です –

+0

また、これを分割することができます:1.音楽のリストをフェッチします。2.アルバムを含む最新のアップデートビューをカバーします。おそらく、完全なリストを常に表示するわけではないので、すべてのビットマップを取得する必要はありません。あなたが実際に必要な写真を取ってくるだけです(そして、ユーザがページできる次のものをプリフェッチするかもしれません)。 – Fildor

答えて

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

オンデマンドの曲をロードしますCursorAdapterであなたのアレイ・ベースのアダプターを交換します。

リストビュー/グリッドが使用可能になる前に、1000曲を配列にプリロードするのではなく、一度に表示できる10曲をロードするだけです。

+0

は完全に動作します –

関連する問題