media playback

13
Media Playback Neste documento 1. O Básico 2. Declarações de manifesto 3. Usando MediaPlayer 1. Preparação Asynchronous 2. Gerenciando o Estado 3. Liberar o MediaPlayer 4. Usando um serviço com MediaPlayer 1. Correndo de forma assíncrona 2. Tratamento de erros assíncronos 3. Usando fechaduras vigília 4. Correndo como um serviço de primeiro plano 5. Manipulando o foco de áudio 6. Executar a limpeza 5. Manuseio da Intenção AUDIO_BECOMING_NOISY 6. Recuperando de mídia a partir de um resolvedor de Conteúdo Classes principais 1. MediaPlayer 2. AudioManager 3. SoundPool Ver também 1. JetPlayer 2. Captura de Áudio 3. Android Formatos de mídia 4. Armazenamento de Dados O Android framework multimídia inclui suporte para jogar variedade comuns, de modo que você pode facilmente integrar vídeo, áudio e i aplicações. Você pode reproduzir áudio ou vídeo a partir de arquivos de mídia armazenados em recursos do seu aplicativo (recursos-primas), autônomos no sistema de arquivos, ou a partir de um fluxo de dados de uma conexão de rede, todos usando MediaPlayer APIs. Este documento mostra como escrever um aplicativo de mídia-playing usuário eo sistema, a fim de obter um bom desempenho e uma experiê agradável. Nota: Você pode reproduzir os dados de áudio para o dispositivo de Atualmente, esse é o alto-falante dispositivo móvel ou um fone de Você não pode reproduzir ficheiros de som no áudio da conversa dur

Upload: judson-porto

Post on 21-Jul-2015

189 views

Category:

Documents


0 download

TRANSCRIPT

Media PlaybackNeste documento1. O Bsico 2. Declaraes de manifesto 3. Usando MediaPlayer 1. Preparao Asynchronous 2. Gerenciando o Estado 3. Liberar o MediaPlayer 4. Usando um servio com MediaPlayer 1. Correndo de forma assncrona 2. Tratamento de erros assncronos 3. Usando fechaduras viglia 4. Correndo como um servio de primeiro plano 5. Manipulando o foco de udio 6. Executar a limpeza 5. Manuseio da Inteno AUDIO_BECOMING_NOISY 6. Recuperando de mdia a partir de um resolvedor de Contedo

Classes principais1. MediaPlayer 2. AudioManager 3. SoundPool

Ver tambm1. 2. 3. 4. JetPlayer Captura de udio Android Formatos de mdia Armazenamento de Dados

O Android framework multimdia inclui suporte para jogar variedade de tipos de mdia comuns, de modo que voc pode facilmente integrar vdeo, udio e imagens em suas aplicaes. Voc pode reproduzir udio ou vdeo a partir de arquivos de mdia armazenados em recursos do seu aplicativo (recursos-primas), a partir de arquivos autnomos no sistema de arquivos, ou a partir de um fluxo de dados que chegam atravs de uma conexo de rede, todos usando MediaPlayer APIs. Este documento mostra como escrever um aplicativo de mdia-playing que interage com o usurio eo sistema, a fim de obter um bom desempenho e uma experincia de usurio agradvel. Nota: Voc pode reproduzir os dados de udio para o dispositivo de sada padro. Atualmente, esse o alto-falante dispositivo mvel ou um fone de ouvido Bluetooth. Voc no pode reproduzir ficheiros de som no udio da conversa durante uma chamada.

O BsicoAs seguintes classes so utilizados para reproduzir som e vdeo no mbito Android:MediaPlayer

Esta classe a API primria para reproduzir som e vdeo.AudioManager

Essa classe gerencia as fontes de udio e sada de udio em um dispositivo.

Declaraes de manifestoAntes de iniciar o desenvolvimento de seu aplicativo usando o MediaPlayer, verifique se o manifesto tem as declaraes apropriadas para permitir o uso de recursos relacionados.

Permisso Internet - Se voc estiver usando o MediaPlayer para fluxo de rede baseada em contedo, o aplicativo deve solicitar acesso rede.

Acorde Permisso Lock - Se o seu aplicativo jogador precisa para manter a tela a partir de escurecimento ou o processador de dormir, ou usa o MediaPlayer.setScreenOnWhilePlaying() ou MediaPlayer.setWakeMode() mtodos, voc deve solicitar esta permisso.

