2016-11-29 48 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; 
    } 

}