Crea un lettore musicale su Android riproduzione di brani

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.

Alla ricerca di una soluzione rapida?

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 Android

Oppure, 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.

introduzione

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..

1. Creare un servizio

Passo 1

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;

Passo 2

Aggiungi le seguenti variabili di istanza al nuovo Servizio classe:

// lettore MediaPlayer privato di media player; // elenco brani privato ArrayList canzoni; // 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 ();

Passaggio 3

È ora di aggiungere un metodo al Servizio classe per passare la lista di canzoni dal Attività:

public void setList (ArrayList theSongs) 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.

2. Avviare il servizio

Passo 1

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.

Passo 2

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.

3. Inizia la riproduzione

Passo 1

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 ();

Passo 2

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.

Passaggio 3

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.

Conclusione

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.