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