Songlist mit bestimmtem Artist

  • Antworten:13
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 47

05.08.2018, 15:48:51 via Website

Für meinen Mediaplayer wollte ich eine Songlist erstellen, die nur Songs eines bestimmten Artists enthält.

public ArrayList<HashMap<String, String>> getPlayList(){
    File home = new File(MEDIA_PATH);

    if (home.listFiles(new FileExtensionFilter()).length > 0) {
        for (File file : home.listFiles(new FileExtensionFilter())) {
            HashMap<String, String> song = new HashMap<String, String>();
            song.put("songTitle", file.getName().substring(0, (file.getName().length() - 4)));
            song.put("songPath", file.getPath());

            MediaMetadataRetriever mmr = new MediaMetadataRetriever();
            mmr.setDataSource(file.getPath());
            String artistName =
                    mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
            // Adding each song to SongList

            if (artistName.contains(MainActivity.musicartist)) {
                songsList.add(song);
            }


        }
    }
    // return songs list array
    return songsList;
}

so ungefähr habe ich mir das vorgestellt, nur funktioniert das mit dem MediaMetadataRetriever irgendwie nicht. NullPointerEx an dieser Zeile
if (artistName.contains(MainActivity.musicartist)) {.

Diskutiere mit!
Beste Antwort
  • Forum-Beiträge: 2.902

06.08.2018, 11:32:28 via Website

Aber das eigentliche Problem ist ja, dass mit mmr.setDataSource(file.getAbsolutePath()); anscheinend keine Datei gefunden wird und somit der String null bleibt.

Ja das Problem ist bekannt , nicht alle Files lassen den Zugriff mit MediaMeta zu , das steht im übrigen auch in der API Doku.
MediaData soll auch nur für den temporären Einsatz verwendet werden, nicht innerhalb einer Scanloop.
Und wenn , dann auch nur in einem Thread.

ContentResolver :
Das ist schlichtweg ein DB SQL Zugriff auf den Inhalt Deines Gerätes , welches automatisch vom Kernel gescannt wird.
https://developer.android.com/reference/android/content/ContentResolver
https://developer.android.com/guide/topics/providers/content-provider-basics

Ergo : Alle "scannbaren" Ergebnisse sind bereits schon enthalten , wenn du den Query absetzt.

— geändert am 06.08.2018, 11:48:24

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 47

05.08.2018, 16:42:12 via Website

ich vermute den Fehler bei der Dateizuordnung

mmr.setDataSource(file.getPath());

getName() funktioniert aber auch nicht.

— geändert am 05.08.2018, 16:43:41

Hilfreich?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

05.08.2018, 21:01:35 via Website

Hallo Fragensteller,

bitte gewöhne dir ab, statische Referenzen a la MainActivity.musicartist zu benutzen.
Das geht irgendwann schief, wenn du daran Änderungen etc machen willst...

Aber zum eigentlichen Problem:

Für Audiofiles würde ich einen spezielleren Retriever nutzen:
https://stackoverflow.com/a/19482767

zudem: file.getAbsolutePath ist hier passend ;)

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.902

06.08.2018, 10:11:35 via Website

Und was hindert Dich daran , den ContentResolver zu benutzen ?
Dafür ist er doch eigentlich gedacht.

Zumal der MediaRetiever Dir grundsätzlich immer wieder jede Datei aufmacht , auseinander nimmt und dann wieder schliesst. Das benötigt unnötige Resourcen und Zeit.

— geändert am 06.08.2018, 10:24:29

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 47

06.08.2018, 11:28:05 via Website

mit dem ContentResolver habe ich mich noch nicht weiter beschäftigt. Hättest du ein Beispiel dafür?

Aber das eigentliche Problem ist ja, dass mit mmr.setDataSource(file.getAbsolutePath()); anscheinend keine Datei gefunden wird und somit der String null bleibt.

Hilfreich?
Diskutiere mit!
Beste Antwort
  • Forum-Beiträge: 2.902

