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);
}
}
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
@Fildor Nun, ich habe auf vielen Geräten und sogar Emulator mit freiem Speicherplatz getestet! aber ich habe immer noch eine niedrige Geschwindigkeit –
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