我有两个问题:
1:我的应用程序如何知道用于排序原生“Android 设备联系人”的默认排序顺序?
在 android 的“联系人”->“设置”中,我们有“列出方式”和“显示联系人方式”选项。我怎样才能在我的应用程序中获得这些偏好。
例如:假设设备联系人按“名字”排序,那么应用程序应该得到一些常量(或类似的东西)。另一方面,如果联系人按“姓氏”排序,则应用程序应该获得相同的常量(或信息)。
我搜索了 SO 并得到了这个链接,但问题是该解决方案在API 级别 5中已被弃用。
这是我获取联系人的查询
String userPreference = getPrefContacts();/* **getPrefContacts() will return either ContactsContract.Data.DATA2 or ContactsContract.Data.DATA3** */
try {
ContentResolver cr = getActivity().getContentResolver();
String[] projectionName = new String[] {
ContactsContract.Data.CONTACT_ID,
ContactsContract.Data.DATA2, ContactsContract.Data.DATA5,
ContactsContract.Data.DATA3, ContactsContract.Data.DATA1 };
String sortOrder = userPrefrence
+ " COLLATE LOCALIZED ASC";
Cursor nameCursor = cr.query(ContactsContract.Data.CONTENT_URI,
projectionName, null, null, sortOrder);
nameCursor.moveToFirst();
if (nameCursor.getCount() > 0) {
do {
String fName = nameCursor
.getString(nameCursor
.getColumnIndexOrThrow(ContactsContract.Data.DATA2));
String mName = nameCursor
.getString(nameCursor
.getColumnIndexOrThrow(ContactsContract.Data.DATA5));
String lName = nameCursor
.getString(nameCursor
.getColumnIndexOrThrow(ContactsContract.Data.DATA3));
String name = nameCursor
.getString(nameCursor
.getColumnIndexOrThrow(ContactsContract.Data.DATA1));
if (name != null) {
String[] projectionCommon = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.HAS_PHONE_NUMBER };
String selectionCommon = ContactsContract.Contacts.DISPLAY_NAME
+ " = ?";
String[] selectionArgCommon = new String[] { name };
Cursor common = cr.query(
ContactsContract.Contacts.CONTENT_URI,
projectionCommon, selectionCommon,
selectionArgCommon, null);
if (common.getCount() > 0) {
while (common.moveToNext()) {
String contactID = common
.getString(common
.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
int hasPhone = common
.getInt(common
.getColumnIndexOrThrow(ContactsContract.Contacts.HAS_PHONE_NUMBER));
if (hasPhone > 0) {
String[] projectionPhone = new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER };
String selectionPhone = ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = ?";
String[] selectionArgPhone = new String[] { contactID };
Cursor phoneCursor = cr
.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
projectionPhone,
selectionPhone,
selectionArgPhone, null);
if (phoneCursor.getCount() > 0) {
while (phoneCursor.moveToNext()) {
String phone = phoneCursor
.getString(phoneCursor
.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
if (phone != null) {
ContactData tmp = new ContactData(
name, fName, mName,
lName, phone, contactID);
if (raw.size() == 0) {
raw.add(tmp);
} else if (!(raw
.get(raw.size() - 1))
.getContactID()
.equalsIgnoreCase(
tmp.getContactID())) {
raw.add(tmp);
}
}
}
}
phoneCursor.close();
}
}
}
common.close();
}
} while (nameCursor.moveToNext());
nameCursor.close();
}
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
我需要getPrefContacts() 方法的代码
2:如何减少上述代码或任何其他方式消耗的查询时间?
希望有人可以帮助我。
提前致谢。