2016-09-16 34 views
0

這是我在android中檢索手機聯繫人的代碼。應用程序在加載聯繫人時花費了大量的時間。我使用了嵌套循環,因此需要花費很多時間,告訴我一個更好的方法來實現這一點。加載聯繫人時刪除時間複雜度

@Override 
        protected Cursor doInBackground(Void... params) { 
            Uri contactsUri = ContactsContract.Contacts.CONTENT_URI; 
  
            // Querying the table ContactsContract.Contacts to retrieve all the contacts 
            Cursor contactsCursor = getContentResolver().query(contactsUri, null, null, null, 
            ContactsContract.Contacts.DISPLAY_NAME + " ASC "); 
  
            if(contactsCursor.moveToFirst()){ 
                do{ 
                    long contactId = contactsCursor.getLong(contactsCursor.getColumnIndex("_ID")); 
  
                    Uri dataUri = ContactsContract.Data.CONTENT_URI; 
  
                    // Querying the table ContactsContract.Data to retrieve individual items like 
                    // home phone, mobile phone, work email etc corresponding to each contact 
                    Cursor dataCursor = getContentResolver().query(dataUri, null, 
                                        ContactsContract.Data.CONTACT_ID + "=" + contactId, 
                                        null, null); 
  
                    String displayName=""; 
                    String nickName=""; 
                    String homePhone=""; 
                    String mobilePhone=""; 
                    String workPhone=""; 
                    String photoPath="" + R.drawable.blank; 
                    byte[] photoByte=null; 
                    String homeEmail=""; 
                    String workEmail=""; 
                    String companyName=""; 
                    String title=""; 
  
                    if(dataCursor.moveToFirst()){ 
                        // Getting Display Name 
                        displayName = dataCursor.getString(dataCursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); 
                        do{ 
  
                            // Getting NickName 
                            if(dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE)) 
                                nickName = dataCursor.getString(dataCursor.getColumnIndex("data1")); 
  
                            // Getting Phone numbers 
                            if(dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)){ 
                                switch(dataCursor.getInt(dataCursor.getColumnIndex("data2"))){ 
                                    case ContactsContract.CommonDataKinds.Phone.TYPE_HOME : 
                                        homePhone = dataCursor.getString(dataCursor.getColumnIndex("data1")); 
                                        break; 
                                    case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE : 
                                        mobilePhone = dataCursor.getString(dataCursor.getColumnIndex("data1")); 
                                        break; 
                                    case ContactsContract.CommonDataKinds.Phone.TYPE_WORK : 
                                        workPhone = dataCursor.getString(dataCursor.getColumnIndex("data1")); 
                                        break; 
                                } 
                            } 
  
                            // Getting EMails 
                            if(dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)) { 
                                switch(dataCursor.getInt(dataCursor.getColumnIndex("data2"))){ 
                                    case ContactsContract.CommonDataKinds.Email.TYPE_HOME : 
                                        homeEmail = dataCursor.getString(dataCursor.getColumnIndex("data1")); 
                                        break; 
                                    case ContactsContract.CommonDataKinds.Email.TYPE_WORK : 
                                        workEmail = dataCursor.getString(dataCursor.getColumnIndex("data1")); 
                                        break; 
                                } 
                            } 
  
                            // Getting Organization details 
                            if(dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)){ 
                                companyName = dataCursor.getString(dataCursor.getColumnIndex("data1")); 
                                title = dataCursor.getString(dataCursor.getColumnIndex("data4")); 
                            } 
  
                            // Getting Photo 
                            if(dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)){ 
                                photoByte = dataCursor.getBlob(dataCursor.getColumnIndex("data15")); 
  
                                if(photoByte != null) { 
                                    Bitmap bitmap = BitmapFactory.decodeByteArray(photoByte, 0, photoByte.length); 
  
                                    // Getting Caching directory 
                                    File cacheDirectory = getBaseContext().getCacheDir(); 
  
                                    // Temporary file to store the contact image 
                                    File tmpFile = new File(cacheDirectory.getPath() + "/wpta_"+contactId+".png"); 
  
                                    // The FileOutputStream to the temporary file 
                                    try { 
                                        FileOutputStream fOutStream = new FileOutputStream(tmpFile); 
  
                                        // Writing the bitmap to the temporary file as png file 
                                        bitmap.compress(Bitmap.CompressFormat.PNG,100, fOutStream); 
  
                                        // Flush the FileOutputStream 
                                        fOutStream.flush(); 
  
                                        //Close the FileOutputStream 
                                        fOutStream.close(); 
  
                                    } catch (Exception e) { 
                                        e.printStackTrace(); 
                                    } 
                                    photoPath = tmpFile.getPath(); 
                                } 
                            } 
                        }while(dataCursor.moveToNext()); 
                        String details = ""; 
  
                        // Concatenating various information to single string 
                        if(homePhone != null && !homePhone.equals("")) 
                            details = "HomePhone : " + homePhone + "\n"; 
                        if(mobilePhone != null && !mobilePhone.equals("")) 
                            details += "MobilePhone : " + mobilePhone + "\n"; 
                        if(workPhone != null && !workPhone.equals("")) 
                            details += "WorkPhone : " + workPhone + "\n"; 
                        if(nickName != null && !nickName.equals("")) 
                            details += "NickName : " + nickName + "\n"; 
                        if(homeEmail != null && !homeEmail.equals("")) 
                            details += "HomeEmail : " + homeEmail + "\n"; 
                        if(workEmail != null && !workEmail.equals("")) 
                            details += "WorkEmail : " + workEmail + "\n"; 
                        if(companyName != null && !companyName.equals("")) 
                            details += "CompanyName : " + companyName + "\n"; 
                        if(title != null && !title.equals("")) 
                            details += "Title : " + title + "\n"; 
  
                        // Adding id, display name, path to photo and other details to cursor 
                        mMatrixCursor.addRow(new Object[]{ Long.toString(contactId),displayName,photoPath,details}); 
                    } 
                }while(contactsCursor.moveToNext()); 
            } 
            return mMatrixCursor; 
        } 
  
