2012-02-06 24 views
5

どこに問題があるのか​​わかりません。 リスナーはonRingingイベントをキャッチしません(受信コールを受け入れるか拒否するかを決定できます)。マニフェストで はこれです:主な活動onCreate着信時に呼び出し音が鳴らない

<uses-permission android:name="android.permission.USE_SIP" /> 

このです:BroadcastReceiverクラスで

IntentFilter filter = new IntentFilter(); 
filter.addAction("android.SipDemo.INCOMING_CALL"); 
callReceiver = new IncomingCallReceiver(); 
this.registerReceiver(callReceiver, filter); 
... 
SipManager manager = SipManager.newInstance(this); 
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); 

はこれです:私は終了後

public void onReceive(Context context, Intent intent) { 
SipAudioCall incomingCall = null; 
try { 
SipAudioCall.Listener listener = new SipAudioCall.Listener() { 
... 
@Override 
public void onCallEnded(SipAudioCall call) { 
// TODO Auto-generated method stub 
super.onCallEnded(call); 
} 
@Override 
public void onRinging(SipAudioCall call, SipProfile caller) { 
try { 
call.answerCall(30); 
call.startAudio(); 
call.setSpeakerMode(true); 
if(call.isMuted()) { 
call.toggleMute(); 
} 
} catch (Exception e) { 
e.printStackTrace(); 
} 
} 
}; 
WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context; 
incomingCall = wtActivity.manager.takeAudioCall(intent, listener); 
wtActivity.call = incomingCall; 
... 

私は(CallEndイベントを受け取るとonChanged私はonRingingイベントを受け取ることはありません。 何が問題なのでしょうか? Thnx

EDIT: すべて変更しました。 私は(太字)のように受信機への新しいインテントフィルタを置く:

<receiver android:name=".IncomingCallReceiver" android:label="Call Receiver"> 
    **<intent-filter> 
     <action android:name="android.intent.action.PHONE_STATE" /> 
    </intent-filter>** 
</receiver> 

と私はBroadcastReceiverは、(1太字)は、このようなクラスを継承変更:

@Override 
public void onReceive(Context context, Intent intent) { 
    try { 
     **PhoneStateListener phoneListener=new PhoneStateListener() { 
     @Override 
     public void onCallStateChanged(int state, String incomingNumber) { 
     // TODO Auto-generated method stub 
     Log.d("DEBUG", "Phone listener...."); 
     String stateString = "N/A"; 
     switch (state) { 
     case TelephonyManager.CALL_STATE_IDLE: 
     stateString = "Idle"; 
     break; 
     case TelephonyManager.CALL_STATE_OFFHOOK: 
     stateString = "Off Hook"; 
     break; 
     case TelephonyManager.CALL_STATE_RINGING: 
     stateString = "Ringing"; 
     break; 
    } 
} 
};** 
WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context; 
SipSession ses=wtActivity.manager.getSessionFor(intent); 
**TelephonyManager telephony = (TelephonyManager) Context.getSystemService(Context.TELEPHONY_SERVICE); 
telephony.listen(phoneListener,PhoneStateListener.LISTEN_CALL_STATE);** 
... 

今、私はまだそこだけIDLE状態を取得しますが、鳴ることはありません。

+0

助けがありませんか? コードのどこが間違っているかを知っている人は誰ですか? – user1182625

答えて

5

SipAudioCallクラスのソースコードに誤りがあります。この問題を回避するには

incomingCall = wtActivity.manager.takeAudioCall(intent, null); 
incomingCall.setListener(listener, true); 
+2

これについては参考になりますか? – tristan2468

+0

私はあなたの答えを編集し、 'setListener'の' callbackImmediately'パラメータをtrueに設定して、リスナメソッドが確実に呼び出されるようにしました。 –

+0

これは素晴らしい回避策です! – vinitius

4

を私は一口のデモでは、着信コールを受け入れるか拒否するように同じシナリオを実装しています。 Accept(受諾)とReject(拒否)の2つのボタンを使用して、独自のアクティビティ(IncomingGui.java)を作成します。 BroadcastRecieverクラスでは、着信コールイベントに対してアクティビティ(IncomingGui.java)を呼び出します。

 WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context; 
     incomingCall = wtActivity.manager.takeAudioCall(intent, listener); 
     showIncomingCallGui(intent, context); 
     wtActivity.call = incomingCall; 

次に次にIncomingGui.javaに "同意" し、ボタンを "拒否" の後ろに以下のメソッドを定義するBroadcastRecieverクラスに

public void showIncomingCallGui(Intent intent,Context context) { 

     Intent incomingCall=new Intent(context,IncomingCallGui.class); 
     context.startActivity(incomingCall); 
    } 

public static void answerIncomingCall(){ 

    try { 
      incomingCall.answerCall(30); 
      incomingCall.startAudio(); 
      incomingCall.setSpeakerMode(true); 

       if (incomingCall.isMuted()) { 
       incomingCall.toggleMute(); 

      } 
    } 

    catch(Exception e){ 

     System.out.println(e.toString()); 
    } 

} 

public static void rejectIncomingCall(){ 

    try { 
      if (incomingCall !=null) { 

       incomingCall.endCall(); 
       incomingCall.close(); 
      } 

    } 
      catch(Exception e){ 

     System.out.println(e.toString()); 
    } 

を以下のメソッドを定義します。 着信コールを受信すると、着信コールのアクティビティがあります。

public void onCallAcceptButton(View view){ 
    IncomingCallReceiver.answerIncomingCall(); 
} 

    public void onCallRejectButton(View view){ 
    IncomingCallReceiver.rejectIncomingCall(); 
    this.finish(); 

} 
+0

まさに私が必要なもの! –

+0

両声で声がうまく聞こえましたか? 私の場合、私は片面だけの声を得ています。任意の争い!!! –

+0

@JahangirKabir yes in 2013 – Zain

関連する問題