如何调用Android联系人列表并从其详细信息屏幕中select一个电话号码?

我已经阅读已经发布的解决scheme,但他们不知道如何使用系统的联系方式屏幕来select任何一个号码使用? 我正在开发一个短信发送Android应用程序,它提供了select手机的联系人和用户想要使用的号码发送….

到目前为止,我还没有find任何关于select任何一个号码的事情。 这是否只能通过编程来完成? 检索数据库中的所有数字和发送短信到它?

问候

雪莉酒

Related of "如何调用Android联系人列表并从其详细信息屏幕中select一个电话号码?"

哎呀,这花了我一些时间,但我想我有你需要的答案(即使已经太晚了,但我仍然会张贴它作为其他人的参考)。

在我目前正在开发的应用程序中,用户可以将电话号码input到EditText或者单击button并从电话地址簿中select一个人。 如果该人拥有多个电话号码,则可以从下拉列表中select其中的一个。

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.contact_picker); // this opens the activity. note the Intent.ACTION_GET_CONTENT // and the intent.setType ((Button)findViewById(R.id.pick_person)).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { // user BoD suggests using Intent.ACTION_PICK instead of .ACTION_GET_CONTENT to avoid the chooser Intent intent = new Intent(Intent.ACTION_GET_CONTENT); // BoD con't: CONTENT_TYPE instead of CONTENT_ITEM_TYPE intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); startActivityForResult(intent, 1); } }); } 

现在,只要用户select一个联系人(并且可能select几个电话号码中的一个),就可以以正常方式检索数据:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (data != null) { Uri uri = data.getData(); if (uri != null) { Cursor c = null; try { c = getContentResolver().query(uri, new String[]{ ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.TYPE }, null, null, null); if (c != null && c.moveToFirst()) { String number = c.getString(0); int type = c.getInt(1); showSelectedNumber(type, number); } } finally { if (c != null) { c.close(); } } } } } public void showSelectedNumber(int type, String number) { Toast.makeText(this, type + ": " + number, Toast.LENGTH_LONG).show(); } 

这里是关于dev.android的CommonDataKinds.Phone的文档 。

int“type”告诉你数字的types:mobile(2),home(1),work(3)等等。

注意:在用户select联系人之后,他得到一个数字微调,没有指示数字types。 这不是真正的用户友好:如果一个联系人有5个分配的号码…呃,这些又是哪个传真号码?

另外注意:上面的例子需要sdk> 5(Android 2.0+),所以没有1.6(= sdk 4)。 1.6有一个不同的API,如果你想支持这两个版本,请阅读关于dev.android上的联系人API的文章 。

祝你好运。

免责声明:我将大部分代码从PickContact.java示例中复制出来

这段代码和我一起工作的很好

 @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent i = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI); super.startActivityForResult(i, 1001); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case 1001: if (resultCode == Activity.RESULT_OK) { Cursor s = getContentResolver().query(Phone.CONTENT_URI, null, null, null, null); if (s.moveToFirst()) { String phoneNum = s.getString(s.getColumnIndex(Phone.NUMBER)); Toast.makeText(getBaseContext(), phoneNum, Toast.LENGTH_LONG).show(); } } break; } } 

试试这个代码,我相信它会工作

 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); startActivityForResult(intent, PICK_CONTACT); 

在接受的答案中有一个问题。 如果select的号码包含空格
即85 29 948789那么它将只显示85(直到第一个空间)。

所以使用下面的代码来纠正这个问题:)

 Intent intent1 = new Intent(Intent.ACTION_PICK); intent1.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); startActivityForResult(intent1, 1); 

并在onActivityResult

  Uri contactUri = data.getData(); String[] projection = {ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME}; Cursor cursor = getContentResolver() .query(contactUri, projection, null, null, null); cursor.moveToFirst(); int numberColumn = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); int nameColumn = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); String number = cursor.getString(numberColumn); String name = cursor.getString(nameColumn); 

尝试这个

 setContentView(R.layout.main); contactNumber = (TextView)findViewById(R.id.contactnumber); Button buttonPickContact = (Button)findViewById(R.id.pickcontact); buttonPickContact.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); startActivityForResult(intent, 1); }}); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); if(requestCode == RQS_PICK_CONTACT){ if(resultCode == RESULT_OK){ Uri contactData = data.getData(); Cursor cursor = managedQuery(contactData, null, null, null, null); cursor.moveToFirst(); String number = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)); //contactName.setText(name); contactNumber.setText(number); //contactEmail.setText(email); } } } } 

编辑XML

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/pickcontact" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Pick Contact" /> <TextView android:id="@+id/contactnumber" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>