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列,这需要很多时间

使用AsyncTaskLoader怎么样

当您想要获取联系人列表时,请编写此代码

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);

            }
        }
    }