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

Posted

技术标签:

【中文标题】在Android设备的联系人>设置中获取排序顺序偏好选择的用户以及如何减少查询时间?【英文标题】:Get sorting order preference selected user in Contacts>settings in Android Device and How to reduce query time? 【发布时间】:2013-11-03 09:27:57 【问题描述】:

我有两个问题:

1:我的应用程序如何知道用于排序原生“android 设备联系人”的默认排序顺序?

在安卓的“联系人”->“设置”中,我们有“List by”和“Display Contacts by”选项。如何在我的应用程序中获得这些偏好。

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

我搜索了 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:如何减少上述代码所消耗的查询时间或任何其他方式??

希望有人可以帮助我。

提前致谢。

【问题讨论】:

【参考方案1】:

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

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


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

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

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

【讨论】:

【参考方案2】:

当您为列表活动创建自己的 CustomAdapter 时,您可以在列表活动中管理排序顺序。

数据的过滤和排序由适配器处理。您需要在自定义适配器实现中实现逻辑。

适配器通过 ListView 对象上的 setAdapter 方法分配给 ListView。

例如

public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    Cursor mCursor = getContacts();
    startManagingCursor(mCursor);
    // now create a new list adapter bound to the cursor.
    // SimpleListAdapter is designed for binding to a Cursor.
    ListAdapter adapter = new SimpleCursorAdapter(this, // Context.
        android.R.layout.two_line_list_item, // Specify the row template
                            // to use (here, two
                            // columns bound to the
                            // two retrieved cursor
                            // rows).
        mCursor, // Pass in the cursor to bind to.
        // Array of cursor columns to bind to.
        new String[]  ContactsContract.Contacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME ,
        // Parallel array of which template objects to bind to those
        // columns.
        new int[]  android.R.id.text1, android.R.id.text2 );

    // Bind to our new adapter.
    setListAdapter(adapter);
  

  private Cursor getContacts() 
    // Run query
    Uri uri = ContactsContract.Contacts.CONTENT_URI;
    String[] projection = new String[]  ContactsContract.Contacts._ID,
        ContactsContract.Contacts.DISPLAY_NAME ;
    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '"
        + ("1") + "'";
    String[] selectionArgs = null;
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
        + " COLLATE LOCALIZED ASC";

    return managedQuery(uri, projection, selection, selectionArgs,
        sortOrder);
  

这里的排序顺序是通过游标管理的,游标包含列表的数据。

【讨论】:

但我想知道:设备排序的顺序是什么,即 list by 选项的用户偏好是什么(list by: firstName)。

以上是关于在Android设备的联系人>设置中获取排序顺序偏好选择的用户以及如何减少查询时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Android 设备中仅获取电话号码联系人

获取 Android 手机联系人的跨设备唯一 ID

如何使用 phonegap 作为复选框列表显示从 android 设备获取的联系人?

Android以编程方式从联系人获取设备默认电话号码

Android:联系人列表不按名称排序

如何在 Android 中获取联系人的 groupId / GroupName?