Android に簡単な Facebook チャット アプリケーションを実装しようとしています。ユーザーがログインすると、アプリListActivity
はユーザーのオンライン連絡先を列挙する新しいものを開き、項目をクリックするとActivity
、会話が行われる別の項目が開きます。
ユーザーがログインする最初の画面は と呼ばれMainActivity
ます。これには 2 つEditText
の s が含まれています。1 つは FB ユーザー名用で、もう 1 つはパスワード用です。2 つのボタンもあります。s を空にする Clear ボタンEditText
と、クリックすると を介して次の AsyncTask を実行する OKボタンですnew LoginTask().execute()
。
class LoginTask extends AsyncTask<Void, Void, Void> {
private ProgressDialog loading;
@Override
protected void onPreExecute() {
loading = ProgressDialog.show(MainActivity.this, "", "Loading...");
}
@Override
protected Void doInBackground(Void... params) {
// setup XMPP connection
ConnectionConfiguration config = new ConnectionConfiguration(
"chat.facebook.com", 5222, "chat.facebook.com");
config.setDebuggerEnabled(true);
config.setSASLAuthenticationEnabled(true); // TRUE for fb
conn = new XMPPConnection(config);
try {
// attempt login
conn.connect();
SASLAuthentication.supportSASLMechanism("PLAIN", 0);
conn.login(login_field.getText().toString(),
pwd_field.getText().toString(), "");
Log.d("TRACE", "isAuthenticated? " + conn.isAuthenticated());
// list online contacts
Roster roster = conn.getRoster();
Collection<RosterEntry> entries = roster.getEntries();
Log.d("TRACE", "entries.size()=" + entries.size());
for (RosterEntry e : entries) {
Log.d("PRESENCE", e.getUser() + "=" + roster.getPresence(e.getUser()).isAvailable());
if (roster.getPresence(e.getUser()).isAvailable()) {
HashMap<String, String> contact = new HashMap<String, String>();
contact.put(NAME_KEY, e.getName());
contact.put(USERJID_KEY, e.getUser());
Log.d("ADD", "NAME_KEY=" + e.getName() + " USERJID_KEY=" + e.getUser());
contacts.add(contact);
}
}
Collections.sort(contacts, new ContactComparator()); // sort alphabetically
Log.d("TRACE", "MainActivity.contacts.size(): " + contacts.size());
Intent in = new Intent(MainActivity.this, ContactList.class);
startActivity(in);
} catch (Exception e) {
Log.d("EXCEPTION", e.toString());
}
return null;
}
@Override
protected void onPostExecute(Void result) {
loading.dismiss();
}
}
私の問題は、2番目の画面が開かれるたびに、ListViewに何も表示されないことがよくありますが、時々表示されます。経由で連絡先を取得している部分にログメッセージを追加することにしconn.getRoster()
ました。ほとんどの場合、への呼び出しconn.getRoster().getEntries.size()
はゼロを返しますが、実際にブラウザ経由で Facebook にログインすると、ログインしていることがわかります。オンライン連絡先があります。しかし、私が理解していないのは、正しい数値が返されることがありますが、アプリケーションを実行するのはほぼ 10 億回に 1 回だけです。
誰か助けてください。このアプリは 4 時間後に期限が切れますが、コードに問題がないように見えるため、もう何をすべきかわかりません。