Usando MediaPlayerUm dos componentes mais importantes do quadro de mdia o MediaPlayer classe. Um objeto desta classe pode buscar, decodificar e reproduzir udio e vdeo com configurao mnima. Ele suporta vrias fontes diferentes de mdia, tais como:

Os recursos locais URIs internos, como aquele que voc pode obter a partir de um resolvedor de Contedo URLs externos (streaming)

Para obter uma lista de formatos de mdia que suporta Android, consulte o Android Mdia suportada Formatos documento. Aqui est um exemplo de como reproduzir o udio que est disponvel como um recurso prima local (salvo em seu aplicativo res/raw/ diretrio):MediaPlayer MediaPlayer = MediaPlayer.create (contexto, R.raw.sound_file_1); mediaPlayer.start () / / no precisa chamar prepare (), criar () faz isso para voc

Neste caso, um recurso "raw" um arquivo que o sistema no tenta analisar de forma particular. No entanto, o contedo deste recurso no deve ser de udio em bruto. Deve ser

um devidamente codificado e formatado arquivo de mdia em um dos formatos suportados. E aqui est como voc pode jogar a partir de um URI disponvel localmente no sistema (que voc obteve atravs de um resolvedor de contedo, por exemplo):Uri myUri = .... / / inicializar Uri aqui MediaPlayer MediaPlayer MediaPlayer = new (); mediaPlayer.setAudioStreamType (AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource (getApplicationContext (), myUri); mediaPlayer.prepare (); mediaPlayer.start ();

Jogando a partir de uma URL remota via HTTP streaming parecido com este:String url = "http:// ........" / / sua URL aqui MediaPlayer MediaPlayer MediaPlayer = new (); mediaPlayer.setAudioStreamType (AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource (url); mediaPlayer.prepare () / / pode demorar muito! (Para tamponamento, etc) mediaPlayer.start ();

Nota: Se voc est passando uma URL para transmitir um arquivo de mdia online, o arquivo deve ser capaz de download progressivo. Ateno: Voc deve pegar ou passar IllegalArgumentException e IOException ao usar setDataSource() , porque o arquivo que voc est citando no poderia existir.

Preparao AsynchronousUsando MediaPlayer pode ser simples, em princpio. No entanto, importante manter em mente que mais algumas coisas so necessrias para integr-lo corretamente com uma aplicao Android tpico. Por exemplo, a chamada para prepare() pode levar um longo tempo para executar, porque pode envolver a busca e decodificao dos dados de mdia. Ento, como o caso com qualquer mtodo que pode levar muito tempo para executar, voc nunca deve cham-lo de fio a aplicao da interface do usurio. Fazendo isso far com que a interface do usurio para pendurar at o retorno do mtodo, que uma experincia de usurio muito ruim e pode causar uma ANR (aplicativo no est respondendo) erro. Mesmo se voc espera que o seu recurso para carregar rapidamente, lembre-se que tudo o que leva mais de um dcimo de segundo para responder a interface do usurio far uma pausa visvel e dar ao usurio a impresso de que sua aplicao lenta. Para evitar pendurar seu segmento interface do usurio, gerar um outro segmento para preparar o MediaPlayer e notificar o segmento principal quando terminar. No entanto, enquanto voc poderia escrever a lgica de segmentao-se, este padro to comum quando se utiliza MediaPlayer que o quadro fornece uma maneira conveniente para realizar essa tarefa usando o prepareAsync() mtodo. Este mtodo comea a preparar os meios de comunicao em segundo plano e retorna imediatamente. Quando a mdia feita a preparao, o onPrepared() mtodo da MediaPlayer.OnPreparedListener , configurado atravs setOnPreparedListener() chamado.

Gerenciando o EstadoOutro aspecto de um MediaPlayer que voc deve ter em mente que baseado no estado. Ou seja, o MediaPlayer tem um estado interno que voc sempre deve estar ciente de quando escrever seu cdigo, porque determinadas operaes s so vlidos quando o ento jogador est em estados especficos. Se voc executar uma operao, enquanto no estado errado, o sistema pode lanar uma exceo ou causar outros comportamentos indesejveis. A documentao no MediaPlayer classe mostra um diagrama completo estado, que esclarece que os mtodos de mover o MediaPlayer de um estado para outro. Por exemplo, quando voc cria um novo MediaPlayer , no estado Idle. Nesse ponto, voc dever inicializa-lo chamando setDataSource() , trazendo-a para o estado inicializado. Depois disso, voc tem que prepar-lo usando o prepare() ou prepareAsync() mtodo. Quando o MediaPlayer feita a preparao, ele ir entrar no estado de preparada, o que significa que voc pode chamar start() para torn-lo jogar os meios de comunicao. Nesse ponto, como ilustra o diagrama, voc pode mover-se entre os estados em curso, em pausa e PlaybackCompleted chamando mtodos, tais como start() , pause() , e seekTo() , entre outros. Quando voc chama stop() , no entanto, perceber que voc no pode chamar start() novamente at que voc preparar o MediaPlayer novamente. Sempre mantenha o diagrama de estado em mente ao escrever o cdigo que interage com um MediaPlayer objeto, porque chamar seus mtodos do estado errado uma causa comum de bugs.

Liberar o MediaPlayerA MediaPlayer pode consumir recursos valiosos do sistema. Portanto, voc deve sempre tomar precaues extras para garantir que no esto pendurados em um MediaPlayer exemplo mais do que o necessrio. Quando voc feito com ele, voc deve sempre chamar release() para ter certeza de qualquer sistema de recursos que lhe so atribudos so lanadas corretamente. Por exemplo, se voc estiver usando um MediaPlayer e sua atividade recebe uma chamada para onStop() , voc deve liberar o MediaPlayer , porque faz pouco sentido para segur-lo enquanto sua atividade no est interagindo com o usurio (a menos que voc est jogando mdia no fundo, que ser discutido na prxima seo). Quando sua atividade retomada ou reiniciado, claro, voc precisa criar um novo MediaPlayer e prepar-lo novamente antes de retomar a reproduo. Veja como voc deve liberar e ento anular seu MediaPlayer :mediaPlayer.release (); MediaPlayer = null;

Como exemplo, considere os problemas que poderiam acontecer se voc se esqueceu de liberar o MediaPlayer quando sua atividade interrompida, mas criar uma nova quando a atividade comea de novo. Como voc deve saber, quando o usurio altera a orientao da tela (ou alteraes da configurao do dispositivo de outra maneira), o sistema que gere as reiniciando a actividade (por padro), ento voc pode rapidamente consumir todos os recursos do sistema como o usurio gira o dispositivo e para trs entre retrato e paisagem, pois a cada mudana de orientao, voc cria um novo MediaPlayer que voc

nunca liberar. (Para mais informaes sobre reincios de tempo de execuo, consulte Tratamento de alteraes em tempo de execuo .) Voc pode estar se perguntando o que acontece se voc quiser continuar jogando "media" de fundo, mesmo quando o usurio deixa a sua actividade, muito da mesma forma que a aplicao Msica built-in se comporta. Neste caso, o que voc precisa de um MediaPlayer controlado por um Service , como discutido em Usando um servio com MediaPlayer .

Usando um servio com MediaPlayerSe voc quiser que os seus meios de comunicao para tocar no fundo, mesmo quando o aplicativo no est na tela, isto , voc quer continuar a jogar enquanto o usurio est interagindo com aplicaes de outros ento voc deve iniciar um Service e controlar o MediaPlayer exemplo de l. Voc deve ter cuidado com esta configurao, porque o usurio eo sistema tm expectativas sobre como um aplicativo em execuo um servio de fundo deve interagir com o resto do sistema. Se o aplicativo no responder a essas expectativas, o usurio pode ter uma m experincia. Esta seo descreve as principais questes que voc deve estar ciente de e oferece sugestes sobre como abord-los.

Correndo de forma assncronaPrimeiro de tudo, como uma Activity , todo o trabalho em um Service feito em uma nica thread por padro, na verdade, se voc estiver executando uma atividade e um servio da mesma aplicao, eles usam o mesmo segmento (o thread "main ") por padro. Portanto, os servios precisam processar as intenes de entrada rapidamente e nunca realizar clculos extensos quando responder a elas. Se todo o trabalho pesado ou chamadas de bloqueio so esperados, voc deve fazer essas tarefas de forma assncrona: ou de outro segmento de implementar-se, ou usando muitas facilidades, o quadro para o processamento assncrono. Por exemplo, ao usar um MediaPlayer do seu segmento principal, voc deve chamar prepareAsync() ao invs de prepare() , e implementar um MediaPlayer.OnPreparedListener para ser notificado quando a preparao completa e voc pode comear a jogar. Por exemplo:MyService public class MediaPlayer.OnPreparedListener implementos Servio { ACTION_PLAY private static final = "com.example.action.PLAY"; MediaPlayer mMediaPlayer = null; public int onStartCommand (inteno Intent, int flags, int startID) { ... if (intent.getAction (). igual a (ACTION_PLAY)) { mMediaPlayer = ... / / Inicializa-lo aqui mMediaPlayer.setOnPreparedListener (this); mMediaPlayer.prepareAsync () / / async preparar para no bloquear thread principal } }

/ ** Chamado quando MediaPlayer est pronto * / public void onPrepared (MediaPlayer player) { Player.start (); } }

Tratamento de erros assncronosEm operaes sncronas, os erros, normalmente, seria sinalizado com uma exceo ou um cdigo de erro, mas sempre que voc usar os recursos assncronos, voc deve se certificar que seu aplicativo notificado de erros de forma apropriada. No caso de um MediaPlayer , voc pode fazer isso implementando um MediaPlayer.OnErrorListener e defini-lo em seu MediaPlayer exemplo:MyService public class MediaPlayer.OnErrorListener implementos Servio { MMediaPlayer MediaPlayer; initMediaPlayer public void () { / / ... Inicializar o MediaPlayer aqui ... } mMediaPlayer.setOnErrorListener (this);

@ Override public boolean onError (MediaPlayer mp, que int, int extra) { / / ... reagir adequadamente ... / / O MediaPlayer mudou-se para o estado de erro, deve ser reajustado! } }

importante lembrar que quando ocorre um erro, o MediaPlayer passa para o estado de erro (veja a documentao para o MediaPlayer classe para o diagrama de estado completo) e voc deve reinici-lo antes que voc possa us-lo novamente.

Usando fechaduras vigliaAo projetar aplicativos que desempenham mdia no fundo, o dispositivo pode ir dormir enquanto o servio est sendo executado. Como o sistema Android tenta economizar bateria enquanto o dispositivo est dormindo, o sistema tenta desligar qualquer uma das funes do telefone que no so necessrias, incluindo a CPU eo hardware Wi-Fi. No entanto, se o servio est jogando ou streaming de msica, voc quer evitar que o sistema de interferir com a sua reproduo. A fim de garantir que o servio continua a ser executado sob essas condies, voc tem que usar "travas de viglia." Um bloqueio de wake uma forma de sinalizar para o sistema que seu aplicativo est usando algum recurso que deve ficar disponvel, mesmo se o telefone estiver ocioso. Aviso: Voc deve sempre usar bloqueios viglia com moderao e mant-los apenas durante o tempo que realmente necessrio, porque eles reduzem significativamente a vida til da bateria do dispositivo.

Para garantir que a CPU continua funcionando enquanto o MediaPlayer est jogando, ligue para o setWakeMode() mtodo ao inicializar o MediaPlayer . Uma vez que voc fizer isso, o MediaPlayer mantm o bloqueio especificado enquanto joga e libera a trava quando pausado ou parado:mMediaPlayer = new MediaPlayer (); / / ... outra inicializao aqui ... mMediaPlayer.setWakeMode (getApplicationContext (), PowerManager.PARTIAL_WAKE_LOCK);

No entanto, o bloqueio de esteira adquirida neste exemplo garante apenas que a CPU permanece acordado. Se voc estiver streaming de mdia atravs da rede e voc estiver usando Wi-Fi, voc provavelmente vai querer manter um WifiLock bem, que voc deve adquirir e liberar manualmente. Ento, quando voc comear a preparar o MediaPlayer com o URL remoto, voc deve criar e adquirir o bloqueio de Wi-Fi gratuito. Por exemplo:WifiLock wifiLock = ((WifiManager) getSystemService (Context.WIFI_SERVICE)) . CreateWifiLock (WifiManager.WIFI_MODE_FULL ", mylock"); wifiLock.acquire ();

Quando voc pausa ou parar a sua mdia, ou quando voc no precisar mais da rede, voc deve liberar o bloqueio:wifiLock.release ();

Correndo como um servio de primeiro planoOs servios so muitas vezes utilizados para a realizao de tarefas em segundo plano, como buscar e-mails, sincronizao de dados, download de contedo, entre outras possibilidades. Nestes casos, o usurio no est ativamente ciente da execuo do servio, e provavelmente no iria nem perceber se alguns destes servios foram interrompidos e depois reiniciado. Mas considere o caso de um servio que est a reproduzir msica. Claramente este um servio que o usurio est ativamente ciente ea experincia seria severamente afetado por quaisquer interrupes. Alm disso, um servio que o usurio provavelmente vai querer interagir com durante sua execuo. Neste caso, o servio deve ser executado como um "servio de primeiro plano." Um servio de primeiro plano mantm um nvel mais elevado de importncia dentro do sistema de-o sistema ir quase nunca matar o servio, porque de importncia imediata para o utilizador. Quando rodando em primeiro plano, o servio tambm deve fornecer uma notificao de barra de status para garantir que os usurios esto cientes do servio executado e permitir-lhes abrir uma atividade que pode interagir com o servio. A fim de transformar o seu servio em um servio de primeiro plano, voc deve criar uma Notification para a barra de status e chamada startForeground() do Service . Por exemplo:Cordas songname; / / Atribuir o nome da msica para songname

PendingIntent pi = PendingIntent.getActivity (getApplicationContext (), 0, Inteno novo (getApplicationContext (), MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); Notificao notificao Notificao = new (); notification.tickerText = texto; notification.icon = R.drawable.play0; notification.flags | = Notification.FLAG_ONGOING_EVENT; notification.setLatestEventInfo (getApplicationContext (), "MusicPlayerSample", "Jogar:" + songname, pi); startForeground (NOTIFICATION_ID, notificao);

Enquanto o seu servio est sendo executado em primeiro plano, a notificao que voc configurou visvel na rea de notificao do dispositivo. Se o usurio seleciona a notificao, o sistema chama o PendingIntent que voc forneceu. No exemplo acima, ele abre uma actividade ( MainActivity ). A Figura 1 mostra como a sua notificao exibida para o usurio:

Figura 1. Imagens de notificao de um servio de primeiro plano, mostrando o cone de notificao na barra de status (esquerda) ea viso expandida ( direita). Voc s deve segurar o "plano de servio" enquanto o servio est realmente realizando algo que o usurio est ativamente ciente. Uma vez que j no verdade, voc deve liber-lo chamando stopForeground() :stopForeground (true);

Para mais informaes, consulte a documentao sobre Servios e Notificaes da barra de status .

Manipulando o foco de udioMesmo que apenas uma atividade pode ser executado a qualquer momento, o Android um ambiente de multi-tasking. Isto representa um desafio particular para aplicaes que utilizam udio, porque h apenas uma sada de udio e pode haver vrios servios multimdia que competem para a sua utilizao. Antes Android 2.2, no havia mecanismo

embutido para resolver este problema, o que poderia, em alguns casos levar a uma m experincia do usurio. Por exemplo, quando um usurio est escutando a msica e outro aplicativo precisa notificar o usurio de algo muito importante, o usurio no pode ouvir o tom de notificao devido msica alta. Comeando com Android 2.2, a plataforma oferece uma maneira para aplicaes de negociar o uso de sada de udio do dispositivo. Este mecanismo chamado de focagem de udio. Quando seu aplicativo precisa para sada de udio como a msica ou uma notificao, voc deve sempre solicitar foco de udio. Uma vez que tem o foco, ele pode usar a sada de som livremente, mas deve sempre ouvir as mudanas de foco. Se for notificado de que ela perdeu o foco de udio, ele deve imediatamente, quer matar o udio ou abaix-lo para um nvel de calma (conhecido como "esquivar", h uma bandeira que indica qual o caso) e s retomar a reproduo aps alta ele recebe o foco novamente. Foco de udio de natureza cooperativa. Ou seja, as aplicaes so esperados (e altamente recomendvel) para cumprir as diretrizes foco de udio, mas as regras no so impostas pelo sistema. Se um aplicativo quiser jogar a msica alta, mesmo aps perder o foco de udio, nada no sistema vai impedir isso. No entanto, o usurio tem mais chances de ter uma experincia ruim e ser mais provvel para desinstalar o aplicativo malcomportados. Para solicitar o foco de udio, voc deve chamar requestAudioFocus() do AudioManager , como o exemplo a seguir demonstra:AudioManager AudioManager = getSystemService (AudioManager) (Context.AUDIO_SERVICE); int resultado = audioManager.requestAudioFocus (este, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); if (resultado! = AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { / / No pode receber o foco de udio. }

O

requestAudioFocus() AudioManager.OnAudioFocusChangeListener , cuja onAudioFocusChange()

um mtodo chamado sempre que houver uma alterao no foco de udio. Portanto, voc tambm deve implementar essa interface em seu servio e atividades. Por exemplo:MyService classe estende Servio implementa AudioManager.OnAudioFocusChangeListener { / / .... onAudioFocusChange public void (focusChange int) { / / Faz alguma coisa com base na mudana de foco ... } }

primeiro

parmetro

para

O focusChange parmetro diz-lhe como o foco mudou de udio, e pode ser um dos seguintes valores (todos eles so constantes definidas na AudioManager ): AUDIOFOCUS_GAIN : Voc ganhou o foco de udio. AUDIOFOCUS_LOSS : Voc perdeu o foco de udio por um tempo

presumivelmente longa. Voc deve parar toda a reproduo de udio. Porque voc no deve esperar

para ter o foco de volta por um longo tempo, este seria um bom lugar para limpar seus recursos, tanto quanto possvel. Por exemplo, voc deve liberar o MediaPlayer . AUDIOFOCUS_LOSS_TRANSIENT : Voc perdeu temporariamente o foco de udio, mas deve receb-lo de volta em breve. Voc deve parar toda a reproduo de udio, mas voc pode manter seus recursos, pois voc provavelmente ter o foco de volta em breve. AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK : Voc perdeu temporariamente o foco de udio, mas voc tem permisso para continuar a reproduzir udio em silncio (em um volume baixo) em vez de matar udio completamente.

Aqui est um exemplo de implementao:onAudioFocusChange public void (focusChange int) { switch (focusChange) { AudioManager.AUDIOFOCUS_GAIN caso: / / Retomar a reproduo if (mMediaPlayer == null) initMediaPlayer (); else if mMediaPlayer.start () (mMediaPlayer.isPlaying ()!); mMediaPlayer.setVolume (1.0f, 1.0f); quebrar; AudioManager.AUDIOFOCUS_LOSS caso: / / Perdeu o foco para uma quantidade ilimitada de tempo: parar a reproduo e liberao media player if (mMediaPlayer.isPlaying ()) mMediaPlayer.stop (); mMediaPlayer.release (); mMediaPlayer = null; quebrar; AudioManager.AUDIOFOCUS_LOSS_TRANSIENT caso: / / Perdeu o foco por um tempo curto, mas temos que parar / / Reproduo. Ns no liberar o jogador de mdia, porque a reproduo / / provvel para retomar if (mMediaPlayer.isPlaying ()) mMediaPlayer.pause (); quebrar; AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK caso: / / Perdeu o foco por um tempo curto, mas est ok para continuar a jogar / / A um nvel atenuado if (mMediaPlayer.isPlaying ()) mMediaPlayer.setVolume (0.1f, 0.1f); quebrar; } }

Tenha em mente que o foco APIs de udio esto disponveis apenas com API nvel 8 (Android 2.2) e, acima, portanto, se voc quiser dar suporte as verses anteriores do Android, voc deve adotar uma estratgia de compatibilidade que permite que voc use esse recurso se disponvel, e voltar sem problemas se no. Voc pode obter compatibilidade com verses anteriores, quer chamando os mtodos de foco de udio por reflexo ou atravs da implementao de todas as caractersticas de

foco de udio em uma classe separada (por exemplo, AudioFocusHelper ). Aqui est um exemplo de uma classe:public class AudioFocusHelper implementa AudioManager.OnAudioFocusChangeListener { AudioManager mAudioManager; / / Outros campos aqui, voc provavelmente vai manter uma referncia a uma interface / / Que voc pode usar para comunicar as mudanas de foco para o seu servio pblico AudioFocusHelper (Context ctx, / * outros argumentos aqui * /) { mAudioManager = mContext.getSystemService (AudioManager) (Context.AUDIO_SERVICE); / / ... } public boolean requestFocus () { voltar AudioManager.AUDIOFOCUS_REQUEST_GRANTED == mAudioManager.requestAudioFocus (mContext, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); } public boolean abandonFocus () { voltar AudioManager.AUDIOFOCUS_REQUEST_GRANTED == mAudioManager.abandonAudioFocus (this); } @ Override onAudioFocusChange public void (focusChange int) { / / Deixe o seu servio de saber sobre a mudana de foco }

}

Voc pode criar uma instncia de AudioFocusHelper classe somente se voc detectar que o sistema est funcionando API nvel 8 ou superior. Por exemplo:if (android.os.Build.VERSION.SDK_INT> = 8) { mAudioFocusHelper = new AudioFocusHelper (getApplicationContext (), this); Else {} mAudioFocusHelper = null; }

Executar a limpezaComo mencionado anteriormente, um MediaPlayer objeto pode consumir uma quantidade significativa de recursos do sistema, assim que voc deve mant-lo apenas durante o tempo que precisar e chamar release() quando feito com ele. importante chamar esse mtodo de limpeza explicitamente em vez de confiar no sistema de coleta de lixo, porque isso pode levar algum tempo antes do coletor de lixo recupera o MediaPlayer , porque apenas sensvel s necessidades de memria e no falta de outros meios de comunicao relacionados com os recursos. Assim, no caso quando voc

est usando um servio, voc deve sempre substituir o onDestroy() mtodo para se certificar de que voc est liberando o MediaPlayer :MyService public class {Servio MMediaPlayer MediaPlayer; / / ... @ Override onDestroy public void () { if (mMediaPlayer = null!) mMediaPlayer.release (); }

}

Voc deve sempre olhar para outras oportunidades para lanar o seu MediaPlayer , bem como, para alm de liber-lo ao ser fechado. Por exemplo, se voc espera no ser capaz de reproduzir mdia por um longo perodo de tempo (aps perder o foco de udio, por exemplo), voc deve definitivamente liberar o existente MediaPlayer e cri-lo novamente mais tarde. Por outro lado, se voc s esperar para parar a reproduo de um tempo muito curto, voc provavelmente devem conter em seu MediaPlayer para evitar a sobrecarga de criar e prepar-la novamente.

Manuseio da Inteno AUDIO_BECOMING_NOISYMuitos bem escritos aplicaes que reproduzem udio parar automaticamente a reproduo quando ocorre um evento que faz com que o udio para tornar-se ruidosa (ouput atravs de alto-falantes externos). Por exemplo, isso pode acontecer quando um usurio est escutando a msica atravs de auscultadores e acidentalmente se desconecta os fones de ouvido do aparelho. No entanto, este comportamento no acontece automaticamente. Se voc no implementar este recurso, udio joga fora de alto-falantes externos do dispositivo, que pode no ser o que o usurio quer. Voc pode assegurar que seu aplicativo pra de tocar msica nessas situaes manipulando o ACTION_AUDIO_BECOMING_NOISY inteno, para o qual voc pode registrar um receptor, adicionando o seguinte ao seu manifesto:

Isso registra o MusicIntentReceiver classe como um receptor de difuso para essa inteno. Voc deve ento implementar esta classe:public class MusicIntentReceiver implementa android.content.BroadcastReceiver { @ Override OnReceive public void (Context ctx, a inteno Intent) { if (intent.getAction (). igual a ( android.media.AudioManager.ACTION_AUDIO_BECOMING_NOISY)) { / / Sinalizar o seu servio para parar a reproduo / / (Via uma inteno, por exemplo) }

} }

Recuperando de mdia a partir de um resolvedor de ContedoOutra caracterstica que pode ser til numa aplicao jogador de meios a capacidade de recuperar a msica que o utilizador tem sobre o dispositivo. Voc pode fazer isso consultando a ContentResolver para mdia externa:ContentResolver ContentResolver getContentResolver = (); Uri uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; Cursor cursor = contentResolver.query (uri, null, null, null, null); if (cursor == null) { / / Query falhou, lidar com o erro. } Else if (! Cursor.moveToFirst ()) { / / Nenhuma mdia no dispositivo Else {} int titleColumn = cursor.getColumnIndex (android.provider.MediaStore.Audio.Media.TITLE); int idColumn = cursor.getColumnIndex (android.provider.MediaStore.Audio.Media._ID); fazer { longa UmaID = cursor.getLong (idColumn); Cordas thisTitle = cursor.getString (titleColumn); / / ... Entrada processo ... } While (cursor.moveToNext ()); }

Para utilizar com o MediaPlayer , voc pode fazer isso:id = longo / * recuper-lo de algum lugar * /; Uri contentUri = ContentUris.withAppendedId ( android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id); mMediaPlayer = new MediaPlayer (); mMediaPlayer.setAudioStreamType (AudioManager.STREAM_MUSIC); mMediaPlayer.setDataSource (getApplicationContext (), contentUri); / / ... Preparar e comear ...