簡體   English   中英

Android SIP API - 如何接聽已接來電

[英]Android SIP API - How to pickup received call

使用SIP API時,如何接聽我正在接收的電話。 我使用sipdemo中的incomingcallreceiver類進行測試,我在WalkieTalkieActivity類中添加了一個拾取按鈕,當呼叫進入時我應該啟用但我無法弄清楚如何接聽入站呼叫。 任何幫助或示例將不勝感激。

更具體地說,這是來自IncomingCallReceiver類的示例代碼:

public class IncomingCallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
SipAudioCall incomingCall = null;
try {
SipAudioCall.Listener listener = new SipAudioCall.Listener() {
@Override
public void onRinging(SipAudioCall call, SipProfile caller) {
try {
call.answerCall(30);
}
catch (Exception e) {
e.printStackTrace();
}}};
WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context;
incomingCall = wtActivity.manager.takeAudioCall(intent, listener);
incomingCall.answerCall(30);
incomingCall.startAudio();
incomingCall.setSpeakerMode(true);
if(incomingCall.isMuted()) {
incomingCall.toggleMute();
}
wtActivity.call = incomingCall;
wtActivity.updateStatus(incomingCall);
}
catch (Exception e) {
if (incomingCall != null) {
incomingCall.close();
}}}}

WalkieTalkieActivity類使用以下方法接收呼叫:在onCreate中

IntentFilter filter = new IntentFilter();
filter.addAction("android.SipDemo.INCOMING_CALL");
callReceiver = new IncomingCallReceiver();
this.registerReceiver(callReceiver, filter);

以及創建配置文件的位置

Intent i = new Intent();
i.setAction("android.SipDemo.INCOMING_CALL");
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, Intent.FILL_IN_DATA);
manager.open(me, pi, null);

根據開發人員SIP 指南

當SIP服務收到新呼叫時,它會發出一個具有應用程序提供的動作字符串的意圖。 在SipDemo中,此操作字符串是android.SipDemo.INCOMING_CALL。

此代碼摘錄自SipDemo,顯示了如何使用基於操作字符串android.SipDemo.INCOMING_CALL的待定意圖創建SipProfile對象。 當SipProfile接收到一個呼叫時,PendingIntent對象將執行廣播:(這指的是創建配置文件的上面的代碼)然后指南繼續說:廣告將被意圖過濾器截獲,然后將觸發廣播接收器(IncomingCallReceiver)。 您可以在應用程序的清單文件中指定intent過濾器,或者在代碼中執行,如在應用程序的Activity的SipDemo示例應用程序的onCreate()方法中:

我希望將一個拾取按鈕添加到在鈴聲上啟用的WalkieTalkieActivity類,並在點擊時接聽來電。

我已成功處理所有其他一般通話問題,如保持,靜音,揚聲器,撥打電話和結束通話,但我無法弄清楚這一點。

編輯 - 這可行嗎?:

public class IncomingCallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
SipAudioCall incomingCall = null;
try {
SipAudioCall.Listener listener = new SipAudioCall.Listener() {
@Override
public void onRinging(SipAudioCall call, SipProfile caller) {
try {
call.answerCall(30);
}
catch (Exception e) {
e.printStackTrace();
}}};
WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context;
wtActivity.inbound = incomingCall;
wtActivity.updateStatus(incomingCall);
}
catch (Exception e) {
if (incomingCall != null) {
incomingCall.close();
}}}}

然后在walkietalkieactivity Class中設置一個新的SipAudioCall,並在其中使用onclicklistener進行onRinging的監聽,然后進行正常的調用處理,如:

inbound.answerCall(30);
inbound.startAudio();
inbound.setSpeakerMode(true);
if(inbound.isMuted()) {
inbound.toggleMute();
}

- 謝謝Daniel

經過幾次不同的嘗試,我能夠讓它工作。 我無法處理傳入呼叫活動之外的任何呼叫對象。 我必須在我的主ui類中從我的按鈕調用來電活動中的方法。 引用IncomingCallReceiver.incomingCall.answercall會將狀態更改為應答但不會失敗並且實際上沒有回答,即使未建立呼叫,startaudio也會發送RTP。 我嘗試將其移動到監聽器中以進行oncallestablished,但它沒有發生,所以它沒關系。 我仍然很新,所以如果我的術語關閉,我道歉。

謝謝,丹尼爾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM