2014-10-03 2 views
3

Я хочу получить данные всех контактов, такие как «Номер телефона», «Отображаемое имя», «Отображать изображение» и «Идентификатор электронной почты». Для этого я использую метод ниже, и он работает нормально.Восстановить контакты быстрее из адресной книги в android

public void readContacts() { 
    Log.d("readcontacts", "::" + "true"); 
    String phoneNumber = null; 
    ContentResolver cr = getContentResolver(); 
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, 
      null, null, null); 
    if (cur.getCount() > 0) { 
     while (cur.moveToNext()) { 
      // contactEntity = new ContactEntity(); 
      final ContentValues values = new ContentValues(); 
      String Contact_Id = cur.getString(cur 
        .getColumnIndex(ContactsContract.Contacts._ID)); 
      values.put(KEY_ID, Integer.parseInt(Contact_Id)); 

      int hasPhoneNumber = Integer 
        .parseInt(cur.getString(cur 
          .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))); 
      /* 
      * contactEntity .setContactFirstName(cur.getString(cur 
      * .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))); 
      */ 

      if (Integer 
        .parseInt(cur.getString(cur 
          .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
       // System.out.println("name : " + name + ", ID : " + id); 
       // sb.append("\n Contact Name:" + name); 
       Cursor pCur = cr 
         .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
           null, 
           ContactsContract.CommonDataKinds.Phone.CONTACT_ID 
             + " = ?", 
           new String[] { Contact_Id }, null); 
       if (pCur.moveToFirst()) { 
        phoneNumber = pCur 
          .getString(pCur 
            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        // sb.append("\n Phone number:" + phone); 
        // System.out.println("phone" + phone); 

       } 
       pCur.close(); 

       Cursor emailCur = cr 
         .query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
           null, 
           ContactsContract.CommonDataKinds.Email.CONTACT_ID 
             + " = ?", 
           new String[] { Contact_Id }, null); 
       if (emailCur.moveToFirst()) { 
        values.put(
          KEY_CONTACTEMAIL, 
          (emailCur.getString(emailCur 
            .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)))); 
        // emailType = emailCur .getString(emailCur 
        // .getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); 

       } 
       emailCur.close(); 

       if (phoneNumber.length() >= 10) { 
        final Uri my_contact_Uri = Uri.withAppendedPath(
          ContactsContract.Contacts.CONTENT_URI, 
          String.valueOf(Contact_Id)); 


           InputStream photo_stream = ContactsContract.Contacts 
             .openContactPhotoInputStream(
               getContentResolver(), 
               my_contact_Uri); 
           if (photo_stream != null) { 
            BufferedInputStream buf = new BufferedInputStream(
              photo_stream); 
            Bitmap my_btmp = BitmapFactory 
              .decodeStream(buf); 
            ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
            my_btmp.compress(Bitmap.CompressFormat.PNG, 
              100, bos); 
            byte[] bArray = bos.toByteArray(); 
            values.put(KEY_CONTACTIMAGE, bArray); 
           } 
          } catch (Exception e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } 

         } 


        // contactEntity.setBitmapContactImage(my_btmp); 
        values.put(
          KEY_CONTACTNAME, 
          String.valueOf(cur.getString(cur 
            .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)))); 
        values.put(KEY_CONTACTNUMBER, 
          String.valueOf(phoneNumber)); 
        databaseHelperAssets.open(); 
        databaseHelperAssets.addcontact(values); 
        databaseHelperAssets.close(); 
       } 

      } 
      // values.put(KEY_TIMESWAP, 
      // String.valueOf(taskEnitiy.getTimeswap())); 
      // int SDK_INT = android.os.Build.VERSION.SDK_INT; 

      /* 
      * if (SDK_INT >= 11) { contactEntity 
      * .setImgUri(cur.getString(cur 
      * .getColumnIndex(ContactsContract. 
      * CommonDataKinds.Phone.PHOTO_URI))); } 
      */ 
      // alContactEntities.add(contactEntity); 
     } 
    } 

} 

Но проблема заключается в том, что требуется около 45 секунд до 1 минуты, чтобы получить информацию о 400 контактах. Я не могу заставить своих пользователей ждать так долго каждый раз, когда требуется получить контакт. Так может ли кто-нибудь помочь мне сократить время поиска контакта? и Да, я использую для хранения моего контакта в базе данных, потому что я впервые читаю свои контакты только при запуске приложения. Поэтому я найду лучший способ получить его, чтобы исключить сохранение контактов в базе данных. Заранее спасибо !!

+0

Нужно ли открывать и закрывать 'databaseHelperAssets' на каждой записи? –

+0

На самом деле я не хочу использовать базу данных. Я хочу показать ее на лету. – Jigar

+0

. Меняю работу базы данных. Открываем и закрываем за пределами цикла, но все равно это слишком долго для меня. – Jigar

ответ

1

Спасибо всем за помощь и намек, но, наконец, я получил свой ответ. Я использую следующий код, чтобы получить изображение дисплея:

InputStream photo_stream = ContactsContract.Contacts 
            .openContactPhotoInputStream(
              getContentResolver(), 
              my_contact_Uri); 
          if (photo_stream != null) { 
           BufferedInputStream buf = new BufferedInputStream(
             photo_stream); 
           Bitmap my_btmp = BitmapFactory 
             .decodeStream(buf); 
           ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
           my_btmp.compress(Bitmap.CompressFormat.PNG, 
             100, bos); 
           byte[] bArray = bos.toByteArray(); 
           values.put(KEY_CONTACTIMAGE, bArray); 
          } 
         } catch (Exception e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 

но чем я изменить его на:

try { 
       String phototjumb = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI)); 
       if(phototjumb != null && !phototjumb.toString().equalsIgnoreCase("")){ 
        contactEntity.setImageURI(phototjumb); 
        Log.d("photojumb", "::" + phototjumb); 
       } 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

и чем я использовать, чтобы показать, что photojumb на мой ImageView как:

imgContactImg.setImageURI(Uri.parse(contactEntity.getImageURI())); 

и все. Теперь мне вряд ли потребуется 2 секунды, чтобы я показывал контакты «на лету» непосредственно в пользовательском списке.

Не беспокойтесь, я отправляю свой полный метод для извлечения контакта. Здесь это ::

@SuppressLint("InlinedApi") 
public void readContacts() { 
    ContentResolver cr = getContentResolver(); 
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, 
      null, null, null); 
    if (cur.getCount() > 0) { 
     while (cur.moveToNext()) { 
      contactEntity = new ContactEntity(); 
      String Contact_Id = cur.getString(cur 
        .getColumnIndex(ContactsContract.Contacts._ID)); 
      contactEntity 
        .setContactFirstName(cur.getString(cur 
          .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))); 


      try { 
       String phototjumb = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI)); 
       if(phototjumb != null && !phototjumb.toString().equalsIgnoreCase("")){ 
        contactEntity.setImageURI(phototjumb); 
        Log.d("photojumb", "::" + phototjumb); 
       } 

      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      alContactEntities.add(contactEntity); 
     } 
    } 

} 

Успешное кодирование. :)

Перейди через ниже прилагается обновленный код, чтобы получить номер контакта, отображаемое имя, отображаемое изображение, электронная почта и т.д .. Id

