Apps für Android programmieren leicht gemacht!
Musik Player Source Code - Teil 2

Musik Player Source Code – Teil 2

Wir wollen nun mit unserem ganz eigenen Musik Player weitermachen, den wir ja bereits im ersten Teil angesprochen haben.
Wir wollen nun für alle aufgelisteten Musikstücke den Interpreten, das Erscheinungsjahr, das Genre und deren Album auslesen. Diese Informationen werden übrigens Meta-Daten genannt.

Dazu müssen wir lernen, wie wir eben diese Meta-Daten von Musikdateien auslesen und nutzen können.
Selbstverständlich nutzen wir den bereits in Teil 1 programmierten Code weiter, bauen ihn aus und verändern ihn ein wenig.

 

 

Speichermöglichkeit anpassen:

Bevor wir anfangen können die Meta-Daten aus den MP3 Dateien auszulesen benötigen wir vorerst die Möglichkeit die Meta-Informationen speichern zu können. Es würde uns ja recht wenig bringen, wenn wir die Meta-Daten kennen, aber nicht verwerten können.
Wir öffnen also unsere Klasse „Lied“ und erweitern sie eben so, dass wir die zusätzlichen Meta-Daten speichern und verwenden können.

//Neue Variablen in der Klasse Lied
private String album    = "";
private String interpret= "";
private int    jahr     = 0;
private String genre    = "";

//Neuer Konstruktor in der Klasse Lied
public Lied(String titel, String album, String interpret, String genre, int jahr){
    this.titel = titel;
    this.album = album;
    this.interpret = interpret;
    this.genre = genre;
    this.jahr = jahr;
}

//Neue Getter in der Klasse Lied
public int getJahr() {
    return jahr;
}
public String getAlbum() {
    return album;
}
public String getInterpret() {
    return interpret;
}
public String getGenre() {
    return genre;
}

//Neue Setter in der Klasse Lied
public void setAlbum(String album) {
    this.album = album;
}
public void setInterpret(String interpret) {
    this.interpret = interpret;
}
public void setJahr(int jahr) {
    this.jahr = jahr;
}
public void setGenre(String genre) {
    this.genre = genre;
}

Mit diesen Erweiterungen können wir nun Informationen über das Album, den Interpret und das Erscheinungsjahr speichern.
Über die neuen Getter können wir die Informationen auslesen, über die Setter einspeichern.
Der neue Konstruktor hilft uns dabei die neuen Meta-Daten direkt bei Erstellung des Objektes „Lied“ einzuspeichern, ohne anschließend die nun vorhandenen vier Setter verwenden zu müssen.

 

 

Meta-Daten auslesen:

Da wir soeben die Möglichkeit erhalten haben die Meta-Daten zu speichern und zu verwerten müssen wir uns nun daran machen diese auch aus unseren Musikstücken auszulesen und abzuspeichern.
Dafür müssen wir ein paar kleinere Änderungen an unserer Funktion „findeLieder()“ machen. Die Funktion ist in der Datei „MainActivity.java“ zu finden.
Als erstes müssen wir die Stelle der auszulesenden Informationen bei Android erfragen.
Dazu schreiben wir:

//Direkt unter "int titleColumn = LiedCursor.getColumnIndex(MediaStore.Audio.Media.TITLE);" einfügen
int albumColumn = LiedCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM);
int yearColumn = LiedCursor.getColumnIndex(MediaStore.Audio.Media.YEAR);
int interpretColumn = LiedCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);

Nun wissen wir an welcher Stelle wir bei dem Auslesen der Meta-Daten wir was zu finden haben.
Anschließend müssen wir wie gehabt wieder alle Lieder durchlaufen und auslesen, was Android uns an der entsprechenden Stelle anbietet:

//Direkt unter "String thisTitle = LiedCursor.getString(titleColumn);" einfügen
String thisAlbum = LiedCursor.getString(albumColumn);
String thisInterpret = LiedCursor.getString(interpretColumn);
int thisYear = LiedCursor.getInt(yearColumn);

Wir können nun also bestimmen, an welcher Stelle in unserem „LiedCursor“ wir suchen müssen, um unser Album, unseren Interpreten und unser Erscheinungsjahr zu erreichen und anschließend auch auslesen zu können. Hört sich schon einmal recht gut an.

