我正在研究VoIP-Android-App和该应用程序需要能够接受/拒绝通话蓝牙耳机.
但问题是在添加连接到SCO之后
audioManager.startBluetoothSco()
audioManager.isBluetoothScoOn = true
Run Code Online (Sandbox Code Playgroud)
一旦我点击耳机按钮,我可以听到通常在我接受使用电话呼叫时发出的声音,所以我假设一些android系统组件捕获此信号并且不会进一步抛出它
我已经尝试过了:
1)电话状态监听器(它始终是IDLE)
val tm = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
phoneStateListener = MyPhoneStateListener()
tm.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE)
Run Code Online (Sandbox Code Playgroud)
2)MediaSession +静音噪音+媒体按钮监听器第一次点击不起作用,第二次+点击正确处理
3)MEDIA_BUTTON接收器不起作用
我在SO上发现了类似的问题,但没有答案如何使其工作 通过蓝牙耳机接受呼叫
那么我是如何拦截蓝牙耳机服务的蓝牙按钮点击的呢?
我正在开发VoIP-Android-App.我想通过活动中的连接蓝牙耳机接受和拒绝来电.
到目前为止我尝试了什么:
使用媒体会话接收媒体按钮点击.
问题:如果我们启动BluetoothSCO,我们不会收到任何Media Button点击.如果我们不启动BluetoothSCO,我们会收到Media Button点击,但我们无法区分长按和短按,因为停机时间始终为0,键码始终为KEYCODE_MEDIA_PLAY,ACTION_DOWN后面紧跟ACTION_UP.只有通过蓝牙连接时才会出现这些问题.如果我们通过有线耳机连接,我们会获得相应的密钥代码(KEYCODE_HEADSETHOOK),停机时间不为0.
使用BroadcastReceiver监听蓝牙SCO连接的变化.
private val scoReceiver = object : BroadcastReceiver() {
fun onReceive(context: Context, intent: Intent) {
val state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1)
val previousState = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_PREVIOUS_STATE, -1)
if (state == AudioManager.SCO_AUDIO_STATE_DISCONNECTED && previousState == AudioManager.SCO_AUDIO_STATE_CONNECTED) {
Log.e(TAG, "SCO Disconnected")
hangupCall()
}
}
}
protected fun onStart() {
super.onStart()
val intentFilter = IntentFilter()
intentFilter.addAction(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED)
registerReceiver(scoReceiver, intentFilter)
}
Run Code Online (Sandbox Code Playgroud)
通过这种方法,我可以检测用户何时挂断电话,例如长按蓝牙耳机,因为这会触发SCO断开连接.
问题:我们无法检测用户是否想接听来电.
使用dispatchKeyEvent,onKeyDown和onKeyUp.
问题:他们从来没有被召唤过.
有没有人有任何建议或最佳实践如何正确处理蓝牙耳机?非常感谢任何帮助.提前致谢!
android headset android-bluetooth android-broadcastreceiver voip-android
Android 电信管理器在添加的 VOIP 呼叫中没有传入的音频/声音
我正在尝试在我的应用中添加 VOIP 视频通话。我已经注册了电话帐户并将呼叫添加到 TelecomManager。呼叫被成功接受。我已经实现了 Connection 和 ConnectionService。
我正在使用以下代码添加呼叫。
var uri = Android.Net.Uri.FromParts(PhoneAccount.SchemeSip, voipCallInfo.Payload?.CallerName, null);
extras.PutParcelable(TelecomManager.ExtraIncomingCallAddress, uri);
extras.PutParcelable(TelecomManager.ExtraPhoneAccountHandle, phoneAccountHandle);
telecomManager.AddNewIncomingCall(phoneAccountHandle, extras);
Run Code Online (Sandbox Code Playgroud)
我正在使用下面的代码来接听来电。
var telecomManager = GetTelecomManager();
if (telecomManager == null)
{
logger.Error("Telecom Manager is null, May be permissions not granted");
return;
}
try
{
.
.
.
telecomManager.AcceptRingingCall();
.
.
}
catch (Exception ex)
{
logger.Error("RequestSystemToAnswerCall Exception : " + ex.Message);
}
Run Code Online (Sandbox Code Playgroud)
我试图请求音频焦点,但是当我在电信管理器中添加呼叫时,我的应用程序失去了焦点,因为电话开始响铃。在我接受通话应用程序后,我没有获得焦点,我相信 Telecom/Call 有焦点,但我什么也听不到。通话中的另一个人可以毫无问题地听到我的声音。当我结束通话时,应用程序会重新获得焦点。
我可以在日志中看到下面的内容。
2020-06-22,14:09:34.831 WebRTCManager Trace IsAudioSubscriptionEnabled True
[AudioManager] Use of stream …Run Code Online (Sandbox Code Playgroud) 我正在开发一个在 android 中录制 VOIP 通话的项目,我没有找到任何解决方案,有很多应用程序支持手机上的 VOIP 录音。我找不到任何教程和帮助。Cube Call Recorder是提供此功能的应用程序之一,但我不知道该怎么做。我通过使用 android MediaRecorder开始录音然后启动 whatsapp 呼叫进行了测试,因此其他人无法听到我的声音。通话后,我检查了录音中只保存了我的声音。
作为一项研究,我对一些 apk 进行了逆向工程,我发现它们在 apk 中使用了辅助功能权限。
<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
Run Code Online (Sandbox Code Playgroud)
我不知道我需要了解哪些事情,我怎样才能知道 VOIP 呼叫来来去去,就像BroadcastReceiver 一样。
然后,我将了解如何记录通话。
我正在尝试通过Twilio视频通话提供本地视频通话体验。这是场景:
我们已经建立了FCM,并且正在接收推送通知。尝试在通话到达时立即打开视频通话接听按钮,而不单击通知,就像在Whatsapp,Google Duo中一样(在Android手机中)
我们试图让服务在后台运行并打开一个套接字。当向套接字发出传入呼叫事件时,套接字将监听传入的呼叫并打开VideoCallActivity。
这是我们最好的选择,但到目前为止没有成功。您将如何实现此功能?