在 Android 设备中使用 ACTION_PICK 意图仅显示带有电话号码的联系人
Posted
技术标签:
【中文标题】在 Android 设备中使用 ACTION_PICK 意图仅显示带有电话号码的联系人【英文标题】:Displaying contacts only with phone numbers using ACTION_PICK intent in Android device 【发布时间】:2013-02-15 17:31:57 【问题描述】:我的目标是只向用户显示带有电话号码的联系人,并让用户选择一些我想在本地存储的联系人。
我在下面的方法中使用了各种选项来代替 ContactsContract.Contacts.CONTENT_URI。但是我收到了很多联系人(很多都是只有电子邮件 ID 的垃圾)。
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_selector);
((Button)findViewById(R.id.btnphonecontactlist)).setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
// TODO Auto-generated method stub
Intent contactIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(contactIntent, 1);
);
如果我将 ContactsContract.Contacts.CONTENT_URI 作为上述方法的参数传递,并且在以下处理程序方法的情况下,查询方法的 String[] 作为投影参数(显示为注释),则该方法因 java.lang 而失败。非法参数异常。如果我在下面的方法中传递 null,那么无论我选择什么联系人,我都找不到任何与电话号码或电子邮件相关的列。
@Override
public 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, null
// new String[]
//ContactsContract.CommonDataKinds.Phone.NUMBER,
//ContactsContract.CommonDataKinds.Phone.TYPE,
, null, null, null);
if(c != null && c.moveToFirst())
String number = c.getString(0);
String type = c.getString(1);
finally
if(c != null && !c.isClosed())
c.close();
当用户访问电话簿并且哪些电话号码可用时,有什么方法可以只显示用户可见的联系人?
我尝试遍历 *** 和其他站点中的所有线程,但找不到任何解决方案来解决此问题,尽管许多人已经发布了该问题。我在 android 平台上工作不多,可能会遗漏一些小细节,我相信一定有一种简单的方法来实现这一点。
请推荐。感谢您的帮助。
谢谢。
【问题讨论】:
【参考方案1】:请使用下面的代码
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(intent, 1);
【讨论】:
谢谢。有效。我只是跳到编码没有阅读很多基础知识。我使用了 ContactsContract.Contacts.CONTENT_TYPE 但现在我看到还有其他选项以及它们之间的区别。 虽然我没有看到为联系人返回的电子邮件信息。是不是有什么字符串参数可以带上所有的联系方式,包括家庭、手机、邮箱? 在阅读了更多详细信息并阅读下面***.com/questions/8612531/… 的帖子后,很清楚需要什么来获取电子邮件和电话号码。简而言之,在检索到所选联系人的 _id 后,从上面示例中显示的意图中,我们需要使用联系人解析器重新查询,将 _id 和适当的 Uri 传递给电话号码和电子邮件以检索所需的详细信息。如果给定的联系人有多个电话号码,还链接解释了如何处理场景。 像这样我们用什么类型来获取拥有mailid的联系人? 不明白你的问题【参考方案2】:*-> Add a permission to read contacts data to your application manifest.
<uses-permission android:name="android.permission.READ_CONTACTS"/>
-> Use Intent.ACTION_PICK in your Activity
Intent contactPickerIntent = new Intent(Intent.ACTION_PICK,
ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
startActivityForResult(contactPickerIntent, RESULT_PICK_CONTACT);
-> Then Override the onActivityResult() and retrieve the ID,Phone number and Name in the data.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
// check whether the result is ok
if (resultCode == RESULT_OK)
// Check for the request code, we might be usign multiple startActivityForReslut
switch (requestCode)
case RESULT_PICK_CONTACT:
Cursor cursor = null;
try
String phoneNo = null ;
String name = null;
Uri uri = data.getData();
cursor = getContentResolver().query(uri, null, null, null, null);
cursor.moveToFirst();
int phoneIndex =cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
phoneNo = cursor.getString(phoneIndex);
textView2.setText(phoneNo);
catch (Exception e)
e.printStackTrace();
break;
else
Log.e("MainActivity", "Failed to pick contact");
This will work check it out*
【讨论】:
【参考方案3】:下面的代码会做你想做的。
Intent intent = new Intent(Intent.ACTION_PICK,ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
startActivityForResult(Intent.createChooser(intent, "Contact"), PICK_CONTACT);
【讨论】:
【参考方案4】:Uri uri = Uri.parse("content://contacts");
Intent intent = new Intent(Intent.ACTION_PICK, uri);
intent.setType(Phone.CONTENT_TYPE);
startActivityForResult(intent, REQUEST_CODE);
【讨论】:
【参考方案5】:使用这个:
Intent intent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts/people"));
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(intent, 1);
【讨论】:
以上是关于在 Android 设备中使用 ACTION_PICK 意图仅显示带有电话号码的联系人的主要内容,如果未能解决你的问题,请参考以下文章
使用 Android 设备在 google chrome 中打开 URL