Android voice语音功能常见问题汇总,注意细节

前言

  1. 监听耳机操作
  2. audioManager.setMode问题

监听有线耳机、蓝牙耳机(音响)插入

由于有线耳机、蓝牙耳机是两种传输形式,Android提供了两个广播监听。

  1. 监听有线耳机
//监听耳机
IntentFilter headsetIntentFilter = new IntentFilter();
headsetIntentFilter.addAction(AudioManager.ACTION_HEADSET_PLUG);
headsetReceiver = new HeadsetReceiver();
registerReceiver(headsetReceiver, headsetIntentFilter);
public class HeadsetReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if ("android.intent.action.HEADSET_PLUG".equals(action)) {
            if (intent.hasExtra("state")) {
                int state = intent.getIntExtra("state", 0);
                if (state == 1) {
                    Log.i("zzb","耳机已经插入");
                    // 切换到耳机模式
                } else if (state == 0) {
                    Log.i("zzb","耳机没有插入");
                    // 切换到手机听筒或扬声器
                }
            }
        }

    }
}

注意

注意,在没有接入有线耳机,只要注册了广播,就会收到state == 0,没有耳机插入的回调。如果app有需求 需要默认使用扬声器播放,则在activity的onCreate中初始化为扬声器,要保证在BroadcastReceiver的接收到回调state == 0时也是初始化为扬声器,避免冲突,不知道哪里出错了。

  1. 监听蓝牙设备
//监听蓝牙
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        filter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);
        filter.addAction(BluetoothA2dp.ACTION_PLAYING_STATE_CHANGED);
        filter.addAction(BluetoothDevice.ACTION_FOUND);
        filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
        filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
        bluetoothReceiver = new BluetoothReceiver();
        registerReceiver(bluetoothReceiver, filter);
public class BluetoothReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("zzb","=========蓝牙接收处理广播========" + intent.getAction());
        BluetoothDevice device;
        switch (intent.getAction()) {
            case BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED:
                switch (intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, -1)) {
                    case BluetoothA2dp.STATE_CONNECTING:
                        break;
                    case BluetoothA2dp.STATE_CONNECTED:
                        device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                        Log.i("zzb","成功连上device: " + device.getName() + " connected");
                        break;
                    case BluetoothA2dp.STATE_DISCONNECTING:
                        device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                        Log.i("zzb","device: " + device.getName() + " disconnecting");
                        break;
                    case BluetoothA2dp.STATE_DISCONNECTED:
                        device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                        Log.i("zzb","断开连接device: " + device.getName() + " disconnected");
                        break;
                    default:
                        break;
                }
                break;
         }
   }

打开扬声器

以下为打开扬声器的代码

public static void setSpeakerModel(Context mContext) {
        try {
            AudioManager audioManager = (AudioManager) mContext
                    .getSystemService(Context.AUDIO_SERVICE);
            if (audioManager != null) {
                Log.i("zzb", "setSpeakerModel audioManager.isSpeakerphoneOn() = " + audioManager.isSpeakerphoneOn());
                if (!audioManager.isSpeakerphoneOn()) {
                    audioManager.setMode(AudioManager.MODE_NORMAL);
                    // setSpeakerphoneOn要放在setMode之后
                    audioManager.setSpeakerphoneOn(true);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

注意setSpeakerphoneOn方法要放在setMode之后,特别在切换听筒模式时,可能会有问题,有人也遇到相关问题

  1. 设置为听筒模式
//设定为正在通话中,android5.0以上使用这个
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值