$$VideoApi21 //============================================================================== public class MediaControllerCallback extends MediaController.Callback { private native void mediaControllerAudioInfoChanged (long host, MediaController.PlaybackInfo info); private native void mediaControllerMetadataChanged (long host, MediaMetadata metadata); private native void mediaControllerPlaybackStateChanged (long host, PlaybackState state); private native void mediaControllerSessionDestroyed (long host); MediaControllerCallback (long hostToUse) { host = hostToUse; } @Override public void onAudioInfoChanged (MediaController.PlaybackInfo info) { mediaControllerAudioInfoChanged (host, info); } @Override public void onMetadataChanged (MediaMetadata metadata) { mediaControllerMetadataChanged (host, metadata); } @Override public void onPlaybackStateChanged (PlaybackState state) { mediaControllerPlaybackStateChanged (host, state); } @Override public void onQueueChanged (List queue) {} @Override public void onSessionDestroyed() { mediaControllerSessionDestroyed (host); } private long host; } //============================================================================== public class MediaSessionCallback extends MediaSession.Callback { private native void mediaSessionPause (long host); private native void mediaSessionPlay (long host); private native void mediaSessionPlayFromMediaId (long host, String mediaId, Bundle extras); private native void mediaSessionSeekTo (long host, long pos); private native void mediaSessionStop (long host); MediaSessionCallback (long hostToUse) { host = hostToUse; } @Override public void onPause() { mediaSessionPause (host); } @Override public void onPlay() { mediaSessionPlay (host); } @Override public void onPlayFromMediaId (String mediaId, Bundle extras) { mediaSessionPlayFromMediaId (host, mediaId, extras); } @Override public void onSeekTo (long pos) { mediaSessionSeekTo (host, pos); } @Override public void onStop() { mediaSessionStop (host); } @Override public void onFastForward() {} @Override public boolean onMediaButtonEvent (Intent mediaButtonIntent) { return true; } @Override public void onRewind() {} @Override public void onSkipToNext() {} @Override public void onSkipToPrevious() {} @Override public void onSkipToQueueItem (long id) {} private long host; } //============================================================================== public class SystemVolumeObserver extends ContentObserver { private native void mediaSessionSystemVolumeChanged (long host); SystemVolumeObserver (Activity activityToUse, long hostToUse) { super (null); activity = activityToUse; host = hostToUse; } void setEnabled (boolean shouldBeEnabled) { if (shouldBeEnabled) activity.getApplicationContext().getContentResolver().registerContentObserver (android.provider.Settings.System.CONTENT_URI, true, this); else activity.getApplicationContext().getContentResolver().unregisterContentObserver (this); } @Override public void onChange (boolean selfChange, Uri uri) { if (uri.toString().startsWith ("content://settings/system/volume_music")) mediaSessionSystemVolumeChanged (host); } private Activity activity; private long host; } VideoApi21$$