在安卓上拨打电话时自动激活蓝牙耳机

Posted

技术标签:

【中文标题】在安卓上拨打电话时自动激活蓝牙耳机【英文标题】:Activate bluetooth headset automatically when making a call on android 【发布时间】:2014-12-07 16:18:37 【问题描述】:

我的应用正在拨打电话:

Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + number));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClassName("com.android.phone", "com.android.phone.OutgoingCallBroadcaster");
startActivity(intent);

一切正常,通话开始。

对于真正的耳机,可以在耳机上开始通话,但对于“类似耳机”的设备,如智能手表(其行为类似于 BT 耳机,并且可以接听通话),通话开始于手机,用户必须在通话屏幕上手动按"Headset" button才能移动到智能手表上通话。 但是,我希望电话始终通过耳机自动拨打电话。 或者,如果在通话开始后(1-2 秒内)切换耳机模式,如果无法通过耳机立即开始,也可以。

有人知道吗?

** 更新 **

在呼叫广播接收器中,我尝试了(当然具有所有必要的权限):

AudioManager audioManager;
audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(false) -> 工作,在通话期间关闭扬声器(如果它打开) audioManager.setSpeakerphoneOn(true) -> 工作,在通话期间打开扬声器(如果它关闭) audioManager.setBluetoothScoOn(false) -> 工作,在通话过程中关闭 BT 耳机(如果它处于开启状态) audioManager.setBluetoothScoOn(true) -> 不工作,通话期间不打开 BT 耳机(如果关闭)

我在 Android AudioManager::startBluetoothSco 文档中找到了这个:

此方法可用于希望在 phone is not in call 时向/从蓝牙 SCO 耳机发送和接收音频的应用程序。

奇怪...

谢谢。

【问题讨论】:

您的调查表明这是不可能的,我认为这是由于安全问题而引入的(否则很容易为恶意目的捕获电话) 有可能,我看到一个应用程序做到了。基本上,通话应该会自动切换到耳机模式。 注意: 我发现 App 还说它在 4.4 (kitkat) 中不再工作。也许你会是对的,这是不可能的?但是,三星工厂手表应用程序会这样做,它可以在手机通话期间激活BT模式。也许它有一些额外的参数要传递给 ACTION_CALL。有什么办法可以捕捉到吗? 试着检查一下。与你的问题有关。 [链接][1] [1]:***.com/questions/3806536/… newb:不,这完全不同。 【参考方案1】:

尝试使用 Broadcase Receiver of call start 发送广播并将呼叫切换到耳机模式。

在广播接收器中使用以下操作。

用于拨出电话 - android.intent.action.NEW_OUTGOING_CALL

来电 - android.intent.action.PHONE_STATE 在您可以使用不同的状态,如“电话响铃”、“电话接听”等,类似这样,您可以检查条件并在广播接收器的接收器方法中根据需要执行相应的代码。

用于将通话转接到蓝牙:

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
if (telephonyManager != null) 
    telephonyManager.listen(phoneStateListener,
            PhoneStateListener.LISTEN_CALL_STATE);

  audioManager.setBluetoothScoOn(true);
  audioManager.startBluetoothSco();

【讨论】:

我只对拨出电话感兴趣。但是当我的 APP 开始通话时,我知道什么时候拨出电话,不需要广播接收器。您写道:将通话切换到耳机模式。 这是我的问题,我该怎么做?谢谢 好的,我的应用程序只是发起呼叫,所以我仍然需要广播接收器来捕捉确切的时刻,但问题仍然是,如何将呼叫切换到耳机模式 ? 感谢您的更新。但请参阅问题中关于 startBluetoothSco(); 的评论。 您是否授予此权限,需要权限:MODIFY_AUDIO_SETTINGS。 当然。但似乎这是有意为之,正如 android 文档所说:此方法可用于希望在手机未通话时向蓝牙 SCO 耳机发送和接收音频的应用程序。 我在 4.4.4 中尝试过。

以上是关于在安卓上拨打电话时自动激活蓝牙耳机的主要内容,如果未能解决你的问题,请参考以下文章

制作一个从串口读取值并拨打电话的应用程序

Android拨打电话

Android拨打电话   安卓拨打电话权限

android中拨打电话的几种实现

H5 唤起拨打电话功能

安卓手机端实现点击电话号码,出现拨打复制保存到通讯录