Have a car with controls below steering wheel. Buttons are: next/previous track, volume up/down, ok, source. I want catch up Next/Previous track button.
I've tried onKeyDown
in my activity with no luck. Also i've tried BroadcastReceiver
and MediaButtonReceiver
with no effect. Seems that application didn't see any events. Debug possibilities on device is very small, they are absent in fact.
- Is there way to catch such event?
- How in android find some hardware connected to phone. May be some enumerator class for every connected device?
Update 1:
I'd tried:
1.
<receiver
android:name="android.support.v4.media.session.MediaButtonReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
<action android:name="android.media.browse.MediaBrowserService" />
</intent-filter>
</receiver>
<service
android:name=".OrionPlaybackService"
android:enabled="true"
android:exported="true"
tools:ignore="ExportedService">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
<action android:name="android.media.browse.MediaBrowserService" />
</intent-filter>
</service>
public class OrionPlaybackService extends MediaBrowserServiceCompat {
private MediaSessionCompat mediaSessionCompat;
...
private final MediaSessionCompat.Callback callback = new
MediaSessionCompat.Callback() {
...
@Override
public boolean onMediaButtonEvent(Intent mediaButtonEvent) {
Toast.makeText(getBaseContext(), "onMediaButtonEvent", Toast.LENGTH_SHORT).show();
Log.d(static_variables.TAG, "onMediaButtonEvent");
static_functions.addLocalLogRecord(getApplicationContext(), "onMediaButtonEvent");
return super.onMediaButtonEvent(mediaButtonEvent);
}
...
}
@Override
public void onCreate() {
Toast.makeText(getBaseContext(), "Service created", Toast.LENGTH_SHORT).show();
Log.d(static_variables.TAG, "Service created");
static_functions.addLocalLogRecord(getApplicationContext(), "Service created");
if (mediaSessionCompat==null) {
mediaSessionCompat = new MediaSessionCompat(getApplicationContext(), "OrionPlaybackService");
mediaSessionCompat.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
mediaSessionCompat.setCallback(callback);
mediaSessionCompat.setActive(true);
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(getBaseContext(), "Command received", Toast.LENGTH_SHORT).show();
Log.d(static_variables.TAG, "Command received");
static_functions.addLocalLogRecord(getApplicationContext(), "Command received");
MediaButtonReceiver.handleIntent(mediaSessionCompat, intent);
return super.onStartCommand(intent, flags, startId);
}
}
Create Receiver programatically, using
createReceiver.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON); //intentFilter.setPriority(Integer.MAX_VALUE); intentFilter.setPriority(999); context.registerReceiver(new SteeringWheelReceiver(), intentFilter); } });
with two priorities 999 and 7FFF FFFF.
Create receiver with
createReceiver2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); ComponentName mReceiverComponent = new ComponentName(context, SteeringWheelReceiver.class); audioManager.registerMediaButtonEventReceiver(mReceiverComponent); Toast.makeText(context, "Receiver 2 registered", Toast.LENGTH_SHORT).show(); } });
Create receiver with
createReceiver3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); ComponentName mReceiverComponent = new ComponentName(context, OrionPlaybackService.class); audioManager.registerMediaButtonEventReceiver(mReceiverComponent); Toast.makeText(context, "Receiver 3 registered", Toast.LENGTH_SHORT).show(); } });
My class SteeringWheel were
public class SteeringWheelReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "onMediaButtonEvent", Toast.LENGTH_SHORT).show();
Log.d(static_variables.TAG, "onMediaButtonEvent");
static_functions.addLocalLogRecord(context, "onMediaButtonEvent");
}
}
Test buttons Were
sendBroadcast.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON); context.sendBroadcast(intent); } }); emulateMedia.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY); audioManager.dispatchMediaKeyEvent(keyEvent); keyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PLAY); audioManager.dispatchMediaKeyEvent(keyEvent); } });
So when I do nothing, or create receiver with one of variants(no matter) when I click any of
Test buttons
i see toast, log message and other. When I try pressNext track
on steering wheel I have no message. Like nothing happens and.- It's not Media buttons? But what? USB numerator shows me two devices 1. Modem 2. Flash card. Input devices show me 3 devices, touch screen, something else? no matter, and
rk29-keypad
- i suppose that's my device. - VLC player working with media buttons with no problems. VLC have an open source. But copy/paste(see methods above) gives me nothing.
I'm starting believe in miracles...