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

标签 android android-contacts android-2.3-gingerbread

我有两个问题:

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/

相关文章:

Android webview,文件上传,在onActivityResult中设置结果时崩溃

android - 如何检测 Firebase 监听器是否已完成获取数据?

android - 当我滚动 recyclerview 时,recyclerview 项目会发生变化

javascript - JavaScript 循环中的异步调用 - Apache Cordova

java - onActivityResult 在 API 级别 17 下未调用

android - 是否应该在较新的 android 平台上检查文本到语音引擎的存在?

java - 如何通过单击应用程序内按钮向所有用户(或主题订阅者)发送通知?

cordova - 如何指定 Contact.photos 的 URL?

android - 2 ViewPager 在 Android 2.3 中不滚动

android - 为 hive 制作的应用程序可以在 Gingerbread 中使用吗?