Estou desenvolvendo um musicPlayer para API 21+. Já integrei o MediaSession, componentes para verificação do foco de audio e etc… mas estou com um problema ao receber eventos de clique. Se meu app é o único player no telefone, funciona perfeitamente mas quando uso o spotify junto, ele sempre intercepta os eventos mesmo que meu app seja aberto dps dele , ele ainda interecepta os eventos e se eu fechar ele e deixar meu app aberto e clicar no botão do fone ele abre de novo… alguem sabe como resolver?
trecho do manifest onde registro o receiver
<receiver android:name=".mediaplayer.MyReceiver">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.MEDIA_BUTTON" />
<action android:name="android.intent.action.USER_PRESENT" /> <!-- screen unlocked -->
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.MEDIA_MOUNTED" />
</intent-filter>
</receiver>
MyReceiver.java
public class MyReceiver extends BroadcastReceiver {
private Intent mIntent;
private Context mContext;
@Override
public void onReceive(Context context, Intent intent) {
mIntent = intent;
mContext = context;
if (Objects.equals(intent.getAction(), Intent.ACTION_MEDIA_BUTTON)) {
handleMediaButton();
} else if (Objects.equals(intent.getAction(), Intent.ACTION_BOOT_COMPLETED)) {
handleBootCompleted();
handleUserPresent();
} else if (Objects.equals(intent.getAction(), Intent.ACTION_USER_PRESENT)) {
handleUserPresent();
} else if (Objects.equals(intent.getAction(), Intent.ACTION_HEADSET_PLUG)) {
verifyHeadsetPlugged();
}
}
private void handleUserPresent() {
MyApp.binder.getApplication().registerReceiver(this,
new IntentFilter(Intent.ACTION_HEADSET_PLUG));
}
private void verifyHeadsetPlugged() {
IntentFilter iFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
Intent iStatus = mContext.registerReceiver(null, iFilter);
if (iStatus == null) return;
boolean isConnected = iStatus.getIntExtra("state", 0) == 1;
if (isConnected) Toast.makeText(mContext, "Headset plugado!", Toast.LENGTH_SHORT).show();
else Toast.makeText(mContext, "Headset desplugado", Toast.LENGTH_SHORT).show();
if (isConnected && MusicService.binder == null) {
mContext.startService(new Intent(mContext, MusicService.class));
}
}
private void handleBootCompleted() {
}
private void handleMediaButton() {
KeyEvent mEvent = mIntent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
MusicService.BindService binder = MusicService.binder;
MusicService musicService = null;
if (binder != null) {
musicService = binder.getService();
}
if (mEvent.getKeyCode() == MusicService.KILL_APP_IF_DISMISS_NOTIFICATION) {
if (musicService != null) {
musicService.stopSelf();
}
} else if (musicService == null) {
Log.d("MyReceiver", "handleMediaButton: iniciando serviço apartir do botao de media");
mContext.startService(new Intent(mContext, MusicService.class));
LocalBroadcastManager.getInstance(MyApp.binder.getApplication()).registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// serviço iniciado!
LocalBroadcastManager.getInstance(MyApp.binder.getApplication()).unregisterReceiver(this);
Log.d("MyReceiver", "onReceive: passando evento para o serviço");
MusicService.binder.getPlayer().toogle();
}
}, new IntentFilter(MainActivity.SERVICE_OK));
} else {
/* analiza o o evento na intent e chama o callback na MyMediaSession
se foi um botão de midia clicado que disparou este broadcastReceiver*/
MusicService.binder.getService().handleMediButton(mIntent);
}
// Log.d("MyReceiver", "onReceive: new command received " + mIntent.getAction() + " : " + mEvent.getKeyCode());
}
}
Já tenho definidos os callbacks no mediaSession para manusear os eventos de midia e não creio que estaja ai o problema. Eu não entendo por que quando meu app esta aberto, na frente e reproduzindo, o android não entrega os eventos pra ele mas sim para outro app.