+0

參見[這](http://stackoverflow.com/a/26820544/2252830) – pskink

+0

嘗試此解決方案http://stackoverflow.com/questions/21471850/how-to-get- all-contacts-first-name-last-name-email-phone-number-etc-without –

+0

@BirajZalavadia你的解決方案使用與OP一樣的概念,所以它和上面的代碼一樣慢 – pskink

回答

0

我有同樣的問題,我已經使用ContactsContract.CommonDataKinds.Phone類解決。

這是我的聯繫方式。您可以嘗試

public void fetchContacts2() { 
     contactArrayList = new ArrayList<>(); 
     try { 
      Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 
      Cursor cursor = context.getContentResolver().query(uri, 
        new String[] {ContactsContract.CommonDataKinds.Phone.NUMBER, 
          ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
          ContactsContract.CommonDataKinds.Phone._ID, 
          ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER}, 
        null, 
        null, 
        null); 
      Map<String,contact> contactMap = new HashMap<>(); 
      if (cursor.getCount() > 0) { 
       cursor.moveToFirst(); 
       while (!cursor.isAfterLast()) { 

        String contact_id = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID)); 
        String basename = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
        String name = null; 

        if (basename != null) { 
         try { 
          name = new String(basename.getBytes("UTF-8")); 
         } catch (UnsupportedEncodingException e) { 
          e.printStackTrace(); 
         } 
        } 
        long hasPhoneNumber = Long.parseLong(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER))); 
        if (hasPhoneNumber > 0) { 
         String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
         if (name != null && number != null && ! contactMap.containsKey(number)) { 
          contact c = new contact(context); 
          c.contactid = contact_id; 
          c.name = name; 
          c.phonenr = number; 
          c.setsearchphone(); 
          c.email = ""; 
          contactMap.put(number,c); 
         } 
        } 
        cursor.moveToNext(); 
       } 
       cursor.close(); 
       if (contactMap != null){ 
        contactArrayList.addAll(contactMap.values()); 
       } 
      } else { 
//   Toast.makeText(context, "No contacts Found", Toast.LENGTH_LONG).show(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      Log.v("Contacts", "getin " + e.getMessage()); 
     } 
     Log.v("Contacts", "finished getting contacts in mem"); 

    }