Loading src/com/android/fmradio/FMMediaButtonIntentReceiver.java 0 → 100644 +20 −0 Original line number Original line Diff line number Diff line package com.android.fmradio; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.view.KeyEvent; public class FMMediaButtonIntentReceiver extends BroadcastReceiver { public interface MediaHandleListener { public boolean handleIntent(Intent intent); } private MediaHandleListener listener; public void setMediaHandleListener(MediaHandleListener listener) { this.listener = listener; } @Override public void onReceive(Context context, Intent intent) { if (listener != null) listener.handleIntent(intent); } } src/com/android/fmradio/FmMainActivity.java +18 −12 Original line number Original line Diff line number Diff line Loading @@ -259,7 +259,7 @@ public class FmMainActivity extends Activity implements FmFavoriteEditDialog.Edi changeToMainLayout(); changeToMainLayout(); } } } else { } else { mMenuItemHeadset.setIcon(R.drawable.btn_fm_headset_selector); toggleSpeaker(false); if (mIsActivityForeground) { if (mIsActivityForeground) { cancelMainAnimation(); cancelMainAnimation(); playNoHeadsetAnimation(); playNoHeadsetAnimation(); Loading Loading @@ -733,6 +733,10 @@ public class FmMainActivity extends Activity implements FmFavoriteEditDialog.Edi mService.unregisterFmRadioListener(mFmRadioListener); mService.unregisterFmRadioListener(mFmRadioListener); } } mFmRadioListener = null; mFmRadioListener = null; if (mIsServiceBinded) { unbindService(mServiceConnection); mIsServiceBinded = false; } mScroller.closeAdapterCursor(); mScroller.closeAdapterCursor(); mScroller.unregisterListener(mEventListener); mScroller.unregisterListener(mEventListener); super.onDestroy(); super.onDestroy(); Loading Loading @@ -779,8 +783,7 @@ public class FmMainActivity extends Activity implements FmFavoriteEditDialog.Edi refreshImageButton(isSeeking ? false : isPowerUp); refreshImageButton(isSeeking ? false : isPowerUp); refreshPlayButton(isSeeking ? false refreshPlayButton(isSeeking ? false : (isPowerUp || (isPowerdown && !mIsDisablePowerMenu))); : (isPowerUp || (isPowerdown && !mIsDisablePowerMenu))); mMenuItemHeadset.setIcon(isSpeakerUsed ? R.drawable.btn_fm_speaker_selector toggleSpeaker(isSpeakerUsed); : R.drawable.btn_fm_headset_selector); return true; return true; } } Loading Loading @@ -808,13 +811,11 @@ public class FmMainActivity extends Activity implements FmFavoriteEditDialog.Edi case R.id.earphone_menu: case R.id.earphone_menu: setSpeakerPhoneOn(false); setSpeakerPhoneOn(false); mMenuItemHeadset.setIcon(R.drawable.btn_fm_headset_selector); invalidateOptionsMenu(); invalidateOptionsMenu(); break; break; case R.id.speaker_menu: case R.id.speaker_menu: setSpeakerPhoneOn(true); setSpeakerPhoneOn(true); mMenuItemHeadset.setIcon(R.drawable.btn_fm_speaker_selector); invalidateOptionsMenu(); invalidateOptionsMenu(); break; break; Loading Loading @@ -973,12 +974,18 @@ public class FmMainActivity extends Activity implements FmFavoriteEditDialog.Edi mService.powerDownAsync(); mService.powerDownAsync(); } } private void setSpeakerPhoneOn(boolean isSpeaker) { private void toggleSpeaker(boolean isSpeaker) { if (isSpeaker) { if (mMenuItemHeadset != null) { mService.setSpeakerPhoneOn(true); mMenuItemHeadset.setIcon(isSpeaker ? R.drawable.btn_fm_speaker_selector } else { : R.drawable.btn_fm_headset_selector); mService.setSpeakerPhoneOn(false); mMenuItemHeadset.setContentDescription(getString(isSpeaker ? R.string.optmenu_speaker : R.string.optmenu_earphone)); } } } private void setSpeakerPhoneOn(boolean isSpeaker) { mService.setSpeakerPhoneOn(isSpeaker); toggleSpeaker(isSpeaker); } } /** /** Loading Loading @@ -1133,8 +1140,7 @@ public class FmMainActivity extends Activity implements FmFavoriteEditDialog.Edi refreshPlayButton(fmStatus ? false refreshPlayButton(fmStatus ? false : (isPowerUp || (isPowerdown && !mIsDisablePowerMenu))); : (isPowerUp || (isPowerdown && !mIsDisablePowerMenu))); if (null != mMenuItemHeadset) { if (null != mMenuItemHeadset) { mMenuItemHeadset.setIcon(isSpeakerUsed ? R.drawable.btn_fm_speaker_selector toggleSpeaker(isSpeakerUsed); : R.drawable.btn_fm_headset_selector); } } } } Loading src/com/android/fmradio/FmService.java +110 −0 Original line number Original line Diff line number Diff line Loading @@ -48,6 +48,8 @@ import android.media.AudioRecord; import android.media.AudioSystem; import android.media.AudioSystem; import android.media.AudioTrack; import android.media.AudioTrack; import android.media.MediaRecorder; import android.media.MediaRecorder; import android.media.session.MediaSession; import android.media.session.PlaybackState; import android.net.Uri; import android.net.Uri; import android.os.Binder; import android.os.Binder; import android.os.Bundle; import android.os.Bundle; Loading @@ -61,6 +63,7 @@ import android.os.PowerManager.WakeLock; import android.os.Process; import android.os.Process; import android.text.TextUtils; import android.text.TextUtils; import android.util.Log; import android.util.Log; import android.view.KeyEvent; import com.android.fmradio.FmStation.Station; import com.android.fmradio.FmStation.Station; Loading Loading @@ -114,6 +117,88 @@ public class FmService extends Service implements FmRecorder.OnRecorderStateChan // FM recorder // FM recorder FmRecorder mFmRecorder = null; FmRecorder mFmRecorder = null; private FMMediaButtonIntentReceiver mMediaButtonIntentReceiver = new FMMediaButtonIntentReceiver(); private FMMediaButtonIntentReceiver.MediaHandleListener listener = new FMMediaButtonIntentReceiver.MediaHandleListener() { @Override public boolean handleIntent(Intent intent) { KeyEvent event = (KeyEvent) intent.getParcelableExtra("android.intent.extra.KEY_EVENT"); boolean result = false; if (event == null) { return result; } if (event.getAction() != KeyEvent.ACTION_DOWN) return result; int keyCode = event.getKeyCode(); int repeatCount = event.getRepeatCount(); switch (keyCode) { case KeyEvent.KEYCODE_HEADSETHOOK: case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: if (repeatCount == 0) { if (mPowerStatus != POWER_UP) { powerUpAsync(FmUtils.computeFrequency(getFrequency())); } else { powerDownAsync(); } result = true; } break; case KeyEvent.KEYCODE_MEDIA_PAUSE: if (repeatCount == 0) { if (mPowerStatus != POWER_DOWN) { powerDownAsync(); result = true; } } break; case KeyEvent.KEYCODE_MEDIA_PLAY: if (repeatCount == 0) { if (mPowerStatus != POWER_UP) { powerUpAsync(FmUtils.computeFrequency(getFrequency())); result = true; } } break; case KeyEvent.KEYCODE_MEDIA_STOP: if (repeatCount == 0) { stopSelf(); result = true; } break; case KeyEvent.KEYCODE_MEDIA_SKIP_BACKWARD: case KeyEvent.KEYCODE_MEDIA_STEP_BACKWARD: case KeyEvent.KEYCODE_MEDIA_SKIP_FORWARD: case KeyEvent.KEYCODE_MEDIA_STEP_FORWARD: if (repeatCount == 0) { tuneStationAsync(keyCode == KeyEvent.KEYCODE_MEDIA_SKIP_BACKWARD || keyCode == KeyEvent.KEYCODE_MEDIA_STEP_BACKWARD? FmUtils.computeDecreaseStation(mCurrentStation): FmUtils.computeIncreaseStation(mCurrentStation)); result = true; break; } else if (repeatCount == 1) { keyCode = keyCode == KeyEvent.KEYCODE_MEDIA_SKIP_BACKWARD || keyCode == KeyEvent.KEYCODE_MEDIA_STEP_BACKWARD ? KeyEvent.KEYCODE_MEDIA_PREVIOUS : KeyEvent.KEYCODE_MEDIA_NEXT; repeatCount = 0; result = true; } case KeyEvent.KEYCODE_MEDIA_PREVIOUS: case KeyEvent.KEYCODE_MEDIA_NEXT: if (repeatCount == 0) { seekStationAsync(FmUtils.computeFrequency(mCurrentStation), keyCode == KeyEvent.KEYCODE_MEDIA_NEXT); result = true; } break; default: break; } return result; } }; private BroadcastReceiver mSdcardListener = null; private BroadcastReceiver mSdcardListener = null; private int mRecordState = FmRecorder.STATE_INVALID; private int mRecordState = FmRecorder.STATE_INVALID; private int mRecorderErrorType = -1; private int mRecorderErrorType = -1; Loading Loading @@ -182,6 +267,7 @@ public class FmService extends Service implements FmRecorder.OnRecorderStateChan // Instance variables // Instance variables private Context mContext = null; private Context mContext = null; private AudioManager mAudioManager = null; private AudioManager mAudioManager = null; private MediaSession mMediaSession = null; private ActivityManager mActivityManager = null; private ActivityManager mActivityManager = null; //private MediaPlayer mFmPlayer = null; //private MediaPlayer mFmPlayer = null; private WakeLock mWakeLock = null; private WakeLock mWakeLock = null; Loading Loading @@ -1271,6 +1357,26 @@ public class FmService extends Service implements FmRecorder.OnRecorderStateChan super.onCreate(); super.onCreate(); mContext = getApplicationContext(); mContext = getApplicationContext(); mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); mMediaButtonIntentReceiver.setMediaHandleListener(listener); IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON); filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); registerReceiver(mMediaButtonIntentReceiver, filter); mMediaSession = new MediaSession(mContext, TAG); Intent i = new Intent(this, FMMediaButtonIntentReceiver.class) .setFlags(Intent.FLAG_RECEIVER_FOREGROUND); mMediaSession.setMediaButtonReceiver(PendingIntent.getBroadcast(this, 0, i, 0)); mMediaSession.setActive(true); mMediaSession.setCallback(new MediaSession.Callback() { @Override public boolean onMediaButtonEvent(Intent mediaButtonIntent) { return listener.handleIntent(mediaButtonIntent); } }); mMediaSession.setPlaybackState(new PlaybackState.Builder().setActions( PlaybackState.ACTION_PAUSE | PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PLAY_PAUSE | PlaybackState.ACTION_STOP | PlaybackState.ACTION_REWIND | PlaybackState.ACTION_SKIP_TO_PREVIOUS | PlaybackState.ACTION_SKIP_TO_NEXT).build()); mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); Loading Loading @@ -1488,6 +1594,10 @@ public class FmService extends Service implements FmRecorder.OnRecorderStateChan public void onDestroy() { public void onDestroy() { mAudioManager.setParameters("AudioFmPreStop=0"); mAudioManager.setParameters("AudioFmPreStop=0"); setMute(true); setMute(true); mMediaSession.setMediaButtonReceiver(null); mMediaSession.setActive(false); mMediaSession.release(); unregisterReceiver(mMediaButtonIntentReceiver); // stop rds first, avoid blocking other native method // stop rds first, avoid blocking other native method if (isRdsSupported()) { if (isRdsSupported()) { stopRdsThread(); stopRdsThread(); Loading Loading
src/com/android/fmradio/FMMediaButtonIntentReceiver.java 0 → 100644 +20 −0 Original line number Original line Diff line number Diff line package com.android.fmradio; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.view.KeyEvent; public class FMMediaButtonIntentReceiver extends BroadcastReceiver { public interface MediaHandleListener { public boolean handleIntent(Intent intent); } private MediaHandleListener listener; public void setMediaHandleListener(MediaHandleListener listener) { this.listener = listener; } @Override public void onReceive(Context context, Intent intent) { if (listener != null) listener.handleIntent(intent); } }
src/com/android/fmradio/FmMainActivity.java +18 −12 Original line number Original line Diff line number Diff line Loading @@ -259,7 +259,7 @@ public class FmMainActivity extends Activity implements FmFavoriteEditDialog.Edi changeToMainLayout(); changeToMainLayout(); } } } else { } else { mMenuItemHeadset.setIcon(R.drawable.btn_fm_headset_selector); toggleSpeaker(false); if (mIsActivityForeground) { if (mIsActivityForeground) { cancelMainAnimation(); cancelMainAnimation(); playNoHeadsetAnimation(); playNoHeadsetAnimation(); Loading Loading @@ -733,6 +733,10 @@ public class FmMainActivity extends Activity implements FmFavoriteEditDialog.Edi mService.unregisterFmRadioListener(mFmRadioListener); mService.unregisterFmRadioListener(mFmRadioListener); } } mFmRadioListener = null; mFmRadioListener = null; if (mIsServiceBinded) { unbindService(mServiceConnection); mIsServiceBinded = false; } mScroller.closeAdapterCursor(); mScroller.closeAdapterCursor(); mScroller.unregisterListener(mEventListener); mScroller.unregisterListener(mEventListener); super.onDestroy(); super.onDestroy(); Loading Loading @@ -779,8 +783,7 @@ public class FmMainActivity extends Activity implements FmFavoriteEditDialog.Edi refreshImageButton(isSeeking ? false : isPowerUp); refreshImageButton(isSeeking ? false : isPowerUp); refreshPlayButton(isSeeking ? false refreshPlayButton(isSeeking ? false : (isPowerUp || (isPowerdown && !mIsDisablePowerMenu))); : (isPowerUp || (isPowerdown && !mIsDisablePowerMenu))); mMenuItemHeadset.setIcon(isSpeakerUsed ? R.drawable.btn_fm_speaker_selector toggleSpeaker(isSpeakerUsed); : R.drawable.btn_fm_headset_selector); return true; return true; } } Loading Loading @@ -808,13 +811,11 @@ public class FmMainActivity extends Activity implements FmFavoriteEditDialog.Edi case R.id.earphone_menu: case R.id.earphone_menu: setSpeakerPhoneOn(false); setSpeakerPhoneOn(false); mMenuItemHeadset.setIcon(R.drawable.btn_fm_headset_selector); invalidateOptionsMenu(); invalidateOptionsMenu(); break; break; case R.id.speaker_menu: case R.id.speaker_menu: setSpeakerPhoneOn(true); setSpeakerPhoneOn(true); mMenuItemHeadset.setIcon(R.drawable.btn_fm_speaker_selector); invalidateOptionsMenu(); invalidateOptionsMenu(); break; break; Loading Loading @@ -973,12 +974,18 @@ public class FmMainActivity extends Activity implements FmFavoriteEditDialog.Edi mService.powerDownAsync(); mService.powerDownAsync(); } } private void setSpeakerPhoneOn(boolean isSpeaker) { private void toggleSpeaker(boolean isSpeaker) { if (isSpeaker) { if (mMenuItemHeadset != null) { mService.setSpeakerPhoneOn(true); mMenuItemHeadset.setIcon(isSpeaker ? R.drawable.btn_fm_speaker_selector } else { : R.drawable.btn_fm_headset_selector); mService.setSpeakerPhoneOn(false); mMenuItemHeadset.setContentDescription(getString(isSpeaker ? R.string.optmenu_speaker : R.string.optmenu_earphone)); } } } private void setSpeakerPhoneOn(boolean isSpeaker) { mService.setSpeakerPhoneOn(isSpeaker); toggleSpeaker(isSpeaker); } } /** /** Loading Loading @@ -1133,8 +1140,7 @@ public class FmMainActivity extends Activity implements FmFavoriteEditDialog.Edi refreshPlayButton(fmStatus ? false refreshPlayButton(fmStatus ? false : (isPowerUp || (isPowerdown && !mIsDisablePowerMenu))); : (isPowerUp || (isPowerdown && !mIsDisablePowerMenu))); if (null != mMenuItemHeadset) { if (null != mMenuItemHeadset) { mMenuItemHeadset.setIcon(isSpeakerUsed ? R.drawable.btn_fm_speaker_selector toggleSpeaker(isSpeakerUsed); : R.drawable.btn_fm_headset_selector); } } } } Loading
src/com/android/fmradio/FmService.java +110 −0 Original line number Original line Diff line number Diff line Loading @@ -48,6 +48,8 @@ import android.media.AudioRecord; import android.media.AudioSystem; import android.media.AudioSystem; import android.media.AudioTrack; import android.media.AudioTrack; import android.media.MediaRecorder; import android.media.MediaRecorder; import android.media.session.MediaSession; import android.media.session.PlaybackState; import android.net.Uri; import android.net.Uri; import android.os.Binder; import android.os.Binder; import android.os.Bundle; import android.os.Bundle; Loading @@ -61,6 +63,7 @@ import android.os.PowerManager.WakeLock; import android.os.Process; import android.os.Process; import android.text.TextUtils; import android.text.TextUtils; import android.util.Log; import android.util.Log; import android.view.KeyEvent; import com.android.fmradio.FmStation.Station; import com.android.fmradio.FmStation.Station; Loading Loading @@ -114,6 +117,88 @@ public class FmService extends Service implements FmRecorder.OnRecorderStateChan // FM recorder // FM recorder FmRecorder mFmRecorder = null; FmRecorder mFmRecorder = null; private FMMediaButtonIntentReceiver mMediaButtonIntentReceiver = new FMMediaButtonIntentReceiver(); private FMMediaButtonIntentReceiver.MediaHandleListener listener = new FMMediaButtonIntentReceiver.MediaHandleListener() { @Override public boolean handleIntent(Intent intent) { KeyEvent event = (KeyEvent) intent.getParcelableExtra("android.intent.extra.KEY_EVENT"); boolean result = false; if (event == null) { return result; } if (event.getAction() != KeyEvent.ACTION_DOWN) return result; int keyCode = event.getKeyCode(); int repeatCount = event.getRepeatCount(); switch (keyCode) { case KeyEvent.KEYCODE_HEADSETHOOK: case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: if (repeatCount == 0) { if (mPowerStatus != POWER_UP) { powerUpAsync(FmUtils.computeFrequency(getFrequency())); } else { powerDownAsync(); } result = true; } break; case KeyEvent.KEYCODE_MEDIA_PAUSE: if (repeatCount == 0) { if (mPowerStatus != POWER_DOWN) { powerDownAsync(); result = true; } } break; case KeyEvent.KEYCODE_MEDIA_PLAY: if (repeatCount == 0) { if (mPowerStatus != POWER_UP) { powerUpAsync(FmUtils.computeFrequency(getFrequency())); result = true; } } break; case KeyEvent.KEYCODE_MEDIA_STOP: if (repeatCount == 0) { stopSelf(); result = true; } break; case KeyEvent.KEYCODE_MEDIA_SKIP_BACKWARD: case KeyEvent.KEYCODE_MEDIA_STEP_BACKWARD: case KeyEvent.KEYCODE_MEDIA_SKIP_FORWARD: case KeyEvent.KEYCODE_MEDIA_STEP_FORWARD: if (repeatCount == 0) { tuneStationAsync(keyCode == KeyEvent.KEYCODE_MEDIA_SKIP_BACKWARD || keyCode == KeyEvent.KEYCODE_MEDIA_STEP_BACKWARD? FmUtils.computeDecreaseStation(mCurrentStation): FmUtils.computeIncreaseStation(mCurrentStation)); result = true; break; } else if (repeatCount == 1) { keyCode = keyCode == KeyEvent.KEYCODE_MEDIA_SKIP_BACKWARD || keyCode == KeyEvent.KEYCODE_MEDIA_STEP_BACKWARD ? KeyEvent.KEYCODE_MEDIA_PREVIOUS : KeyEvent.KEYCODE_MEDIA_NEXT; repeatCount = 0; result = true; } case KeyEvent.KEYCODE_MEDIA_PREVIOUS: case KeyEvent.KEYCODE_MEDIA_NEXT: if (repeatCount == 0) { seekStationAsync(FmUtils.computeFrequency(mCurrentStation), keyCode == KeyEvent.KEYCODE_MEDIA_NEXT); result = true; } break; default: break; } return result; } }; private BroadcastReceiver mSdcardListener = null; private BroadcastReceiver mSdcardListener = null; private int mRecordState = FmRecorder.STATE_INVALID; private int mRecordState = FmRecorder.STATE_INVALID; private int mRecorderErrorType = -1; private int mRecorderErrorType = -1; Loading Loading @@ -182,6 +267,7 @@ public class FmService extends Service implements FmRecorder.OnRecorderStateChan // Instance variables // Instance variables private Context mContext = null; private Context mContext = null; private AudioManager mAudioManager = null; private AudioManager mAudioManager = null; private MediaSession mMediaSession = null; private ActivityManager mActivityManager = null; private ActivityManager mActivityManager = null; //private MediaPlayer mFmPlayer = null; //private MediaPlayer mFmPlayer = null; private WakeLock mWakeLock = null; private WakeLock mWakeLock = null; Loading Loading @@ -1271,6 +1357,26 @@ public class FmService extends Service implements FmRecorder.OnRecorderStateChan super.onCreate(); super.onCreate(); mContext = getApplicationContext(); mContext = getApplicationContext(); mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); mMediaButtonIntentReceiver.setMediaHandleListener(listener); IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON); filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); registerReceiver(mMediaButtonIntentReceiver, filter); mMediaSession = new MediaSession(mContext, TAG); Intent i = new Intent(this, FMMediaButtonIntentReceiver.class) .setFlags(Intent.FLAG_RECEIVER_FOREGROUND); mMediaSession.setMediaButtonReceiver(PendingIntent.getBroadcast(this, 0, i, 0)); mMediaSession.setActive(true); mMediaSession.setCallback(new MediaSession.Callback() { @Override public boolean onMediaButtonEvent(Intent mediaButtonIntent) { return listener.handleIntent(mediaButtonIntent); } }); mMediaSession.setPlaybackState(new PlaybackState.Builder().setActions( PlaybackState.ACTION_PAUSE | PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PLAY_PAUSE | PlaybackState.ACTION_STOP | PlaybackState.ACTION_REWIND | PlaybackState.ACTION_SKIP_TO_PREVIOUS | PlaybackState.ACTION_SKIP_TO_NEXT).build()); mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); Loading Loading @@ -1488,6 +1594,10 @@ public class FmService extends Service implements FmRecorder.OnRecorderStateChan public void onDestroy() { public void onDestroy() { mAudioManager.setParameters("AudioFmPreStop=0"); mAudioManager.setParameters("AudioFmPreStop=0"); setMute(true); setMute(true); mMediaSession.setMediaButtonReceiver(null); mMediaSession.setActive(false); mMediaSession.release(); unregisterReceiver(mMediaButtonIntentReceiver); // stop rds first, avoid blocking other native method // stop rds first, avoid blocking other native method if (isRdsSupported()) { if (isRdsSupported()) { stopRdsThread(); stopRdsThread(); Loading