Δημιουργήσετε μια εφαρμογή αναπαραγωγής μουσικής για το Android: Εγκατάσταση Project (Setup)
Greek (ελληνικά) translation by Iris Diakoumi (you can also view the original English article)
Η πλατφόρμα Android παρέχει πόρους για το χειρισμό αναπαραγωγής πολυμέσων, την οποία μπορούν να χρησιμοποιήσουν οι εφαρμογές σας για να δημιουργήσετε μια διασύνδεση μεταξύ του χρήστη και των αρχείων μουσικής του. Σε αυτή τη σειρά από tutorial, θα δημιουργήσουμε μια βασική εφαρμογή αναπαραγωγής μουσικής για το Android. Η εφαρμογή θα παρουσιάζει μια λίστα τραγουδιών στη συσκευή του χρήστη, έτσι ώστε ο χρήστης να μπορεί μα επιλέξει τραγούδια για να παίξει. Η εφαρμογή θα παρουσιάζει επίσης στοιχεία ελέγχου για την αλληλεπίδραση με την αναπαραγωγή και θα συνεχίσει να αναπαράγει, όταν ο χρήστης απομακρύνεται από την εφαρμογή, με μια ειδοποίηση που θα εμφανίζεται ενώ πραγματοποιείται η αναπαραγωγή.
Εισαγωγή
Η δημιουργία της εφαρμογής αναπαραγωγής μουσικής θα περιλάβει τη χρήση της κλάσης ContentResolver
για να ανακτήσετε κομμάτια στη συσκευή, της κλάσης MediaPlayer
για την αναπαραγωγή ήχου και της κλάσης MediaController
για να ελέγχετε την αναπαραγωγή. Θα χρησιμοποιήσουμε επίσης ένα στιγμιότυπο Service
για την αναπαραγωγή ήχου, όταν ο χρήστης δεν αλληλεπιδρά απευθείας με την εφαρμογή. Θα πρέπει να είστε σε θέση να ολοκληρώσετε αυτή τη σειρά, αν είστε ένας σχετικά προχωρημένος προγραμματιστής Android, έτσι εάν έχετε δημιουργήσει ήδη μερικές εφαρμογές, τότε αυτή η σειρά δεν θα πρέπει να είναι δύσκολη για σας. Εδώ είναι μια προεπισκόπηση της τελικής εφαρμογής:



