获取android联系人电话号码列表

Posted

技术标签:

【中文标题】获取android联系人电话号码列表【英文标题】:get android contact phone number list 【发布时间】:2013-05-19 18:22:14 【问题描述】:

我是 android 的新手。当我尝试获取联系人姓名时,它工作正常,但我只想获取数字,但我无法这样做。我的代码是:-

package com.example.sqllitecontactlist;
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;

public class PhoneBookActivity extends Activity 

//Android listview object
ListView listViewPhoneBook;
@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
  setContentView(R.layout.phone_book);

   //get the ListView Reference from xml file
  listViewPhoneBook=(ListView)findViewById(R.id.listPhoneBook);
  String[] arrayColumns = new String[] ContactsContract.CommonDataKinds.Phone.NUMBER;

    // arrayViewID is the id of the view it will map to here textViewPhone only 
  int[] arrayViewID = new int[]R.id.textViewNumber;

 Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,        arrayColumns, null, null, null);

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.each_contact,    cursor, arrayColumns, arrayViewID);
 listViewPhoneBook.setAdapter(adapter); 

当我执行此操作时,它显示“java.lang.IllegalArgumentException:无效列 data1”。我用谷歌搜索了很多并应用了一些解决方案但失败了。请帮帮我

【问题讨论】:

添加了简单的库来获取example and source code available here的联系人 【参考方案1】:
    getNumber(this.getContentResolver()); 


public void getNumber(ContentResolver cr)

    Cursor phones = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);
            // use the cursor to access the contacts    
    while (phones.moveToNext())
    
      String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
             // get display name
      phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
              // get phone number
      System.out.println(".................."+phoneNumber); 
    


activity_main.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_
 android:layout_
 tools:context=".MainActivity" >

<ListView
   android:layout_
   android:layout_
   android:id="@+id/lv"/>

</RelativeLayout>

MainActivity.java

 public class MainActivity extends Activity 

     String phoneNumber;
     ListView lv;
     ArrayList <String> aa= new ArrayList<String>();
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
         lv= (ListView) findViewById(R.id.lv);

        getNumber(this.getContentResolver()); 
    

    public void getNumber(ContentResolver cr)
    
        Cursor phones = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);
        while (phones.moveToNext())
        
          String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
          phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
          System.out.println(".................."+phoneNumber); 
          aa.add(phoneNumber);
        
                 phones.close()// close cursor
          ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1,aa);
          lv.setAdapter(adapter);
                  //display contact numbers in the list
    
      

快照

确保你在清单中有这个

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

【讨论】:

:- 完成...你能告诉我 cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);在第二个参数中,我们传递了 null,这是什么意思..通过这样做它会获取所有列? @ArpitSethi 它获取所有联系人,在列表中您将看到联系人列表中的所有号码 @ArpitSethi 为清楚起见developer.android.com/reference/android/content/…。向下滚动并检查查询方法及其参数 @ArpitSethi 您可以在上面指定您想要的列,它会查询所有无效的列。指定您需要的列,其余的保持不变 @ArpitSethi 检查此链接是否清晰***.com/questions/6587674/…【参考方案2】:

我恢复所有联系人的解决方案:

    Cursor cursor = null;
    try 
        cursor = context.getContentResolver().query(Phone.CONTENT_URI, null, null, null, null);
        int contactIdIdx = cursor.getColumnIndex(Phone._ID);
        int nameIdx = cursor.getColumnIndex(Phone.DISPLAY_NAME);
        int phoneNumberIdx = cursor.getColumnIndex(Phone.NUMBER);
        int photoIdIdx = cursor.getColumnIndex(Phone.PHOTO_ID);
        cursor.moveToFirst();
        do 
            String idContact = cursor.getString(contactIdIdx);
            String name = cursor.getString(nameIdx);
            String phoneNumber = cursor.getString(phoneNumberIdx);
            //...
         while (cursor.moveToNext());  
     catch (Exception e) 
        e.printStackTrace();
     finally 
        if (cursor != null) 
            cursor.close();
        
    

您需要在清单中获得此权限:

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

希望对你有所帮助!

【讨论】:

您可以验证回复,它会为您赢得声誉!【参考方案3】:

.@Arpit:

在清单中添加权限。

但最重要的是... 您是否没有注意到,在您格式化 phoneNumber 的行下方,您没有添加姓名?您应该按照添加电话号码的方式将姓名添加到号码中(我附在下面的代码中):

..System.out.println(".................."+phoneNumber); 
aa.add(name);
aa.add(phoneNumber);

上述代码的输出将是列表视图中单独的名称和数字(像这样):


名称

号码

名称

为了在一行中显示,您可以这样做:

aa.add(name+"\n"+phoneNumber);

输出会是这样的:


名称 编号


名称 编号


名称 编号


祝你好运!

【讨论】:

【参考方案4】:

在下面找到解决方案,它适用于从联系人列表中获取联系人号码。

您需要以下权限:

 android:name="android.permission.READ_CONTACTS"/>

然后,调用联系人选择器:

 Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);

那么,

 @Override
 public void onActivityResult(int reqCode, int resultCode, Intent data) 
 super.onActivityResult(reqCode, resultCode, data);

 switch (reqCode) 
  case (PICK_CONTACT) :
   if (resultCode == Activity.RESULT_OK) 
    Uri contactData = data.getData();
    Cursor c =  managedQuery(contactData, null, null, null, null);
     if (c.moveToFirst()) 
      String name = c.getString(c.getColumnIndexOrThrow(People.NAME));
      // TODO Whatever you want to do with the selected contact name.
    
  
  break;
  
 

【讨论】:

以上是关于获取android联系人电话号码列表的主要内容,如果未能解决你的问题,请参考以下文章

从联系人 Android 中获取一个电话号码

Android - 无法获取某些联系人的电话号码

使用 ContentProvider 从联系人获取电话号码 - Android

为啥 lint 在 Android Studio 中获取联系人列表名称和号码时显示“值 >= 1”?

获取 Android 联系人光标异常

使用 android 2.1 在我自己的列表视图中显示姓名和联系电话