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!