2015-10-10 68 views
4

我正在製作一個小應用程序,我可以使用內容提供程序獲取手機的聯繫人並將其顯示在列表視圖中,如圖所示。使用ContentProvider從聯繫人獲取電話號碼 - Android

enter image description here

我要選擇列表視圖的行和automically打個電話給特定聯繫人。我嘗試了一些東西,但它們不起作用。有任何想法嗎?這是我的代碼。

public class MainActivity extends ListActivity implements AdapterView.OnItemClickListener{ 
ArrayAdapter<String> adapter; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ContentResolver cr = getContentResolver(); 
    Cursor c = cr.query(ContactsContract.Contacts.CONTENT_URI, 
      new String[] {ContactsContract.Contacts.DISPLAY_NAME}, 
      null, null, null); 

    List<String> contacts = new ArrayList<String>(); 
    if (c.moveToFirst()) { 
     do { 
      contacts.add(c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))); 
     } while (c.moveToNext()); 
    } 
    adapter = new ArrayAdapter<String>(this, R.layout.activity_main, contacts); 
    setListAdapter(adapter); 



} 

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

     //The answer should be inside here. 

    } 
} 
+1

不創建POJO類,不要在一個循環中迭代'Cursor',不要使用'ArrayAdapter',而應該怎麼做?使用'SimpleCursorAdapter',這就是全部 – pskink

+0

@pskink良好的通話。出於某種原因,我總是忘記CursorAdapters。從未使用過很多, –

+0

@MikeM。至少你知道,使用基於'Cursor'的數據模型比使用POJO/loop/ArrayAdapter要好得多,這裏有95%的人不DONT,更糟糕的是他們在使用不好的做法時如此固執...... – pskink

回答

3

首先,確保你所添加的權限:

<uses-permission android:name="android.permission.READ_CONTACTS"/> 

到AndroidManifest.xml文件,然後你可以通過這樣的手機通訊錄循環:

Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); 
while (cursor.moveToNext()) { 
    String contactId = cursor.getString(cursor.getColumnIndex( 
    String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); 

    if (Boolean.parseBoolean(hasPhone)) { 
     // You know it has a number so now query it like this 
     Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, null, null); 
     while (phones.moveToNext()) { 
      String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));     
     } 
     phones.close(); 
    } 

    Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId, null, null); 

    while (emails.moveToNext()) { 
     // This would allow you get several email addresses 
     String emailAddress = emails.getString( 
     emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
    } 

    emails.close(); 
} 
+0

固定。你的代碼幫助了我。 – Theo

+1

感謝@Theo的迴應。 –

0

嘗試與:

private void doMagicContacts() { 
    Cursor cursor = getContentResolver() 
      .query(ContactsContract.Contacts.CONTENT_URI, 
        null, 
        null, 
        null, 
        null); 

    if (cursor == null) { 
     return; 
    } 

    cursor.moveToFirst(); 

    do { 
     String name = cursor.getString(
       cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
     String id = cursor.getString(
       cursor.getColumnIndex(ContactsContract.Contacts.NAME_RAW_CONTACT_ID)); 

     Cursor phones = getContentResolver() 
       .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
         null, 
         ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + id, 
         null, 
         null); 
     if (phones != null) { 
      while (phones.moveToNext()) { 
       String phoneNumber = phones.getString(
         phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
       Log.d(TAG, "doMagicContacts: " + name + " " + phoneNumber); 
      } 
      phones.close(); 
     } 

    } while (cursor.moveToNext()); 

    cursor.close(); 
} 
相關問題