Google 토크 서비스에 연결하는 Android 용 채팅 클라이언트를 구현하려고합니다. 나는 그것의 대부분을했는데, 나는 서버에 연결하고, 연락처를 얻고 ListView에 보여주고 메시지가 보내고받는 목록의 연락처 이름을 클릭 할 때 새로운 활동을 연다. 내 문제는 이제 사용자 계정의 연락처가 있는지 확인하려고한다는 것입니다. 나는이 코드를 작성했으나 작동하지 않으며 이유를 찾을 수 없다. 어떤 도움을 주셔서 감사합니다.연락처를 검색 할 수 없습니다. Google 토크 서비스 연결을 위해Smack 라이브러리를 사용하여 현재 상태를 표시합니다.
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;
}
}
나는이 라인의 속성을 변경하는 경우 : 문자열 상태 = ConvierteEnumToString (presence2를); 나는 Presence.Mode.available을 직접 두었고 모든 연락처에 사용 가능한 상태를 할당하지만 제대로 작동합니다.
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)
가끔 한 사용자 상태를 확인하고 예외가 발생하고 때로는 더 상태가 전혀 없어되어 차이로 :이 같은 예외를 얻을 위는 코드에서와 같이 나는 그것을 할 경우. 도움 주셔서 대단히 감사합니다!