2015-09-19 24 views
0

我創建一個應用程序,它獲取所有姓名,電話號碼和每一個具體名稱的電子郵件的所有聯繫人的電子郵件地址和我有點卡住.. 我能得到所有姓名和電子郵件到目前爲止,但不能得到全部三個.. 我已經看到了與主題相關的一些問題,但在獲得所有三個在同一時間不能得到幫助。 我節省姓名,電話和電子郵件二叉樹.. 我是beginner.Need幫助!我怎樣才能讀取姓名電話號碼,並在Android的

這裏是我的代碼:

package com.example.contactify; 

import android.content.ContentProviderOperation; 
import android.content.Context; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.ContactsContract; 
import android.app.Activity; 
import android.content.ContentResolver; 
import android.content.Intent; 
import android.database.Cursor; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ProgressBar; 
import android.widget.TextView; 
import android.widget.Toast; 
import com.example.Tree.ContactNode; 

public class MainPage extends Activity implements OnClickListener { 

    ProgressBar progress; 
    TextView tv; 
    ContactNode t; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mainmenu); 
     Button createmagic = (Button) findViewById(com.example.contactify.R.id.cButton); 
     tv = (TextView) findViewById(R.id.textView3); 
     createmagic.setOnClickListener(this); 
     t = new ContactNode(); 

    } 


    @Override 
    public void onClick(View arg0) { 
     // TODO Auto-generated method stub 

     switch (arg0.getId()) { 
      case R.id.cButton: { 
       try { 

        ContactNode contact = getContacts(); 
        Intent i = new Intent("com.example.contactify.CreateNames"); 
        i.putExtra("Contact", Names(t.root)); 
        startActivity(i); 


       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        Toast.makeText(this, e.getLocalizedMessage().toString(), Toast.LENGTH_LONG).show(); 
       } 
       break; 
      } 
      case R.id.uButton: { 

       break; 
      } 

     } 
    } 


    String Names(ContactNode tree) { 
     return tree.getNames(tree); 
    } 


    ContactNode getContacts() { 

     final String[] PROJECTION = new String[]{ 
       ContactsContract.CommonDataKinds.Phone.CONTACT_ID, 
       ContactsContract.Contacts.DISPLAY_NAME, 
       ContactsContract.CommonDataKinds.Email.DATA, 
       ContactsContract.CommonDataKinds.Phone.NUMBER 
     }; 

     ContentResolver cr = getContentResolver(); 
     Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, PROJECTION, null, null, null); 
     if (cursor != null) { 
      try { 
       final int contactIdIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID); 
       final int displayNameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); 
       final int emailIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA); 
       long contactId; 
       String displayName, address, phoneNo; 


       while (cursor.moveToNext()) { 

        // Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); 
        if (Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 

         contactId = cursor.getLong(contactIdIndex); 
         displayName = cursor.getString(displayNameIndex); 
         address = cursor.getString(emailIndex); 

         Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactIdIndex,null, null); 
         while (phones.moveToNext()) 
         { 
          phoneNo = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
          t.insertContact(displayName, phoneNo, address); 
         } 
         phones.close(); 

        } 
       } 
      } finally { 
       cursor.close(); 
      } 

     } 
     return t; 
    } 

}

+0

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

+0

並且它花費的時間太長.. 。 您的解決方案非常有前途......謝謝! –

回答

0

電話號碼已經改變類型的機器人。就像家庭,手機,辦公室等一樣,所以你可以多次添加同一個人的電話號碼和空值。

裁判:http://developer.android.com/reference/android/provider/Contacts.PhonesColumns.html

裁判:http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Phone.html

這就是爲什麼你還用手機遊標檢索電話號碼。聯繫人可能有0個或更多的電話號碼。你需要決定你想要哪一個。如果你想,我用的是慢算法..任何人比使用

Cursor phones =  getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactIdIndex,null, null); 
phoneNo = null; 
while (phones.moveToNext()) 
{ 
    phoneNo = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));       
} 
phones.close(); 

//this is if the phone exist then only it added 
if(phoneNo != null) 
    t.insertContact(displayName, phoneNo, address); 
+0

完美嗎?你在這種緩慢的算法看什麼完美('ContentResolver的#query'稱爲N + 1次,其中N爲聯繫人的號碼)? – pskink

+0

@pskink確定其使用N + 1次db.query調用。這裏有什麼問題。他需要所有聯繫人的姓名,電子郵件和電話號碼。 – arun

+0

是的,我知道他需要的名字,所有電子郵件和所有手機,還等什麼?它會改變什麼嗎? – pskink

相關問題