android获取联系人详细信息,如号码和缩略图
我使用这段代码可以获取联系人的号码和联系人的缩略图,但这并不合适,加载和准备联系人需要很长时间 请帮助我提高此代码的性能:android获取联系人详细信息,如号码和缩略图,android,performance,thumbnails,android-contentprovider,android-contacts,Android,Performance,Thumbnails,Android Contentprovider,Android Contacts,我使用这段代码可以获取联系人的号码和联系人的缩略图,但这并不合适,加载和准备联系人需要很长时间 请帮助我提高此代码的性能: List<Contact_Pojo> list = new ArrayList<Contact_Pojo>(); ContentResolver cr = getActivity().getContentResolver(); Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, n
List<Contact_Pojo> list = new ArrayList<Contact_Pojo>();
ContentResolver cr = getActivity().getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
null, null, Phone.DISPLAY_NAME + " ASC");
int i = 0;
if (cur.moveToFirst()) {
while (cur.moveToNext()) {
Cursor phoneCursor = getActivity()
.getContentResolver()
.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER, },
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = ?",
new String[] { cur.getString(cur
.getColumnIndex(ContactsContract.Contacts._ID)) },
null);
if (phoneCursor.moveToFirst()) {
Contact_Pojo personContact = new Contact_Pojo();
/*
* Id
*/
personContact.setId(cur.getString(1));
/*
* Name
*/
personContact
.setName(cur.getString(cur
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
/*
* Photo ID
*/
personContact
.setImageUrl(cur.getString(cur
.getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI)));
/*
* Number
*/
personContact.setNumber(phoneCursor.getString(0));
//
list.add(personContact);
}
phoneCursor.close();
}
}
cur.close();
return list;
List List=new ArrayList();
ContentResolver cr=getActivity().getContentResolver();
Cursor cur=cr.query(Contacts contract.Contacts.CONTENT\u URI,null,
空,空,Phone.DISPLAY_NAME+“ASC”);
int i=0;
if(cur.moveToFirst()){
while(cur.moveToNext()){
游标phoneCursor=getActivity()
.getContentResolver()
.query(contacts contract.commondatatypes.Phone.CONTENT\u URI、,
新字符串[]{ContactsContract.CommonDataTypes.Phone.NUMBER,},
Contacts contract.CommonDataTypes.Phone.CONTACT\u ID
+ " = ?",
新字符串[]{cur.getString(cur
.getColumnIndex(Contacts contract.Contacts.\u ID))},
无效);
if(phoneCursor.moveToFirst()){
联系人_Pojo personContact=新联系人_Pojo();
/*
*身份证
*/
personContact.setId(cur.getString(1));
/*
*名字
*/
个人接触
.setName(cur.getString(cur
.getColumnIndex(Contacts.Contacts.DISPLAY_NAME));
/*
*照片ID
*/
个人接触
.setImageUrl(cur.getString(cur
.getColumnIndex(Contacts.Contacts.PHOTO_缩略图_URI));
/*
*数
*/
personContact.setNumber(phoneCursor.getString(0));
//
列表。添加(个人联系人);
}
phoneCursor.close();
}
}
cur.close();
退货清单;
2015年4月4日更新
- 它很慢,因为它从contact provider获取所有列,在这个表中有+20列,这需要很多时间
getLoaderManager()或getSupportLoaderManager().initLoader(int-id,Bundle-args,LoaderManager.LoaderCallbacks-LoadingCallbacks)
公共类LoadingCallback实现LoaderManager.LoaderCallbacks{
@凌驾
公共加载器onCreateLoader(inti,Bundle){
//显示你的对话;
返回新的InitializeContactStatsk(上下文,(ArrayList)联系人列表,mAdapter);
}
@凌驾
公共void onLoadFinished(加载器void加载器,void aVoid){
//UI在后台任务和隐藏对话框后在此工作。
}
@凌驾
公共void onLoaderReset(加载程序void加载程序){
}
}
及
公共类初始化应用程序STASK扩展了AsyncTaskLoader{
@凌驾
开始加载时受保护的void(){
力载荷();
}
@凌驾
公共无效加载背景(){
//在此处查询联系人并返回null
返回null;
}
}
这很慢,因为您要从联系人提供商处获取所有列,所以使用投影仅获取所需的列。像
String[]投影={
Contacts contract.Contacts.DISPLAY\u NAME
//这只是一个示例,添加所需的字段
} ;代码>
你能告诉我第二次询问的目的是什么吗?因为这是我联系的结果
我获得所有联系的方法是
@suppressint(“InlinedApi”)
公共联系人(){
长l1=System.currentTimeMillis();
Log.d(“调试”,
“启动readContacts()时间”+l1);
ContentResolver cr=getContentResolver();
Cursor cur=cr.query(Contacts contract.Contacts.CONTENT\u URI,null,
空,空,空);
如果(cur.getCount()>0){
while(cur.moveToNext()){
联系人_pojo cp=新联系人_pojo();
字符串联系人\u Id=cur.getString(cur
.getColumnIndex(Contacts contract.Contacts._ID));
字符串Contact_Name=cur
.getString(cur)
.getColumnIndex(Contacts contract.Contacts.DISPLAY_NAME));
字符串photothumb=“”;
试一试{
photothumb=cur
.getString(cur)
.getColumnIndex(ContactsContract.Contacts.PHOTO_缩略图_URI));
如果(photothumb!=null
&&!photothumb.toString().equalsIgnoreCase(“”){
cp.setImageUri(photothumb);
}
}捕获(例外e){
e、 printStackTrace();
}
cp.setId(联系人Id);
cp.setName(联系人姓名);
游标phones=cr.query(Phone.CONTENT\u URI,null,
Phone.CONTACT_ID+“=”+CONTACT_ID,null,null);
while(phones.moveToNext()){
字符串编号=phones.getString(电话
.getColumnIndex(电话号码));
int type=phones.getInt(phones.getColumnIndex(Phone.type));
Log.d(“调试”、“编号”+编号+“类型”+类型);
cp.setNumber(编号);
}
电话。关闭();
联系人列表。添加(cp);
}
}
long l2=System.currentTimeMillis();
Log.d(“调试”,
“完成读取联系人()时间”+l2);
Log.d(“调试”,“加载的联系人总数”+contactList.size()+”在“+(l2-l1)+“ms”内);
}
不要使用双重查询,如果设备有很多联系人,并且在某些设备上也不工作,这会占用太多时间
您还可以获取联系人w
public class LoadingCallback implements LoaderManager.LoaderCallbacks<Void> {
@Override
public Loader<Void> onCreateLoader(int i, Bundle bundle) {
// Show your dialog;
return new InitializeContactsTask(context, (ArrayList) contactList, mAdapter);
}
@Override
public void onLoadFinished(Loader<Void> voidLoader, Void aVoid) {
// UI Work here after background task and hide dialog.
}
@Override
public void onLoaderReset(Loader<Void> voidLoader) {
}
}
public class InitializeApplicationsTask extends AsyncTaskLoader<Void> {
@Override
protected void onStartLoading() {
forceLoad();
}
@Override
public Void loadInBackground() {
// Query the contacts here and return null
return null;
}
}
public void fetchContacts()
{
String[] projection = new String[] {
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID};
String _ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID;
String DISPLAY_NAME = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? Contacts.DISPLAY_NAME_PRIMARY : Contacts.DISPLAY_NAME;
String NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER;
Cursor cursor = mActivity.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
projection, ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER + "=?", new String[] { "1" },
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
System.out.println("contact size.."+cursor.getCount());
if (cursor.getCount() > 0) {
while (cursor.moveToNext()) {
String contact_id = cursor.getString(cursor.getColumnIndex( _ID ));
String name = cursor.getString(cursor.getColumnIndex( DISPLAY_NAME ));
String phoneNumber = cursor.getString(cursor.getColumnIndex(NUMBER));
System.out.println(" name : "+name);
System.out.println(" number : "+phoneNumber);
}
}
}