2016-05-14 16 views
0

Meine App sollte die Media-Tags aus den Songs laden, die im Speicher des Geräts gespeichert sind, aber die angezeigten Namen sind die Dateinamen und nicht die Titel-Tags!Android ContentResolver lädt die Song-Titel nicht

Mein Code:

List<Song> SongList = new ArrayList<>(); 

ContentResolver musicResolver = mContext.getContentResolver(); 

Uri musicUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 

Cursor cSong = musicResolver.query(musicUri, null, null, null, null); 

int iIDCol = cSong.getColumnIndex(MediaStore.Audio.Media._ID); 
int iTitleCol = cSong.getColumnIndex(MediaStore.Audio.Media.TITLE); 
int iArtistCol = cSong.getColumnIndex(MediaStore.Audio.Media.ARTIST); 
int iAlbumCol = cSong.getColumnIndex(MediaStore.Audio.Media.ALBUM); 
int iDurationCol = cSong.getColumnIndex(MediaStore.Audio.Media.DURATION); 
int iAlbumIDCol = cSong.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID); 
int iDataCol = cSong.getColumnIndex(MediaStore.Audio.Media.DATA); 

if (cSong != null && cSong.moveToFirst()) { 
    do { 
     String sArtist = cSong.getString(iArtistCol); 
     String sAlbum = cSong.getString(iAlbumCol); 

     if (sArtist.equals(MediaStore.UNKNOWN_STRING)) { 
      sArtist = mContext.getResources().getString(R.string.UnknownArtist); 
     } 

     if (sAlbum.equals(MediaStore.UNKNOWN_STRING)) { 
      sAlbum = mContext.getResources().getString(R.string.UnknownAlbum); 
     } 

     SongList.add(new Song(cSong.getLong(iIDCol), cSong.getLong(iAlbumIDCol), cSong.getString(iTitleCol), sArtist, sAlbum, cSong.getInt(iDurationCol), cSong.getString(iDataCol))); 
    } 
    while (cSong.moveToNext()); 
} 

cSong.close(); 

#Selfie korrekt, da der Dateiname gleich den Song-Titel angezeigt, aber die anderen werden nicht richtig angezeigt!

EDIT:

überprüfte ich, dass nur Nicht-MP3-Dateien verursachen Probleme aus! Wie kann ich das beheben?

Ich hoffe, Sie können mir helfen!

Danke!

Antwort

0

Sie können die MediaMetadataRetriever verwenden, um die Titel zu bekommen, etc:

String data = cursor.getString(iDataCol) 
MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 
retriever.setDataSource(data); 

String title = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE); 

Sie können die Künstler & Album bekommen zu

+0

diese Ursachen eine sehr lange Startzeit meiner Bewerbung ... gibt es noch eine andere Möglichkeit? –

+0

und das Problem ist gar nicht gelöst, der Fehler ist immer noch da –

+0

Leider dauert es eine Weile. Ich habe es immer nur direkt mit den Dateien selbst und nicht mit dem Inhaltsanbieter verwendet und es hat die korrekten Daten zurückgegeben. Es scheint, dass Content Provider die Ursache der falschen Daten ist! – Jahnold

0

Ich denke Problem ist, dass Sie nicht die Projektion Argument für getContentResolver.query gesetzt haben() -Methode

testen

ContentResolver musicResolver = getContentResolver(); 

    Uri musicUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 

    Cursor cSong = musicResolver.query(musicUri,new String[]{MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.DATA},null,null,null); 
+0

das ändert nichts! Bitte beachte meinen Schnitt :) –