获取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联系人电话号码列表的主要内容,如果未能解决你的问题,请参考以下文章
使用 ContentProvider 从联系人获取电话号码 - Android