06.08.2018, 11:32:28 via Website

Aber das eigentliche Problem ist ja, dass mit mmr.setDataSource(file.getAbsolutePath()); anscheinend keine Datei gefunden wird und somit der String null bleibt.

Ja das Problem ist bekannt , nicht alle Files lassen den Zugriff mit MediaMeta zu , das steht im übrigen auch in der API Doku.
MediaData soll auch nur für den temporären Einsatz verwendet werden, nicht innerhalb einer Scanloop.
Und wenn , dann auch nur in einem Thread.

ContentResolver :
Das ist schlichtweg ein DB SQL Zugriff auf den Inhalt Deines Gerätes , welches automatisch vom Kernel gescannt wird.
https://developer.android.com/reference/android/content/ContentResolver
https://developer.android.com/guide/topics/providers/content-provider-basics

Ergo : Alle "scannbaren" Ergebnisse sind bereits schon enthalten , wenn du den Query absetzt.

— geändert am 06.08.2018, 11:48:24

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 47

06.08.2018, 11:56:01 via Website

In der MainActivity funktioniert der MediaMeta problemlos. Vielleicht werde ich das ganze ein weing umbauen.
Ich habe dieses Beispiel für den Content Resolver gefunden:

    private void loadAudio() {
  ContentResolver contentResolver = getContentResolver();

  Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
  String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0";
  String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";
  Cursor cursor = contentResolver.query(uri, null, selection, null, sortOrder);

  if (cursor != null && cursor.getCount() > 0) {
      audioList = new ArrayList<>();
      while (cursor.moveToNext()) {
          String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
          String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
          String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
          String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));

          // Save to audioList
          audioList.add(new Audio(data, title, album, artist));
      }
  }
  cursor.close();
}
Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.902

06.08.2018, 12:01:50 via Website

In der MainActivity funktioniert der MediaMeta problemlos.

Wie schon bereits erwähnt : NUR in einem Thread verwenden , das hat nichts mit der Activity zu tun .

P.S: Das Beispiel sieht ganz gut aus :-)

— geändert am 06.08.2018, 12:02:08

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 47

06.08.2018, 12:21:29 via Website

Bin gerade am Umbau, an dieser Stelle verlangt AS eine Methode

ContentResolver contentResolver = getContentResolver();

Wie soll die ausehen?

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.902

06.08.2018, 12:24:09 via Website

Öhm , wie wäre es mit einer Instanz zum Context ?

e.g. mActivity.getContentResolver();

P.S. Wie schon Pascal weiter oben angemerkt hat ..... Die Grundlagen fehlen Dir noch.
Paste & Copy sind keine Lösung

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 47

06.08.2018, 12:34:31 via Website

Ja, dass mit den Grundlagen ist so ne Sache. Ich lerne durch probieren. Wenn es funktioniert, weiß ich manchmal nicht was ich da genau gemacht habe.
Ich werde einfach mal das neue Player Tuturial von Anfang an durcharbeiten.

Danke

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.902

06.08.2018, 12:39:14 via Website

Du kannst auch nicht eine Fremdsprache ohne Vokabeln & Grammatik sprechen und hoffen das dich jemand versteht :)

Media-Apps sind eines der komplexesten Aufgaben - da haste Dir eigentlich das Falscheste ausgesucht zum Lernen. (Fundierte Thread Kenntnisse von Nöten)
Zumal der Standard Mediaplayer (Klasse) eh nur rudimentär ist und sehr oft seinen Dienst quittiert.

— geändert am 06.08.2018, 12:41:51

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 47

07.08.2018, 11:10:15 via Website

So, ich glaube ich habe dieses Thema soweit verstanden, jetzt funktioniert alles wie ich will. Das mit dem Content Resolver war ein super Hinweis, da hat man ja viel mehr Möglichkeiten und es ist jetzt ganz leicht alles hin und her zu tauschen wie ich will. Danke nochmal.

Hilfreich?
Diskutiere mit!

Empfohlene Artikel