Σε αυτό το tutorial, θα δημιουργήσουμε την εφαρμογή και θα εξετάσουμε τη συσκευή του χρήστη για αρχεία ήχου χρησιμοποιώντας τις κλάσεις ContentResolver
και Cursor
. Στο επόμενο μέρος, θα χρησιμοποιήσουμε ένα στιγμιότυπο Adapter
για να παρουσιάσουμε τα τραγούδια σε μια προβολή λίστας, ξεκινώντας την αναπαραγωγή, όταν ο χρήστης επιλέγει ένα στοιχείο από τη λίστα. Στο τελικό μέρος αυτής της σειράς, θα χρησιμοποιήσουμε την κλάση MediaController
για να δώσουμε στο χρήστη τον έλεγχο της αναπαραγωγής, για να υλοποιήσουμε συναρτήσεις για να προχωρήσουμε προς τα εμπρός και προς τα πίσω και να συμπεριλάβουμε μια λειτουργία shuffle. Μετά από αυτή τη σειρά, θα εξερευνήσουμε άλλες πτυχές της αναπαραγωγής πολυμέσων που μπορεί να ενισχύσουν την εφαρμογή, όπως χειρισμός εστίασης ήχου, παρουσίαση αρχείων πολυμέσων με διαφορετικούς τρόπους και αναπαραγωγή πολυμέσων ροής.
1. Δημιουργήστε και Ρυθμίστε ένα νέο Project
Βήμα 1
Δημιουργήστε ένα νέο Android project. Εάν χρησιμοποιείτε το Eclipse, τότε αφήστε το IDE (ολοκληρωμένο περιβάλλον ανάπτυξης) να δημιουργήσει μια κύρια κλάση Activity
και ένα αρχείο διάταξης για εσάς. Για ορισμένο από τον κώδικα που χρησιμοποιούμε στη σειρά, χρειάζεστε ένα ελάχιστο επίπεδο API 16, έτσι θα πρέπει να ακολουθήσετε πρόσθετα βήματα για την υποστήριξη παλαιότερων εκδόσεων. Αφού δημιουργηθεί το project σας, ανοίξτε το αρχείο Manifest του project. Μέσα στο στοιχείο manifest
, προσθέστε τα ακόλουθα δικαιώματα:
<uses-permission android:name="android.permission.WAKE_LOCK" />
Θα χρησιμοποιήσουμε αυτό το δικαίωμα για να αφήσουμε την αναπαραγωγή μουσικής να συνεχίσει, όταν η συσκευή του χρήστη είναι αδρανής. Το Manifest θα πρέπει να περιέχει ήδη ένα στοιχείο για την κύρια κλάση Activity
. Προσθέστε τις ακόλουθες ιδιότητες για το στοιχείο activity
για να ορίσετε τα screenOrientation
και launchMode
:
<activity android:name="com.example.musicplayer.MainActivity" android:label="@string/app_name" android:launchMode="singleTop" android:screenOrientation="portrait" >
Θα παραμείνουμε σε κατακόρυφο προσανατολισμό για λόγους απλότητας. Το launchMode
θα βοηθήσει τη διαδικασία πλοήγησης πίσω στην εφαρμογή αφού έχουμε βγει από αυτή. Θα εμφανίσουμε μια ειδοποίηση που θα υποδεικνύει το τραγούδι που παίζεται αυτήν τη στιγμή, πατώντας την ειδοποίηση ο χρήστης θα επιστρέφει στην εφαρμογή. Πρόκειται, επίσης, να χρησιμοποιήσουμε μια κλάση Service
για αναπαραγωγή μουσικής. Προσθέστε την ακόλουθη γραμμή στο Manifest του project μέσα στο στοιχείο application
και μετά το στοιχείο activity
:
<service android:name="com.example.musicplayer.MusicService" />
Αλλάξτε το όνομα του πακέτου για να ταιριάζει με το δικό σας και να αλλάξετε το όνομα της κλάσης, εάν επιθυμείτε.
Βήμα 2
Ανοίξτε το κύριο αρχείο διάταξης του project και αντικαταστήστε το περιεχόμενό του με την ακόλουθη διάταξη:
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:background="#FF330000" tools:context=".MainActivity" > <ListView android:id="@+id/song_list" android:layout_width="fill_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout>
Φροντίστε να τροποποιήσετε την ιδιότητα tools:context εάν η κύρια Activity
κλάση σας ονομάζεται διαφορετικά. Η διάταξη περιλαμβάνει ένα ListView
μέσα στο οποίο θα παρουσιάσουμε τη λίστα των τραγουδιών.
Θα περιλάβουμε δύο στοιχεία μενού για την εναλλαγή της λειτουργίας shuffle και για την έξοδο από την εφαρμογή. Ανοίξτε το κύριο αρχείο μενού (res/menu/main.xml) και αντικαταστήστε το περιεχόμενό του με το ακόλουθο:
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/action_shuffle" android:icon="@drawable/rand" android:orderInCategory="1" android:showAsAction="always" android:title="Shuffle"/> <item android:id="@+id/action_end" android:icon="@drawable/end" android:orderInCategory="2" android:showAsAction="always" android:title="End"/> </menu>
Εάν προτιμάτε, μπορείτε να αποθηκεύσετε τις συμβολοσειρές των τίτλων στο αρχείο res/values/strings.xml. Τα δύο στοιχεία 'item' αναφέρονται σε drawable αρχεία. Δημιουργήσετε τα δικά σας ή χρησιμοποιήστε αυτές τις δύο εικόνες για να ξεκινήσετε:


Θα χρησιμοποιήσουμε επίσης ένα εικονίδιο για να εμφανίσουμε στην ειδοποίηση αναπαραγωγής. Δημιουργήσετε ένα τώρα ή χρησιμοποιήστε το παρακάτω:

