2016-07-06 28 views
2

Ich benutze den Code unten zu scan all media/mp3 Dateien auf dem Gerät, aber es dauert zu lange, wenn es eine Menge Musik auf dem Gerät gibt.Android Media Scan dauert zu lange

Ich fragte mich, ob es einen schnelleren Weg gibt, alle Musik zu sehen und zu zeigen oder nicht?

Hinweis: der Code nicht abstürzen oder aufzuhängen oder eine andere Sache ...

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

Beachten Sie, dass die Scan-Geschwindigkeit stark von der verwendeten SD-Karte (falls auf einer externen SD-Karte) bzw. vom Gerät abhängen kann (und welche interne Speicher-H/W verwendet wird). – Fildor

+0

@Fildor Nun, ich habe auf vielen Geräten und sogar Emulator mit freiem Speicherplatz getestet! aber ich habe immer noch eine niedrige Geschwindigkeit –

+0

Auch können Sie dies in: 1. Holen Sie sich Liste der Musik, 2. Später aktualisieren Ansicht mit Cover Album. Sie werden wahrscheinlich nicht immer die vollständige Liste anzeigen, so dass Sie nicht alle Bitmaps abrufen müssen. Holen Sie sich einfach die Bilder, die Sie wirklich brauchen (und vielleicht holen Sie die nächsten ein, die der Benutzer sehen könnte) – Fildor

Antwort

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

Ersetzen Sie Ihre Array-basierten Adapter mit einem CursorAdapter, die die Songs auf Anfrage geladen werden.

Anstatt 1000 Songs in Arrays zu laden, bevor Ihr Listview/Grid nutzbar wird, laden Sie einfach die 10 Songs, die gleichzeitig sichtbar sind.

+0

funktioniert perfekt –