In questa serie, stiamo creando un lettore musicale su Android utilizzando il Media Player
e MediaController
classi. Nella prima parte, abbiamo creato l'app e preparato l'interfaccia utente per la riproduzione. Abbiamo presentato l'elenco di brani sul dispositivo dell'utente e specificato un metodo da eseguire quando l'utente effettua una selezione. In questa parte della serie, implementeremo a Servizio
classe per eseguire continuamente la riproduzione musicale, anche quando l'utente non interagisce direttamente con l'applicazione.
Questa serie ti porta attraverso l'intero processo di creazione di un lettore musicale Android da zero, ma un'altra opzione è quella di utilizzare uno dei modelli di app del lettore musicale su Envato Market, come Android Music Player, che consente agli utenti di sfogliare e riprodurre musica per album, artisti, canzoni, playlist, cartelle e artisti dell'album.
Lettore musicale AndroidOppure, per un aiuto più personalizzato, puoi assumere uno sviluppatore di app per dispositivi mobili su Envato Studio. In questo modo, puoi ottenere un aiuto affidabile e conveniente su qualsiasi aspetto del lavoro di sviluppo con cui non ti senti a tuo agio e concentrare le tue energie e il tuo tempo nelle aree in cui sei più forte.
Avremo bisogno dell'app per legare alla musica Servizio
per interagire con la riproduzione, così imparerai alcuni degli aspetti di base del Servizio
ciclo di vita in questo tutorial se non li hai mai esplorati prima. Ecco un'anteprima del risultato finale a cui stiamo lavorando:
Nell'ultima parte di questa serie, aggiungeremo il controllo dell'utente sulla riproduzione e ci assicureremo che l'app continui a funzionare in vari stati di applicazione. Successivamente, seguiremo la serie con ulteriori miglioramenti che potreste desiderare di aggiungere, come il controllo dell'audio, la riproduzione di video e streaming multimediale e vari modi di presentare i file multimediali..
Aggiungi una nuova classe alla tua app, nominandola Musicservice o un altro nome a tua scelta. Assicurati che corrisponda al nome che hai elencato nel Manifesto. Quando crei la classe in Eclipse, scegli android.app.Service
come sua superclasse. Eclipse dovrebbe inserire uno schema:
public class MusicService estende il servizio @Override public IBinder onBind (Intent arg0) // TODO Metodo generato automaticamente stub return null;
Estendi la linea di apertura della dichiarazione di classe per implementare alcune interfacce che useremo per la riproduzione musicale:
public class MusicService estende Service implementa MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener
Eclipse visualizzerà un errore sul nome della classe. Passa il mouse sopra l'errore e scegli Aggiungi metodi non implementati. Aggiungeremo il codice ai metodi in pochi istanti. Le interfacce che stiamo implementando aiuteranno il processo di interazione con il Media Player
classe.
La tua classe avrà anche bisogno delle seguenti importazioni aggiuntive:
import java.util.ArrayList; importare android.content.ContentUris; import android.media.AudioManager; import android.media.MediaPlayer; import android.net.Uri; importa android.os.Binder; import android.os.PowerManager; import android.util.Log;
Aggiungi le seguenti variabili di istanza al nuovo Servizio
classe:
// lettore MediaPlayer privato di media player; // elenco brani privato ArrayListcanzoni; // posizione corrente private int songPosn;
Passeremo la lista delle canzoni nel Servizio
classe, giocando da esso usando il Media Player
classe e tenere traccia della posizione della canzone corrente utilizzando il songPosn
variabile di istanza. Ora, implementa il onCreate
metodo per il Servizio
:
public void onCreate () // crea il servizio
Dentro onCreate
, chiama il metodo superclasse, istanziando la posizione e Media Player
variabili di istanza:
// crea il servizio super.onCreate (); // initialize position songPosn = 0; // crea player player = new MediaPlayer ();
Quindi, aggiungiamo un metodo per inizializzare il Media Player
classe, dopo il onCreate
metodo:
public void initMusicPlayer () // imposta le proprietà del player
All'interno di questo metodo, configuriamo il lettore musicale impostando alcune delle sue proprietà come mostrato di seguito:
player.setWakeMode (getApplicationContext (), PowerManager.PARTIAL_WAKE_LOCK); player.setAudioStreamType (AudioManager.STREAM_MUSIC);
Il wake lock consentirà la riproduzione continua quando il dispositivo diventa inattivo e impostiamo il tipo di streaming sulla musica. Imposta la classe come ascoltatore per (1) quando il Media Player
l'istanza è preparata, (2) quando una canzone ha completato la riproduzione e quando (3) viene generato un errore:
player.setOnPreparedListener (questo); player.setOnCompletionListener (questo); player.setOnErrorListener (questo);
Si noti che questi corrispondono alle interfacce che abbiamo implementato. Aggiungeremo il codice al onPrepared
, al termine
, e onError
metodi per rispondere a questi eventi. Di nuovo dentro onCreate
, invocare initMusicPlayer
:
initMusicPlayer ();
È ora di aggiungere un metodo al Servizio
classe per passare la lista di canzoni dal Attività
:
public void setList (ArrayListtheSongs) songs = theSongs;
Chiameremo questo metodo più avanti nel tutorial. Questo farà parte dell'interazione tra il Attività
e Servizio
classi, per le quali abbiamo anche bisogno di un Legante
esempio. Aggiungi il seguente snippet al Servizio
classe dopo il scaletta
metodo:
public class MusicBinder estende Binder MusicService getService () return MusicService.this;
Accederemo anche a questo dal Attività
classe.
Di nuovo nella principale della tua app Attività
classe, dovrai aggiungere le seguenti importazioni aggiuntive:
importa android.os.IBinder; import android.content.ComponentName; importare android.content.Context; import android.content.Intent; importare android.content.ServiceConnection; importa android.view.MenuItem; importa android.view.View;
E dovrai anche dichiarare tre nuove variabili di istanza:
MusicService privato musicSrv; intento di intento privato; private boolean musicBound = false;
Suoneremo la musica nel Servizio
classe, ma controllarlo dal Attività
classe, dove opera l'interfaccia utente dell'applicazione. Per realizzare questo, dovremo legarci al Servizio
classe. Le variabili di istanza di cui sopra rappresentano il Servizio
classe e Intento
, così come una bandiera per tenere traccia di se il Attività
la classe è legata al Servizio
classe o no. Aggiungi il seguente al tuo Attività
classe, dopo il onCreate
metodo:
// connettersi al servizio ServiceConnection privato musicConnection = new ServiceConnection () @Override public void onServiceConnected (Nome ComponentName, servizio IBinder) MusicBinder binder = (MusicBinder) servizio; // get service musicSrv = binder.getService (); // pass list musicSrv.setList (songList); musicBound = true; @Override public void onServiceDisconnected (ComponentName name) musicBound = false; ;
I metodi di callback informeranno la classe quando il Attività
l'istanza si è connessa correttamente al Servizio
esempio. Quando ciò accade, otteniamo un riferimento al Servizio
istanza in modo che il Attività
può interagire con esso. Inizia chiamando il metodo per passare la lista dei brani. Abbiamo impostato la bandiera booleana per tenere traccia dello stato di associazione. Dovrai importare il Legante
classe che abbiamo aggiunto al Servizio
classe nella parte superiore del tuo Attività
classe:
import com.example.musicplayer.MusicService.MusicBinder;
Non dimenticare di modificare il pacchetto e i nomi delle classi per adattarli al tuo se necessario.
Vogliamo iniziare il Servizio
istanza quando il Attività
l'istanza inizia, quindi sovrascrivi il onStart
metodo:
@Override protected void onStart () super.onStart (); if (playIntent == null) playIntent = new Intent (this, MusicService.class); bindService (playIntent, musicConnection, Context.BIND_AUTO_CREATE); StartService (playIntent);
Quando il Attività
l'istanza inizia, creiamo il Intento
oggetto se non esiste ancora, legalo ad esso e avvialo. Modificare il codice se si sceglie un nome diverso per Servizio
classe. Si noti che utilizziamo l'oggetto di connessione che abbiamo creato in modo tale che quando la connessione al collegamento Servizio
l'istanza è fatta, passiamo la lista dei brani. Saremo anche in grado di interagire con il Servizio
istanza per controllare la riproduzione più tardi.
Torna al tuo Servizio
classe per completare questo processo vincolante. Aggiungi una variabile di istanza che rappresenta l'interno Legante
classe abbiamo aggiunto:
private final IBinder musicBind = new MusicBinder ();
Ora modifica il onBind
metodo per restituire questo oggetto:
@Override public IBinder onBind (Intent intent) return musicBind;
Aggiungi il onUnbind
metodo per rilasciare risorse quando il Servizio
l'istanza non è associata:
@Override public boolean onUnbind (Intent intent) player.stop (); player.release (); restituisce falso;
Questo verrà eseguito quando l'utente esce dall'app, a quel punto interromperà il servizio.
Ora impostiamo l'app per riprodurre una traccia. Nel tuo Servizio
classe, aggiungere il seguente metodo:
public void playSong () // riproduce un brano
All'interno del metodo, iniziare resettando il Media Player
poiché utilizzeremo questo codice anche quando l'utente sta riproducendo i brani successivi:
player.reset ();
Quindi, prendi la canzone dalla lista, estrai l'ID usando la sua Canzone
oggetto e modellarlo come un URI:
// ottiene la canzone Song playSong = songs.get (songPosn); // ottiene id long currSong = playSong.getID (); // imposta uri Uri trackUri = ContentUris.withAppendedId (android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, currSong);
Ora possiamo provare a impostare questo URI come origine dati per il Media Player
istanza, ma può essere generata un'eccezione se si verifica un errore, quindi usiamo a prova a prendere
bloccare:
prova player.setDataSource (getApplicationContext (), trackUri); catch (Exception e) Log.e ("MUSIC SERVICE", "Errore nell'impostazione dell'origine dati", e);
Dopo il catturare
bloccare, completare il playSong
metodo chiamando il metodo asincrono di Media Player
per prepararlo:
player.prepareAsync ();
Quando il Media Player
è preparato, il onPrepared
il metodo sarà eseguito. Eclipse dovrebbe averlo inserito nel tuo Servizio
classe. All'interno di questo metodo, avvia la riproduzione:
@Override public void onPrepared (MediaPlayer mp) // avvia la riproduzione mp.start ();
Per consentire all'utente di selezionare le canzoni, abbiamo anche bisogno di un metodo nel Servizio
classe per impostare la canzone corrente. Aggiungilo ora:
public void setSong (int songIndex) songPosn = songIndex;
Chiameremo questo quando l'utente sceglie una canzone dalla lista.
Ricorda che abbiamo aggiunto un al clic
attributo al layout per ciascun elemento nell'elenco dei brani. Aggiungi quel metodo al principale Attività
classe:
public void songPicked (Visualizza vista) musicSrv.setSong (Integer.parseInt (view.getTag (). toString ())); musicSrv.playSong ();
Abbiamo impostato la posizione della canzone come tag per ogni elemento nella visualizzazione elenco quando abbiamo definito il Adattatore
classe. Lo recuperiamo qui e lo passiamo al Servizio
istanza prima di chiamare il metodo per avviare la riproduzione.
Prima di eseguire la tua app, implementa il fine pulsante che abbiamo aggiunto al menu principale. Nel tuo principale Attività
classe, aggiungi il metodo per rispondere alla selezione della voce di menu:
@Override pubblico booleano onOptionsItemSelected (voce MenuItem) // voce di menu selezionata
All'interno del metodo, aggiungi un'istruzione switch per le azioni:
switch (item.getItemId ()) case R.id.action_shuffle: // shuffle break; caso R.id.action_end: stopService (playIntent); musicSrv = null; System.exit (0); rompere; return super.onOptionsItemSelected (item);
Implementeremo la funzione shuffle nel prossimo tutorial. Per il fine pulsante, fermiamo il Servizio
istanza e uscire dall'app. Premendo il pulsante Indietro non si esce dall'app, poiché supponiamo che l'utente voglia continuare la riproduzione a meno che non selezioni il fine pulsante. Utilizza la stessa procedura se l'app viene distrutta, ignorando quelle dell'attività OnDestroy
metodo:
@Override protected void onDestroy () stopService (playIntent); musicSrv = null; super.onDestroy ();
Quando esegui l'app a questo punto, sarai in grado di riprodurre i brani selezionandoli dall'elenco e puoi anche uscire dall'app utilizzando il fine pulsante.
Ora abbiamo implementato la riproduzione di base di brani musicali selezionati dall'elenco di file musicali dell'utente. Nella parte finale di questa serie, aggiungeremo un controller multimediale attraverso il quale l'utente sarà in grado di controllare la riproduzione. Aggiungeremo una notifica per consentire all'utente di tornare all'app dopo essersi allontanati da esso e faremo alcune pulizie per far sì che l'app faccia fronte a una serie di azioni dell'utente.