Android音乐播放模式切换-外放、听筒、耳机

参考自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1007/3548.html

code:https://coding.net/u/devwiki/p/PlayMode/git(主要参考对象)


/**
 * 调大音量一个单位
 */
public void raiseVolume(){
    int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
    if (currentVolume < audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)) {
        audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                AudioManager.ADJUST_RAISE, AudioManager.FX_FOCUS_NAVIGATION_UP);
    }
}
/**
 * 调小音量一个单位
 */
public void lowerVolume(){
    int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
    if (currentVolume > 0) {
        audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                AudioManager.ADJUST_LOWER, AudioManager.FX_FOCUS_NAVIGATION_UP);
    }
}




/**
 * Returns the maximum volume index for a particular stream.
 *
 * @param streamType The stream type whose maximum volume index is returned.
 * @return The maximum valid volume index for the stream.
 * @see #getStreamVolume(int)
 */
public int getStreamMaxVolume(int streamType) {
    IAudioService service = getService();
    try {
        return service.getStreamMaxVolume(streamType);
    } catch (RemoteException e) {
        throw e.rethrowFromSystemServer();
    }
}
上面这个是系统方法,实际测验发现我的一个测试机总是15(索引),所以这个我设置了音量大小无关,含义应该是对应流形式下可达到的最大声音大小索引

这段代码从含义上粗略理解为设置音量的大小,实际测试未能准确发现其中的作用

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
    audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,
            audioManager.getStreamMaxVolume(AudioManager.MODE_IN_COMMUNICATION), AudioManager.FX_KEY_CLICK);
} else {
    audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,
            audioManager.getStreamMaxVolume(AudioManager.MODE_IN_CALL), AudioManager.FX_KEY_CLICK);
}


public static final int STREAM_SYSTEM = AudioSystem.STREAM_SYSTEM;
/** The audio stream for the phone ring */
public static final int STREAM_RING = AudioSystem.STREAM_RING;
/** The audio stream for music playback */
 public static final int STREAM_MUSIC = AudioSystem.STREAM_MUSIC;
/** The audio stream for alarms */
 public static final int STREAM_ALARM = AudioSystem.STREAM_ALARM;



这种方式是切换播放模式,

虽然可以勉强切换,但是效果和微信的不一样,而且会操作音切换卡顿等问题

         if(range == mSensor.getMaximumRange()) {
            Toast.makeText(this,"正常模式", Toast.LENGTH_LONG).show();
             audioManager.setMode(AudioManager.MODE_NORMAL);
        }else{
            Toast.makeText(this,"听筒模式", Toast.LENGTH_LONG).show();
             audioManager.setMode(AudioManager.MODE_IN_CALL);
        }
    }


class HeadsetReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(mAudioPlayerModeManager == null){
            return;
        }
        String action = intent.getAction();
        switch (action) {
            //插入和拔出耳机会触发此广播
            case Intent.ACTION_HEADSET_PLUG:
                int state = intent.getIntExtra("state", 0);
                if (state == 1) {
                    LogUtils.i("bbbbbbbb耳机已插入");
                    mAudioPlayerModeManager.changeToHeadsetMode();
                } else if (state == 0) {
                    KWLogUtils.i("bbbbbbbb耳机已经彻底拔除,暂停需要时间,预留100ms给暂停");
                    mHander.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                                mAudioPlayerModeManager.resume();
                        }
                    },100);
                    mHander.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            if (mAudioPlayerModeManager.isPlaying()) {
                                LogUtils.i("bbbbbbbb音乐恢复播放");
                            }
                        }
                    },300);
                }
                break;
            //拔出耳机会触发此广播,拔出不会触发,且此广播比上一个早,故可在此暂停播放,收到上一个广播时在恢复播放
            case AudioManager.ACTION_AUDIO_BECOMING_NOISY:
                KWLogUtils.i("bbbbbbbb耳机已拔出");
                mAudioPlayerModeManager.pause();
                if (mAudioPlayerModeManager.isPause()) {
                    LogUtils.i("bbbbbbbb音乐已暂停");
                }
                mAudioPlayerModeManager.changeToSpeakerMode();
                break;
            default:
                break;
        }
    }
}

测试发现上述Action_HEADSSET_PLUG是粘滞广播,后注册也能收到曾经的广播,最后一次拔除也收到拔除,最后一次插入则为插入,不会收到既是插入又是拔除

测试发现上述广播 ACTION_AUDIO_BECOMING_HOISY不是粘滞广播,此广播从含义理解为声音开始嘈杂了,且比上一个广播早,此时应该及时暂停,避免丢音!


      

  1. am.setMode(AudioManager.MODE_NORMAL);//正常模式,即在没有铃音与电话的情况  
  2. am.setMode(AudioManager.MODE_RINGTONE);//铃响模式  
  3. am.setMode(AudioManager.MODE_IN_CALL);//接通电话模式   
  4. am.setMode(AudioManager.MODE_IN_COMMUNICATION);//通话模式。
听筒和外放的切换要点是先设置为电话或者通话模式,然后开关扬声器模式即可,如果扬声器关闭,声音会从听筒发出,打开扬声器的话,就是外放了,类似免提吧!

猜你喜欢

转载自blog.csdn.net/rnzuozuo/article/details/78821471