Was uns jetzt jedoch noch fehlt ist das Auslesen des dazugehörigen Genres.
Genau an diesem Punkt wird es dann doch ein wenig kniffliger. Das Problem ist, dass unser erstellter Cursor „LiedCursor“ die Meta-Daten des Genres nicht beinhaltet.
Wir müssen uns nun eines kleinen Tricks bedienen und während des Durchlaufens von „LiedCursor“ einen neuen Cursor, für genau dieses Lied erstellen, dass unser Genre enthält.
Auf gut Deutsch bedeutet dies, dass wenn wir uns gerade ein bestimmtes Lied anschauen, genau für dieses einen weiteren Cursor erstellen und alle auszulesenden Genres auch verwerten. Wir nennen unseren neuen Cursor „GenreCursor“.

//Direkt unter "Cursor LiedCursor = musicResolver.query(musicUri, null, null, null, null);" einfügen
Cursor GenreCursor;
//Direkt unter "int thisYear = LiedCursor.getInt(yearColumn);" einfügen

String thisGenre = "";
int LiedID = Integer.parseInt(LiedCursor.getString(LiedCursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID)));
Uri uri = MediaStore.Audio.Genres.getContentUriForAudioId("external", LiedID);
GenreCursor = getContentResolver().query(uri, null, null, null, null);
int genre_column_index = GenreCursor.getColumnIndexOrThrow(MediaStore.Audio.Genres.NAME);
if (GenreCursor.moveToFirst()) {
    do {
          thisGenre += GenreCursor.getString(genre_column_index) + " ";
           } while (GenreCursor.moveToNext());
}

Nun können wir auch alle angegebenen Genre auslesen.
Doch wo speichern wir die Daten nun? – Ganz einfach, erinnert euch zurück, als wir weiter oben im Artikel einen neuen Konstruktor in der Klasse „Lied“ erstellt haben. Diesen Konstruktor können wir nun super benutzen.

//Ersetzt "LiedListe.add(new Lied(thisTitle));" durch:
LiedListe.add(new Lied(thisTitle, thisAlbum, thisInterpret, thisGenre,thisYear));

 

 

Meta-Daten anzeigen:

Da haben wir schon wieder ganze Arbeit geleistet.
Leider fehlt noch eine Kleinigkeit! Die Anzeige der neu gewonnenen Meta-Daten.

Bloß keine Angst, das haben wir auch gleich. 😉

Bevor wir anfangen können die Daten auszugeben sollten wir vielleicht ein paar neue Textviews erstellen, in welchen unsere Daten angezeigt werden können.
Wir passen die Datei „lied_eintrag.xml“ im Ordner res -> layout an:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/LiedTitel"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="Small Text"
        android:id="@+id/LiedInterpretUndAlbumUndJahr"
        android:layout_below="@+id/LiedTitel"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="Small Text"
        android:id="@+id/LiedGenre"
        android:layout_below="@+id/LiedInterpretUndAlbumUndJahr"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
</RelativeLayout>

Schon gibt es zwei neue Textviews unterhalt der Textview für den Liedtitel.

 

Last but not least ändern wir an der Datei „LiedAdapter.java“ diese Zeilen:

//"TextView songView = (TextView)songLay.findViewById(R.id.LiedTitel);" ersetzen durch:
TextView songViewTitel              = (TextView)songLay.findViewById(R.id.LiedTitel);
TextView songViewInterpretUndAlbum  = (TextView)songLay.findViewById(R.id.LiedInterpretUndAlbumUndJahr);
TextView songViewGenre              = (TextView)songLay.findViewById(R.id.LiedGenre);
//"songView.setText(momentanesLied.getTitel());" ersetzen durch:
songViewTitel.setText(momentanesLied.getTitel());
songViewInterpretUndAlbum.setText(momentanesLied.getInterpret() + " - " + momentanesLied.getAlbum() + " - " + momentanesLied.getJahr());
songViewGenre.setText(momentanesLied.getGenre())

Musik Player Source Code - 2


Kannst du es auch kaum noch erwarten das Ergebnis der harten Arbeit zu sehen? Lade dir hier den Source Code des 2. Teiles herunter und nutze ihn für deinen eigenen Musik Player.

DownloadLizenzbedingungen

Marvin

Ich bin 23 Jahre jung und studiere zurzeit Wirtschaftsinformatik an der Georg-August-Universität in Göttingen. Ich bin ein Mensch, der sich neben der Programmierung noch für tausend andere Dinge interessiert, die mal mehr und mal weniger verrückt sind. Vor allem aber bin ich Feuer und Flamme mit der Programmierung von eigenen kleinen Apps und Programmen, die mein Leben bereichern.

Kommentar hinzufügen

*Pflichtfeld