2012-04-11 15 views
0

Ich versuche, einen Chat-Client für Android zu implementieren, die mit Google Talk-Dienst verbindet. Ich habe das meiste getan, ich verbinde mich mit dem Server, ich bekomme Kontakte (und zeige sie in einer ListView) und ich öffne eine neue Aktivität, wenn ich auf einen Kontaktnamen in der Liste klicke, wo die Nachrichten gesendet und empfangen werden. Mein Problem ist, dass ich jetzt versuche, die Anwesenheit der Kontakte eines Benutzerkontos zu erhalten. Ich habe diesen Code geschrieben, aber es funktioniert nicht und ich kann nicht herausfinden warum. Jede Hilfe wird geschätzt.Kontakt konnte nicht gefunden werden Präsenz mit aSmack-Bibliothek zum Verbinden von Google Talk-Service

Button connect = (Button) findViewById(R.id.connect); 
    connect.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 

      String username = getTheText(R.id.UserName); 
      String password = getTheText(R.id.Password); 

      login(username, password); 
      try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e1) { 
     e1.printStackTrace(); 
     } 
      roster = connection.getRoster(); 

      entries = roster.getEntries(); 
      arrayOfEntries = new ArrayList<RosterEntry>(entries); 
      searchedContacts = GetSearchContacts();\\This method is the one who is not working correctly 

      try{ 

       launchNextActivity(); 

      }catch(Exception e){ 
       e.printStackTrace(); 

      } 

     } 


    }); 
    /* 
* Asigna los datos del ArrayList de RosterEntry al ArraList de SearchContacts 
*/ 

private ArrayList<SearchContacts> GetSearchContacts(){ 
    ArrayList<SearchContacts> results = new ArrayList<SearchContacts>(); 
     \\The class SearchContacts is an own class very simple with a constructor which assigns 4 parameters to the objects of the class, and getters and setters for every parameter. 
    for (RosterEntry r : arrayOfEntries){ 
     SearchContacts sc = new SearchContacts(null, null,null,null); 
     sc.setNick(r.getName()); 
     sc.setEmail(r.getUser()); 
     roster.setSubscriptionMode(Roster.SubscriptionMode.accept_all); 
     prs = roster.getPresence(r.getUser()); 
     Presence.Mode presence2 = prs.getMode(); 
     status = ConvierteEnumToString(presence2); 
     sc.setFirstSentence(status); 
     results.add(sc); 


    } 
    return results; 

} 

\* 
    * 
    *\ 
private void ConvierteEnumToString(Presence.Mode pm){ 

    switch(pm){ 
    case available: 
     Log.i(LOGTAG,"Case Available"); 
     status= "Available"; 
     break; 
    case away: 
     Log.i(LOGTAG,"Case away"); 
     status= "Away"; 
     break; 
    case chat: 
     Log.i(LOGTAG,"Case chat"); 
     status= "chat"; 
     break; 
    case dnd: 
     Log.i(LOGTAG,"Case dnd"); 
     status= "Do not disturb"; 
     break; 
    case xa: 
     Log.i(LOGTAG,"Case xa"); 
     status= "Unavailable"; 
        break; 
      default: 
        Log.i(LOGTAG,"Invalid status"); 
        status="Invalid"; 
        break; 

    } 




} 

Wenn ich das Attribut dieser Zeile: String status = ConvierteEnumToString (presence2); und ich direkt Presence.Mode.available, es weist den Status für alle meine Kontakte verfügbar, aber es funktioniert korrekt. Wenn ich lasse es, wie es in dem Code oben ich eine Ausnahme wie diese:

04-10 23:11:02.866: W/dalvikvm(1722): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
04-10 23:11:02.886: E/AndroidRuntime(1722): FATAL EXCEPTION: main 
04-10 23:11:02.886: E/AndroidRuntime(1722): java.lang.NullPointerException 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at android.chat.Login.GetSearchContacts(Login.java:164) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at android.chat.Login.access$1(Login.java:153) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at android.chat.Login$1.onClick(Login.java:81) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at android.view.View.performClick(View.java:2485) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at android.view.View$PerformClick.run(View.java:9080) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at android.os.Handler.handleCallback(Handler.java:587) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at android.os.Handler.dispatchMessage(Handler.java:92) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at android.os.Looper.loop(Looper.java:123) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at java.lang.reflect.Method.invoke(Method.java:507) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
04-10 23:11:02.886: E/AndroidRuntime(1722):  at dalvik.system.NativeStart.main(Native Method) 

Mit dem Unterschied, dass ich manchmal einen Benutzerstatus erhalten und dann der Ausnahme auftritt und manchmal wird kein Status überhaupt bekommt. Vielen Dank für Ihre Hilfe!

Antwort

1

Ich habe das Problem entdeckt. Ich füge hier die Lösung hinzu, zu der es gehören könnte.

Das Problem war, dass, wenn diese Zeile ausgeführt wird:

Presence.Mode presence2 = prs.getMode();

Einer der möglichen Werte, die presence2 erhalten kann, ist null. Sie übergeben also eine Null-Variable an eine Try/Catch-Struktur, die auf eine Presence.Mode-Presence-Variable wartet ... Deshalb wird eine NullPointerException benötigt.

Ich habe eine if-Klausel direkt nach dieser Zeile hinzugefügt, die testet, ob die Variable presence2 gleich null ist und wenn es passiert, ändert sie es irgendwie. Ich nehme an, dass es auch möglich ist, die Zeile mit einer Try/Catch-Struktur zu umgeben und irgendwie die NullPointerException zu behandeln.

Ich hoffe, dass es jedem helfen kann, zumindest keine Zeit damit zu verlieren, eine Lösung dafür zu denken!