2016-11-29 74 views
2

我有這些代碼基本上用一個ListView顯示在聯繫人列表中的名字,我想,當單擊每個單獨的名稱,以獲得他們的電話號碼:Android開電話號碼

final ContentResolver cr = getContentResolver(); 

final Cursor c = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
myCursorAdapter = new SimpleCursorAdapter(this, R.layout.list_item, c, new String[] {ContactsContract.Contacts.DISPLAY_NAME}, new int[]{R.id.TVRow}, 0); 
myPhoneList.setAdapter(myCursorAdapter); 

myPhoneList.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id){ 
     c.moveToPosition(position); 
     Toast.makeText(getApplicationContext(), c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)), Toast.LENGTH_SHORT).show(); 
    } 
}); 

onItemClick方法

GetColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER) 

返回-1,因此我無法使用此方法獲取電話號碼。

我也嘗試打印出光標c的所有列,它返回34列,但似乎與電話號碼有關的唯一列是HasPhoneNumber

那麼問題在哪裏,我該如何解決?謝謝!


更新後的版本,其中String陣列通過構建myCursorAdapter改變:

final ContentResolver cr = getContentResolver(); 

    final Cursor c = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
    myCursorAdapter = new SimpleCursorAdapter(this, R.layout.list_item, c, new String[] {ContactsContract.CommonDataKinds.Phone.NUMBER}, new int[]{R.id.TVRow}, 0); 
    myPhoneList.setAdapter(myCursorAdapter); 

    myPhoneList.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id){ 
      c.moveToPosition(position); 
      Toast.makeText(getApplicationContext(), c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)), Toast.LENGTH_SHORT).show(); 
     } 
    }); 

我想更新的代碼會顯示在ListView的電話號碼,但我得到了一個錯誤說「欄目'data1'不存在「。

回答

0

ContactsContract Android API在Data表中存儲有關聯繫人(如電話號碼)的數據,而不是Contacts表。

請仔細閱讀:https://developer.android.com/reference/android/provider/ContactsContract.html

更新 - 這裏是你的代碼(未經測試)的一個固定的版本:

所有的
final ContentResolver cr = getContentResolver(); 
String[] projection = new String[] {Contacts.DISPLAY_NAME, Phone.NUMBER}; 
final Cursor c = cr.query(Data.CONTENT_URI, projection, null, null, null); 
myCursorAdapter = new SimpleCursorAdapter(this, R.layout.list_item, c, new String[] {Phone.NUMBER}, new int[]{R.id.TVRow}, 0); 
myPhoneList.setAdapter(myCursorAdapter); 

myPhoneList.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id){ 
     c.moveToPosition(position); 
     Toast.makeText(getApplicationContext(), c.getString(1), Toast.LENGTH_SHORT).show(); 
    } 
}); 
+0

它工作!謝謝! –

0

返回-1,因爲你不從DB請求列ContactsContract.CommonDataKinds.Phone.NUMBER

new String[] {ContactsContract.Contacts.DISPLAY_NAME} 

ContactsContract.Contacts.DISPLAY_NAME是你要求的唯一領域。

爲了能夠得到的電話號碼,你首先需要把它列入到你想從DB獲得列的列表:

新的String [] {ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER}

現在,您必須重寫適配器的getView,以便將名稱設置爲列表行的textView。之後,您的onItemClick將按預期工作

+0

我接觸的按鈕在String []中只使用ContactsContract.CommonDataKinds.Phone.NUMBER嘗試並得到錯誤:列'data1'不存在。我想因爲我已經在查詢中包含了所有的字段,光標應該包含關於電話號碼的字段,並且適配器不應該是原因? –

+0

@ T.Yu,我不明白你改變了什麼,現在有什麼問題 –

+0

我改變了新的String [] {ContactsContract.Contacts.DISPLAY_NAME}爲新的String [] {ContactsContract.CommonDataKinds.Phone.NUMBER},我想它會顯示ListView中的電話號碼,但我得到一個錯誤,說「列'data1'不存在」。 –

1

首先在AndroidManifest.xml中加入這一行採取許可的用戶。

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

實施

 phoneContactsButtton.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View view) { 
      // The below two line is needed to open the contact list of mobile 
       Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 
       startActivityForResult(contactPickerIntent,1); 

      } 
     }); 

你必須重寫onActivityResult()將被寫入的onCreate外()mehtod 與此類似

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    } 


@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    switch (requestCode){ 
     case 1 : 
      if (resultCode == Activity.RESULT_OK) { 
       Uri contactData = data.getData(); 

       Cursor cur = getContentResolver().query(contactData, null, null, null, null); 
       if (cur.getCount() > 0) {// thats mean some resutl has been found 
        if(cur.moveToNext()) { 
         String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
         String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
         Log.e("Names", name); 

         if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
         { 

          Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ id,null, null); 
          while (phones.moveToNext()) { 
           String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
           Log.e("Number", phoneNumber); 
          } 
          phones.close(); 
         } 

        } 
       } 
       cur.close(); 
      } 
      break; 
    } 

}