4

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 クラスは、通話を受信するために以下を使用します。

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 オブジェクトを作成する方法を示しています。PendingIntent オブジェクトは、SipProfile が呼び出しを受信したときにブロードキャストを実行します: (これは、プロファイルが作成された上記のコードを参照) ガイドは続けて次のように述べています: ブロードキャストはインテント フィルターによってインターセプトされ、それから受信者 (IncomingCallReceiver)。アプリケーションのマニフェスト ファイルでインテント フィルターを指定するか、アプリケーションのアクティビティの SipDemo サンプル アプリケーションの onCreate() メソッドのようにコードで指定できます。

onRinging が有効になっている 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 クラス内に新しい SipAudioCall を設定し、その中に onclicklistener を含む onRinging のリスナーを設定し、その後に次のような通常の通話処理を行います。

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

--ありがとうダニエル

4

1 に答える 1

3

いくつかの異なる試行の後、これを機能させることができました。着信アクティビティ以外の呼び出しオブジェクトを処理できませんでした。メイン UI クラスのボタンから着信アクティビティ内でメソッドを呼び出す必要がありました。IncomingCallReceiver.incomingCall.answercall を参照すると、状態は応答中になりますが、失敗せず、実際には応答せず、通話が確立されていなくても startaudio が RTP を送信していました。これを oncall Established のリスナー内に移動しようとしましたが、それは起こっていなかったので問題ありませんでした。私はまだこれに非常に慣れていないので、用語が間違っていたら申し訳ありません。

ありがとう、ダニエル

于 2012-05-29T13:15:04.327 に答える