在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】:我只能回答你的第二个问题。
查询内容提供者时可以使用SQL的join属性。因此,删除了嵌套的 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设备的联系人>设置中获取排序顺序偏好选择的用户以及如何减少查询时间?的主要内容,如果未能解决你的问题,请参考以下文章