我正在处理一个应用程序,它会读取手机通讯录并以列表的形式显示它们。我必须从列表中向选定的联系人发送消息。但问题是,如果移动设备有超过500个联系人,应用程序将被挂起。我无法解决问题所在..
我在互联网上找到了这个代码,并在我的应用中实现。将显示联系人但是花了这么多时间。这是我的代码
ContentResolver cr = getActivity().getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null,null,null);
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
if (Integer.parseInt(cur.getString(cur.getColumnIndex(
ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
Cursor pCur =
cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +"=?",
new String[]{id}, null);
while (pCur.moveToNext()) {
int phoneType = pCur.getInt(pCur.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.TYPE));
String phoneNumber = pCur.getString(pCur.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER));
switch (phoneType) {
case Phone.TYPE_MOBILE:
Log.e(name + "(mobile number)", phoneNumber);
break;
case Phone.TYPE_HOME:
Log.e(name + "(home number)", phoneNumber);
break;
case Phone.TYPE_WORK:
Log.e(name + "(work number)", phoneNumber);
break;
case Phone.TYPE_OTHER:
Log.e(name + "(other number)", phoneNumber);
break;
default:
break;
}
}
pCur.close();
}
} }
答案 0 :(得分:1)
阅读联系人 -
private void fetchContacts() {
Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
while (phones.moveToNext()) {
String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
if (name == null || name.equals(""))
name = phoneNumber;
if (Utils.notNull(phoneNumber)) {
phoneNumber = Utils.checkAndWrapMobileNumber(getApplicationContext(), phoneNumber);
allContacts.put(phoneNumber, name);
contactList.add(phoneNumber);
}
}
phones.close();
}
最好在AssyncTask中使用此代码,以便在后台线程中阅读。
希望它会对你有所帮助:)。
答案 1 :(得分:0)
这是因为UI
线程中的繁重任务会阻塞UI
,为此目的使用AyncTask
。