Ο κώδικας θα αναφέρεται στις εικόνες χρησιμοποιώντας τα ονόματα rand, end, και play έτσι, βεβαιωθείτε ότι χρησιμοποιείτε τα ίδια ονόματα αρχείων. Αντιγράψτε τις εικόνες στους φακέλους drawables του project σας. Θα υλοποιήσουμε τις ενέργειες αργότερα.
2. Ερευνήστε τη Συσκευή για Τραγούδια
Βήμα 1
Ας ερευνήσουμε τη συσκευή του χρήστη για αρχεία ήχου. Πρώτα, μπορείτε να προσθέσετε μια νέα κλάση στο project σας, ονομάζοντας τη Song
. Θα χρησιμοποιήσουμε αυτή την κλάση για να μοντελοποιήσουμε τα δεδομένα για ένα μεμονωμένο αρχείο ήχου. Μέσα στην δήλωση της κλάσης, προσθέστε τρεις μεταβλητές στιγμιοτύπου για τα δεδομένα που θέλουμε να αποθηκεύσουμε για κάθε κομμάτι:
private long id; private String title; private String artist;
Στη συνέχεια, προσθέτουμε μια μέθοδο κατασκευαστή στην οποία αρχικοποιούμε τις μεταβλητές στιγμιοτύπου:
public Song(long songID, String songTitle, String songArtist) { id=songID; title=songTitle; artist=songArtist; }
Τέλος, προσθέτουμε μεθόδους get για τις μεταβλητές στιγμιοτύπου:
public long getID(){return id;} public String getTitle(){return title;} public String getArtist(){return artist;}
Αν σκοπεύετε να χρησιμοποιήσετε περισσότερες πληροφορίες για το κάθε κομμάτι, τότε είστε ελεύθεροι να προσθέσετε πρόσθετες μεταβλητές στιγμιοτύπου στην κλάση.
Βήμα 2
Ανοίξτε την κύρια κλάση Activity
και προσθέστε τις ακόλουθες εισαγωγές (imports):
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import android.net.Uri; import android.content.ContentResolver; import android.database.Cursor; import android.widget.ListView;
Δηλώστε τις ακόλουθες μεταβλητές στιγμιοτύπου πριν από τη μέθοδο onCreate
:
private ArrayList<Song> songList; private ListView songView;
Θα αποθηκεύουμε τα τραγούδια σε μια λίστα και θα τα απεικονίσουμε στην προβολή ListView
στην κύρια διάταξη. Στην onCreate
, αφού ορίσετε την προβολή περιεχομένου, ανακτήστε το στιγμιότυπο ListView
χρησιμοποιώντας το ID (αναγνωριστικό) που του δώσαμε στην κύρια διάταξη:
songView = (ListView)findViewById(R.id.song_list);
Αρχικοποιείστε τη λίστα όπως φαίνεται παρακάτω:
songList = new ArrayList<Song>();
Στη συνέχεια, στην δήλωση της κύριας κλάσης Activity
, μετά από τις υπάρχουσες μεθόδους, δημιουργήστε μια βοηθητική μέθοδο για να ανακτήσετε τις πληροφορίες του αρχείου ήχου:
public void getSongList() { //retrieve song info }
Μέσα σε αυτή τη μέθοδο, δημιουργήστε ένα στιγμιότυπο ContentResolver
, ανακτήστε το URI για εξωτερικά μουσικά αρχεία και δημιουργήστε ένα στιγμιότυπο Cursor
χρησιμοποιώντας το στιγμιότυπο ContentResolver
για να ερευνήσετε τα αρχεία μουσικής:
ContentResolver musicResolver = getContentResolver(); Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);
Τώρα μπορούμε να προσπελάσουμε τα αποτελέσματα, ελέγχοντας πρώτα ότι διαθέτουμε έγκυρα δεδομένα:
if(musicCursor!=null && musicCursor.moveToFirst()){ //get columns int titleColumn = musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media.TITLE); int idColumn = musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media._ID); int artistColumn = musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media.ARTIST); //add songs to list do { long thisId = musicCursor.getLong(idColumn); String thisTitle = musicCursor.getString(titleColumn); String thisArtist = musicCursor.getString(artistColumn); songList.add(new Song(thisId, thisTitle, thisArtist)); } while (musicCursor.moveToNext()); }
Πρώτα ανακτούμε τα ευρετήρια στηλών για τα στοιχεία δεδομένων τα οποία μας ενδιαφέρουν για κάθε τραγούδι, στη συνέχεια, τα χρησιμοποιούμε για να δημιουργήσετε ένα νέο αντικείμενο Song
και το προσθέτουμε στη λίστα, πριν να συνεχίσουμε να προσπελαύνουμε τα αποτελέσματα.
Πίσω στην onCreate
, μετά τον κώδικα που προσθέσαμε, καλούμε αυτή τη νέα μέθοδο:
getSongList();
3. Εμφανίστε τα Τραγούδια
Βήμα 1
Τώρα μπορούμε να εμφανίσουμε τη λίστα των τραγουδιών στη διεπαφή χρήστη. Στην μέθοδο onCreate
, μετά την κλήση της βοηθητικής μεθόδου που δημιουργήσαμε πριν από λίγο, ας ταξινομήσουμε τα δεδομένα, έτσι ώστε τα τραγούδια παρουσιάζονται με αλφαβητική σειρά:
Collections.sort(songList, new Comparator<Song>(){ public int compare(Song a, Song b){ return a.getTitle().compareTo(b.getTitle()); } });
Χρησιμοποιούμε τη μεταβλητή title
στην κλάση Song
, χρησιμοποιώντας τις μεθόδους get που προσθέσαμε, για να υλοποιήσουμε μια μέθοδο compare
, ταξινομώντας τα τραγούδια κατά τίτλο.
Βήμα 2
Ας ορίσουμε μια διάταξη που να αντιπροσωπεύει κάθε τραγούδι στη λίστα. Προσθέστε ένα νέο αρχείο στο φάκελο res/layout του project σας, ονομάζοντας το song.xml και πληκτρολογώντας τα εξής:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="songPicked" android:orientation="vertical" android:padding="5dp" > <TextView android:id="@+id/song_title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#FFFFFF99" android:textSize="20sp" android:textStyle="bold" /> <TextView android:id="@+id/song_artist" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#FFFFFF99" android:textSize="18sp" /> </LinearLayout>
Μπορείτε να τροποποιήσετε τη διάταξη για να ταιριάζει στις προτιμήσεις σας. Κάθε τραγούδι στη λίστα θα εκπροσωπηθεί από συμβολοσειρές κειμένου τίτλου και καλλιτέχνη, έτσι θα χρησιμοποιήσουμε το TextViews
για να εμφανίσετε τα δεδομένα αυτά. Παρατηρήστε ότι το tag ανοίγματος LinearLayout
παραθέτει μια ιδιότητα onClick
. Θα χρησιμοποιήσουμε αυτήν τη μέθοδο στην κύρια κλάση Activity
για να ανταποκριθούμε στις επιλογές του χρήστη στα τραγούδια στη λίστα, αναπαράγοντας το τραγούδι που αντιπροσωπεύεται από το στοιχείο της λίστας που επιλέχθηκε.
Βήμα 3
Θα χρησιμοποιήσουμε έναν Adapter
για να αντιστοιχίσετε τα τραγούδια στην προβολή λίστας. Προσθέσετε μια νέα κλάση στην εφαρμογή σας, ονομάζοντας την SongAdapter ή κάποιο άλλο όνομα της επιλογής σας. Κατά τη δημιουργία της κλάσης, δώστε της την υπερ-κλάση android.widget.BaseAdapter
. Το Eclipse θα πρέπει να εισαγάγει την ακόλουθη διάρθρωση:
public class SongAdapter extends BaseAdapter { @Override public int getCount() { // TODO Auto-generated method stub return 0; } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return 0; } @Override public View getView(int arg0, View arg1, ViewGroup arg2) { // TODO Auto-generated method stub return null; } }
Θα πρέπει να προσθέσετε τις ακόλουθες εισαγωγές:
import java.util.ArrayList; import android.content.Context; import android.view.LayoutInflater; import android.widget.LinearLayout; import android.widget.TextView;
Μέσα στην δήλωση της κλάσης, δηλώστε τις ακόλουθες μεταβλητές στιγμιοτύπου:
private ArrayList<Song> songs; private LayoutInflater songInf;
Θα περάσουμε τη λίστα τραγουδιών από την κύρια κλάση Activity
και θα χρησιμοποιήσουμε το LayoutInflater
για να αντιστοιχίσουμε τις συμβολοσειρές τίτλου και καλλιτέχνη με το TextViews
στη διάταξη τραγουδιού που δημιουργήσαμε.
Μετά τις μεταβλητές στιγμιοτύπου, δώστε στον προσαρμογέα μια μέθοδο κατασκευαστή για να τις αρχικοποιήσετε:
public SongAdapter(Context c, ArrayList<Song> theSongs){ songs=theSongs; songInf=LayoutInflater.from(c); }
Τροποποιήστε το περιεχόμενο της μεθόδου getCount
για να επιστρέφει το μέγεθος της λίστας:
@Override public int getCount() { return songs.size(); }
Μπορείτε να αφήσετε τις μεθόδους getItem
και getItemId
ανέγγιχτες. Ενημερώστε την υλοποίηση της μεθόδου getView
, όπως φαίνεται παρακάτω:
@Override public View getView(int position, View convertView, ViewGroup parent) { //map to song layout LinearLayout songLay = (LinearLayout)songInf.inflate (R.layout.song, parent, false); //get title and artist views TextView songView = (TextView)songLay.findViewById(R.id.song_title); TextView artistView = (TextView)songLay.findViewById(R.id.song_artist); //get song using position Song currSong = songs.get(position); //get title and artist strings songView.setText(currSong.getTitle()); artistView.setText(currSong.getArtist()); //set position as tag songLay.setTag(position); return songLay; }
Θέτουμε το κείμενο τίτλου και καλλιτέχνη ανακτώντας το σωστό στιγμιότυπο της Song
από τη λίστα χρησιμοποιώντας το δείκτη θέσης, αντιστοιχίζοντας αυτές τις συμβολοσειρές στις προβολές που έχουμε προσθέσει στο αρχείο διάταξης τραγουδιών. Θέτουμε επίσης τη θέση ως το view tag, που θα μας επιτρέψει να παίζουμε το σωστό τραγούδι, όταν ο χρήστης κάνει κλικ σε ένα στοιχείο από τη λίστα. Θυμηθείτε ότι το αρχείο διάταξης song.xml περιλάμβανε μια ιδιότητα OnClick
. Θα χρησιμοποιήσουμε τη μέθοδο που αναφέρεται εδώ για να ανακτήσουμε το tag στην Activity
.
Βήμα 3
Πίσω στην κύρια κλάση Activity
, στη μέθοδο onCreate
μετά τη διαλογή της λίστας, δημιουργήστε ένα νέο στιγμιότυπο της κλάσης Adapter
και θέστε το σε ListView
:
SongAdapter songAdt = new SongAdapter(this, songList); songView.setAdapter(songAdt);
Όταν εκτελείτε την εφαρμογή, θα πρέπει να παρουσιάζει τη λίστα των τραγουδιών στη συσκευή, κάνοντας κλικ επάνω τους θα κάνει την εφαρμογή να πετάει μια εξαίρεση προς το παρόν, αλλά θα υλοποιήσουμε τη λειτουργία χειρισμού κλικ στο επόμενο tutorial.
Συμπέρασμα
Έχουμε ρυθμίσει τώρα την εφαρμογή να διαβάζει τραγούδια από τη συσκευή του χρήστη. Στο επόμενο μέρος, θα ξεκινάμε την αναπαραγωγή όταν ο χρήστης επιλέγει ένα τραγούδι που χρησιμοποιώντας την κλάση MediaPlayer
. Θα υλοποιήσουμε την αναπαραγωγή χρησιμοποιώντας μια κλάση Service
, έτσι ώστε να συνεχίζει καθώς ο χρήστης αλληλεπιδρά με άλλες εφαρμογές. Τέλος, θα χρησιμοποιήσουμε μια κλάση MediaController
για να δώσουμε στο χρήστη τον έλεγχο της αναπαραγωγής.