gpt4 book ai didi

android - 在 Android 设备的“联系人”>“设置”中获取选定用户的排序偏好以及如何减少查询时间?

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:54:46 25 4
gpt4 key购买 nike

我有两个问题:

1:我的应用程序如何知道用于对 native “Android 设备联系人”进行排序的默认排序顺序?

在 android 的“联系人”->“设置”中,我们有“列表依据”和“显示联系人依据” 选项。我怎样才能在我的应用程序中获得这些偏好。

例如:假设设备联系人按“名字”排序,那么应用程序应该得到一些常量(或类似的东西)。另一方面,如果联系人按“姓氏”排序,那么应用程序应该获得与此相关的常量(或信息)。

我搜索了 SO 并得到了这个 link ,但问题是该解决方案在 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:如何减少上述代码或任何其他方式消耗的查询时间??

希望有人能帮助我。

提前致谢。

最佳答案

我只能回答你的第二个问题

您可以在查询内容提供者时使用SQLjoin 属性。因此,删除了嵌套的 while 循环,从而减少了查询时间。


编辑:对于您的第一个问题,试试这个:

int sort_order=Settings.system.getInt (getApplicationContext ().getContentResolver (),"android.contacts.SORT_ORDER");

在我的三星 S2 设备上,sort_order = 1 当联系人按 firstname 列出时 sort_order = 2 当联系人按 列出时>姓氏。

关于android - 在 Android 设备的“联系人”>“设置”中获取选定用户的排序偏好以及如何减少查询时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19569896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com