Sip Error mientras se registra

Estoy utilizando métodos nativos de llamada de sip y está funcionando bien, pero alguna vez está dando error de registro IN_PROGRESS (Código de error -9). Tengo búsqueda en los códigos de error SIP, pero dint encontrar cualquier código de error de este tipo. Aquí está mi código para el registro del sip .PLease me dicen si cualquier uno tiene idea sobre este error por favor dígame.

import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.util.Log; import android.view.*; import android.net.sip.*; import java.text.ParseException; /** * Handles all calling, receiving calls, and UI interaction in the WalkieTalkie app. */ public class WalkieTalkieActivity extends Activity implements View.OnTouchListener { public String sipAddress = null; public static SipManager manager = null; public static SipProfile me = null; public SipAudioCall call = null; public SipErrorCode sipcode; public SipException sipexeception; public static WalkieTalkieActivity walkiy; public static WalkieTalkieActivity getInstance() { if (walkiy == null) { walkiy = new WalkieTalkieActivity(); } return walkiy; } @ Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); Log.e("onCreate", "onCreate"); initializeManager(this); } @ Override public void onStart() { super.onStart(); // When we get back from the preference setting Activity, assume // settings have changed, and re-login with new auth info. } @ Override public void onDestroy() { super.onDestroy(); if (call != null) { call.close(); } closeLocalProfile(); } @ Override protected void onResume() { initializeManager(this); super.onResume(); } public void initializeManager(Context ctx) { Log.e("inilitize", "initialize manager"); if (manager == null) { manager = SipManager.newInstance(ctx); } initializeLocalProfile(ctx); } /** * Logs you into your SIP provider, registering this device as the location to * send SIP calls to for your SIP address. */ public void initializeLocalProfile(final Context ctx) { Log.e("inilitize", "initialize profile"); if (manager == null) { Log.e("inilitize", "return in profile"); updateStatus("we are unable to establish this feature on your device ", ctx); Log.e("Wifi state", "" + SipManager.isSipWifiOnly(ctx)); return; } SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx); String username = prefs.getString("namePref", "XYZ"); String domain = prefs.getString("domainPref", "236.343.230.2"); String password = prefs.getString("passPref", "XYZ"); try { Log.e("inilitize", "building profile "); SipProfile.Builder builder = new SipProfile.Builder(username, domain); builder.setPassword(password); me = builder.build(); manager.open(me); Log.e("alredy registered1", "" + manager.isRegistered(me.getUriString())); try { if (manager.isRegistered(me.getUriString())) { Log.e("alredy registered2", "" + manager.isRegistered(me.getUriString())); updateStatus("Ready", ctx); return; } } catch (SipException e) { // TODO Auto-generated catch block closeLocalProfile(); e.printStackTrace(); } manager.setRegistrationListener(me.getUriString(), new SipRegistrationListener() { public void onRegistering(String localProfileUri) { Log.e("Sip restration", "Registering with SIP Server..." + me.getUriString()); updateStatus("Registering with SIP Server...", ctx); } public void onRegistrationDone(String localProfileUri, long expiryTime) { Log.e("Sip restration", "Ready"); updateStatus("Ready", ctx); } public void onRegistrationFailed(String localProfileUri, int errorCode, String errorMessage) { Log.e("Error Code Registration ", SipErrorCode.toString(errorCode) + " " + errorCode); updateStatus(SipErrorCode.toString(errorCode), ctx); } }); } catch (ParseException pe) { updateStatus("Connection Error.", ctx); } catch (SipException se) { updateStatus("Connection error.", ctx); } } /** * Closes out your local profile, freeing associated objects into memory * and unregistering your device from the server. */ public void closeLocalProfile() { if (manager == null) { return; } try { if (me != null) { manager.unregister(me, new SipRegistrationListener() { @ Override public void onRegistrationFailed(String localProfileUri, int errorCode, String errorMessage) { // TODO Auto-generated method stub Log.e("unregister failed", "unregister failed"); } @ Override public void onRegistrationDone(String localProfileUri, long expiryTime) { // TODO Auto-generated method stub Log.e("unregister done", "unregister done"); } @ Override public void onRegistering(String localProfileUri) { // TODO Auto-generated method stub Log.e("unregistering", "unregistering"); } }); manager.close(me.getUriString()); } } catch (Exception ee) { Log.d("WalkieTalkieActivity/onDestroy", "Failed to close local profile.", ee); } } /** * Make an outgoing call. */ public void initiateCall(String number, final Context ctx, final View v) { Log.d("Number", "" + number); sipAddress = number; Log.e("initiating call", "initiating call"); try { SipAudioCall.Listener listener = new SipAudioCall.Listener() {@ Override public void onCallBusy(SipAudioCall call) { // TODO Auto-generated method stub Log.e("buzy", "buzy"); super.onCallBusy(call); } @ Override public void onCallHeld(SipAudioCall call) { // TODO Auto-generated method stub Log.e("held", "held"); super.onCallHeld(call); } @ Override public void onCalling(SipAudioCall call) { // TODO Auto-generated method stub Log.e("calling", "calling"); super.onCalling(call); } @ Override public void onChanged(SipAudioCall call) { // TODO Auto-generated method stub Log.e("changed", "changed"); super.onChanged(call); } @ Override public void onError(SipAudioCall call, int errorCode, String errorMessage) { // TODO Auto-generated method stub Log.e("call error", "error" + SipErrorCode.toString(errorCode) + " " + errorCode); CallingScreen.fa.finish(); super.onError(call, errorCode, errorMessage); } @ Override public void onReadyToCall(SipAudioCall call) { // TODO Auto-generated method stub Log.e("ready to call", "ready to call "); super.onReadyToCall(call); } @ Override public void onRinging(SipAudioCall call, SipProfile caller) { // TODO Auto-generated method stub Log.e("ringing", "ringing"); super.onRinging(call, caller); } @ Override public void onRingingBack(SipAudioCall call) { // TODO Auto-generated method stub Log.e("ringing back", "ringing back"); super.onRingingBack(call); } // Much of the client's interaction with the SIP Stack will // happen via listeners. Even making an outgoing call, don't // forget to set up a listener to set things up once the call is established. @ Override public void onCallEstablished(SipAudioCall call) { Log.e("call established", "call established"); call.startAudio(); updateTime(true, ctx); } @ Override public void onCallEnded(SipAudioCall call) { Log.e("call ended", "call ended"); updateTime(false, ctx); CallingScreen.fa.finish(); } }; Log.e("param 1 ", "" + me.getUriString()); call = manager.makeAudioCall(me.getUriString(), sipAddress + "@216.245.200.2:5060", listener, 30); } catch (Exception e) { e.printStackTrace(); Log.i("WalkieTalkieActivity/InitiateCall", "Error when trying to close manager.", e); if (me != null) { try { closeLocalProfile(); } catch (Exception ee) { ee.printStackTrace(); Log.i("WalkieTalkieActivity/InitiateCall", "Error when trying to close manager.", ee); ee.printStackTrace(); } } if (call != null) { call.close(); } } } public void updateStatus(final String status, final Context context) { // Be a good citizen. Make sure UI changes fire on the UI thread. this.runOnUiThread(new Runnable() { public void run() { generateNotification(context, status); } }); } public void updateTime(final Boolean status, final Context context) { // Be a good citizen. Make sure UI changes fire on the UI thread. this.runOnUiThread(new Runnable() { public void run() { if (status) { CallingScreen.fa.calling_screen_text.setVisibility(View.GONE); CallingScreen.fa.ch.setVisibility(View.VISIBLE); CallingScreen.fa.ch.start(); } else { CallingScreen.fa.ch.stop(); } } }); } public void updateStatus(SipAudioCall call) { String useName = call.getPeerProfile().getDisplayName(); if (useName == null) { useName = call.getPeerProfile().getUserName(); } // updateStatus(useName + "@" + call.getPeerProfile().getSipDomain()); } public boolean onTouch(View v, MotionEvent event) { if (call == null) { return false; } else if (event.getAction() == MotionEvent.ACTION_DOWN && call != null && call.isMuted()) { call.toggleMute(); } else if (event.getAction() == MotionEvent.ACTION_UP && !call.isMuted()) { call.toggleMute(); } return false; } public void speaker(Boolean state) { if (call != null) call.setSpeakerMode(state); } public void endcall() { if (call != null) { try { call.endCall(); } catch (SipException se) { Log.d("WalkieTalkieActivity/onOptionsItemSelected", "Error ending call.", se); } call.close(); } } public static void generateNotification(Context context, String message) { Log.e("inilitize", "generate notification"); int icon = R.drawable.ic_launcher; long when = System.currentTimeMillis(); NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = new Notification(icon, message, when); String title = context.getString(R.string.app_name); Intent notificationIntent = new Intent(context, Splash_screen.class); // set intent so it does not start a new activity notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, 0); notification.setLatestEventInfo(context, title, message, intent); notificationManager.notify(0, notification); } } 

SIP es un protocolo basado en transacciones, esto significa que cada proceso de negociación es una transacción (por ejemplo, un proceso de registro básico implicaría enviar una solicitud REISTER y recibir 200 respuestas OK). Envié un pequeño ejemplo en esta respuesta.

IN_PROGRESS error inicialmente indica que intentó iniciar una nueva transacción, en su escenario que está tratando de enviar una solicitud de REGISTRO, cuando el cliente ya está en otra relacionada.

Un escenario bastante típico es, en un logout rápido / inicio de sesión, tratando de registrarse cuando el proceso de anulación de registro todavía está en ejecución (no se recibió una respuesta final de 200 OK).

Problema principal con respecto a la implementación SIP de Android y este código de error es que se utiliza cuando como error genérico al procesar una solicitud SIP no así, el significado anterior pierde su significado.

Debido a un problema anterior, tendría que comprobar logcat para obtener más información (debería ver algo como "~~~~~ SipSessionGroup :: processing"), pero, la mejor manera de manejar esto, sería trabajar con diferentes oyentes proporcionados por la pila .

La pila proporciona dos oyentes que pueden obtener errores de registro: SipRegistrationListener y SipSession.Listener . Ambos proporcionan onRegistrationFailed callback pero, más tarde, también proporciona onRegistrationTimeout , que puede ser muy útil. De hecho, ya usaste SipRegistrationListener en tu código, pero realmente no entiendo por qué dices que debería estar configurado después de open porque open intentaría registrarse automáticamente y, si ocurre algún error, no serás notificado.

Por otro lado, el principal problema con estos oyentes es que el registro puede fallar debido a varias razones (puede comprobar una lista de diferentes respuestas de error aquí ) y la implementación actual sólo notifica los códigos de error> = 500 (los errores del servidor y global) Pero no otros como bastante común 406. Esto es, en mi opinión, un error importante en esta pila.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.