2012-02-06 14 views
5

No sé dónde hay un problema. El oyente no detecta el evento onRinging (por lo que puedo decidir si acepto o rechazo las llamadas entrantes). en el manifiesto es la siguiente:No hay un evento de timbre en las llamadas entrantes

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

en la actividad principal onCreate es la siguiente:

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); 

en BroadcastReceiver clase es la siguiente:

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; 
... 

que recibo CallEnd evento y onChanged (después termino llamar) pero no recibo el evento onRinging. ¿Qué podría ser un problema? Thnx

EDIT: me cambió todo. puse nuevo filtro intención al receptor como esto (en negrita):

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

y me cambió BroadcastReceiver heredan clase como esta (una negrita):

@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);** 
... 

ahora consigo estado solamente ociosas, pero todavía hay no está sonando

+0

no hay nadie para ayudar? ¿Alguien que sabe dónde estoy equivocado en el código? – user1182625

Respuesta

5

Hay un error en el código fuente de la clase SipAudioCall.

Para evitar este problema:

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

¿Tiene una referencia para esto? – tristan2468

+0

He editado su respuesta y establecí el parámetro 'callbackImmediately' de' setListener' en true, lo que garantiza que se llame al método listener. –

+0

¡Esta es una gran solución! – vinitius

4

he implementado mismo escenario para aceptar o rechazar la llamada entrante en la demostración sorbo. Crea tu propia actividad (IncomingGui.java) con dos botones Aceptar y Rechazar. En la clase BroadcastReciever llame a su Actividad (IncomingGui.java) en el evento de llamada entrante.

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

a continuación, definir los métodos siguientes en la clase 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()); 
    } 

Luego, en IncomingGui.java definen siguiendo métodos detrás de "Aceptar" y "Rechazar" Botones. Ahora en llamadas entrantes tendrá su propia actividad de llamadas entrantes para aceptar o rechazar llamadas.

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

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

} 
+0

¡Exactamente lo que necesitaba! –

+0

¿Recibió con éxito la voz en ambos lados? En mi caso, estoy recibiendo voz solo por un lado. Cualquier sugerencia !!! –

+0

@JahangirKabir sí en 2013 – Zain

Cuestiones relacionadas