No hay evento de llamada en las llamadas entrantes
No sé dónde está un problema. El oyente no captura el evento onRinging
(por lo que puedo decidir si acepto o rechazo las llamadas entrantes). En manifiesto es esto:
<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 la clase BroadcastReceiver
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; ...
CallEnd
evento CallEnd
y onChanged
(después de terminar la llamada) pero no onRinging
evento onRinging
. Lo que podría ser un problema? Thnx
EDIT: Lo cambié todo. Pongo nuevo filtro intención al receptor como este (negrita):
<receiver android:name=".IncomingCallReceiver" android:label="Call Receiver"> **<intent-filter> <action android:name="android.intent.action.PHONE_STATE" /> </intent-filter>** </receiver>
Y cambié BroadcastReceiver heredar clase como esta (en 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 solamente el estado IDLE pero todavía no hay anillo.
He implementado el mismo escenario para aceptar o rechazar llamadas entrantes en sip demo. Crea tu propia actividad (IncomingGui.java) con dos botones Aceptar y Rechazar. En la clase BroadcastReciever llame a su Actividad (IncomingGui.java) en un evento de llamada entrante.
WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context; incomingCall = wtActivity.manager.takeAudioCall(intent, listener); showIncomingCallGui(intent, context); wtActivity.call = incomingCall;
A continuación, defina los siguientes métodos 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()); }
A continuación, en IncomingGui.java definir los siguientes métodos detrás de "Aceptar" y "Rechazar" Botones. Ahora en la llamada entrante usted tendrá su propia actividad entrante de la llamada para aceptar o rechazar la llamada.
public void onCallAcceptButton(View view){ IncomingCallReceiver.answerIncomingCall(); } public void onCallRejectButton(View view){ IncomingCallReceiver.rejectIncomingCall(); this.finish(); }
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);