public ArrayList<ContactEntity> readContacts1() { 
    //Log.d("readcontacts", "::" + "true"); 
    alContactEntities = new ArrayList<ContactEntity>(); 
    String phoneNumber = null; 
    String tempPhoneNumber = null; 
    contactCount = 0; 
    ContentResolver cr = activity.getContentResolver(); 

    Cursor cur = cr.query(
      ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
      null, null, null); 

    if (cur.getCount() > 0) { 
     while (cur.moveToNext()) { 
      contactEntity = new ContactEntity(); 

      String Contact_Id = cur.getString(cur 
        .getColumnIndex(ContactsContract.Contacts._ID)); 

      if (Integer 
        .parseInt(cur.getString(cur 
          .getColumnIndex(ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER))) > 0) { 
       /* 
       * // System.out.println("name : " + name + ", ID : " + id); 
       * // sb.append("\n Contact Name:" + name); 
       */ 
       /* 
       * Cursor pCur = cr 
       * .query(ContactsContract.CommonDataKinds.Phone 
       * .CONTENT_URI, null, 
       * ContactsContract.CommonDataKinds.Phone.CONTACT_ID + 
       * " = ?", new String[] { Contact_Id }, null); if 
       * (pCur.moveToFirst()) { 
       */ 
       phoneNumber = cur 
         .getString(cur 
           .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 



       /* 
       * String regexStr = "^[0-9\\-\\+]*$"; phoneNumber = 
       * phoneNumber.replaceAll("\\D",""); 
       */ 
       //Log.d("PohneNumber", "" + phoneNumber); 

       /* 
       * } pCur.close(); 
       */ 

       // remove comment from below code to obtain email id 
       /*Cursor emailCur = cr 
         .query(ContactsContract.CommonDataKinds 
             .Email.CONTENT_URI, null, 
           ContactsContract.CommonDataKinds.Email.CONTACT_ID + 
             " = ?", new String[]{Contact_Id}, null); 
       if 
         (emailCur.moveToFirst()) { 
        contactEntity.setContactEmailId 
          ((emailCur.getString(emailCur 
            .getColumnIndex(ContactsContract 
              .CommonDataKinds.Email.DATA)))); 
       } 
       emailCur.close();*/ 

       Uri uriBirthdate = ContactsContract.Data.CONTENT_URI; 

       String[] projectionBirthdate = new String[]{ 
         ContactsContract.Contacts.DISPLAY_NAME, 
         ContactsContract.CommonDataKinds.Event.CONTACT_ID, 
         ContactsContract.CommonDataKinds.Event.START_DATE 
       }; 

       String whereBirthdateCaluse = 
         ContactsContract.CommonDataKinds.Event.CONTACT_ID + "= ? AND " + 
           ContactsContract.Data.MIMETYPE + "= ? AND " + 
           ContactsContract.CommonDataKinds.Event.TYPE + "=" + 
           ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY; 
       String[] selectionArgsBirthdate = new String[]{Contact_Id, 
         ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE 
       }; 
       String sortOrder = null; 
       Cursor birthDayCur = cr.query(uriBirthdate, projectionBirthdate, whereBirthdateCaluse, 
         selectionArgsBirthdate, sortOrder); 

       if 
         (birthDayCur.moveToFirst()) { 
        int bDayColumn = birthDayCur.getColumnIndex(ContactsContract.CommonDataKinds.Event.START_DATE); 
        String bDay = birthDayCur.getString(bDayColumn); 
        Log.d("Birthday", " : " + bDay); 
       } 
       birthDayCur.close(); 


       if (phoneNumber.length() >= 9 
         && UDF.isValidPhoneNumber(phoneNumber)) { 
        /* 
        * Uri my_contact_Uri = Uri.withAppendedPath(
        * ContactsContract.Contacts.CONTENT_URI, 
        * String.valueOf(Contact_Id)); 
        * 
        * try { final InputStream photo_stream = 
        * ContactsContract.Contacts 
        * .openContactPhotoInputStream(activity.getContentResolver(), 
        * my_contact_Uri); if (photo_stream != null) { new 
        * Thread(new Runnable() { 
        * 
        * @Override public void run() { BufferedInputStream buf 
        * = new BufferedInputStream(photo_stream); Bitmap 
        * my_btmp = BitmapFactory .decodeStream(buf); 
        * ByteArrayOutputStream bos = new 
        * ByteArrayOutputStream(); 
        * my_btmp.compress(Bitmap.CompressFormat.PNG, 100, 
        * bos); byte[] bArray = bos.toByteArray(); 
        * values.put(KEY_CONTACTIMAGE, bArray); 
        * 
        * } }).start(); 
        * 
        * 
        * } } catch (Exception e) { // TODO Auto-generated 
        * catch block e.printStackTrace(); } // 
        * contactEntity.setBitmapContactImage(my_btmp); 
        */ 
        try { 
         String phototjumb = null; 
         int SDK_INT = android.os.Build.VERSION.SDK_INT; 
         if (SDK_INT >= 11) { 
          phototjumb = cur 
            .getString(cur 
              .getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_THUMBNAIL_URI)); 
         } else { 
          phototjumb = cur 
            .getString(cur 
              .getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_THUMBNAIL_URI)); 
         } 

         if (phototjumb != null 
           && !phototjumb.toString().equalsIgnoreCase(
           "")) { 
          contactEntity.setImageURI(phototjumb); 
          //Log.d("photojumb", "::" + phototjumb); 
         } 


         /*if(eventEntity.getContactIndex() != -1 && contactCount == eventEntity.getContactIndex()){ 
          if(eventEntity.getBlobImage() != null){ 
           byte[] bb = eventEntity.getBlobImage(); 

           String selectedImagePath = getRealPathFromURI(getImageUri(
             activity, 
             BitmapFactory.decodeByteArray(bb, 0, bb.length))); 

           Bitmap vt = BitmapFactory.decodeFile(selectedImagePath); 

           Bitmap bitmap = Bitmap 
             .createScaledBitmap(vt, 50, 50, false); 

           //imgContactImg.setImageBitmap(UDF.getCroppedBitmap(bitmap)); 

           contactEntity.setImageURI(
             getImageUri(activity, vt).toString()); 
          } 


         }*/ 

         /* 
         * InputStream photo_stream = 
         * ContactsContract.Contacts 
         * .openContactPhotoInputStream 
         * (activity.getContentResolver(), my_contact_Uri); 
         * if(photo_stream != null){ // Use this method to 
         * set image using input stream 
         * 
         * contactEntity.setInputStreamImage(photo_stream); 
         * 
         * //Use this method to set image using bitmap (But 
         * it is time consuming) 
         * 
         * BufferedInputStream buf = new 
         * BufferedInputStream(photo_stream); Bitmap my_btmp 
         * = BitmapFactory.decodeStream(buf); 
         * contactEntity.setBitmapContactImage(my_btmp); } 
         */ 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        if (cur.getString(cur 
          .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)) == null 
          || cur.getString(
          cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)) 
          .trim().equalsIgnoreCase("")) { 
         contactEntity.setContactFirstName(String 
           .valueOf(phoneNumber)); 
        } else { 
         contactEntity 
           .setContactFirstName(String.valueOf(cur.getString(cur 
             .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)))); 
        } 

        contactEntity.setContactNumber(String 
          .valueOf(phoneNumber)); 
        contactEntity.setUniquePosition(contactCount); 
        contactCount++; 

        alContactEntities.add(contactEntity); 

       } 

      } 
      // values.put(KEY_TIMESWAP, 
      // String.valueOf(taskEnitiy.getTimeswap())); 
      // int SDK_INT = android.os.Build.VERSION.SDK_INT; 

      /* 
      * if (SDK_INT >= 11) { contactEntity 
      * .setImgUri(cur.getString(cur 
      * .getColumnIndex(ContactsContract. 
      * CommonDataKinds.Phone.PHOTO_URI))); } 
      */ 
      // alContactEntities.add(contactEntity); 

     } 
    } 
    cur.close(); 
    return alContactEntities; 
} 

И UDF.isValidPhoneNumber (PHONENUMBER)

/** 
* Check if phone number is valid or not 
*/ 
public static final boolean isValidPhoneNumber(CharSequence target) { 
    if (target == null || TextUtils.isEmpty(target)) { 
     return false; 
    } else { 
     return android.util.Patterns.PHONE.matcher(target).matches(); 
    } 
} 
+0

вы не разместили полный код. Я имею в виду, что вы читали номер телефона и адрес электронной почты. –

+0

. Я столкнулся с теми же проблемами, что и здесь, контакт 2200, но он занимает много времени, чтобы загрузить данные в список. Можете ли вы отправить полный код. –

+0

@ Ajit- Это полный код здесь, чтобы прочитать все контакты из адресной книги. И если есть 2200 контактов, это не займет от 3 до 4 секунд. Вы можете получить массив всех контактов в «alContactEntities» – Jigar

Смежные вопросы