在Android设备中使用ACTION_PICK intent仅显示带有电话号码的联系人

在Android设备中使用ACTION_PICK intent仅显示带有电话号码的联系人,android,android-contacts,contactscontract,Android,Android Contacts,Contactscontract,我的目标是只向用户显示带有电话号码的联系人,并让用户选择几个我想在本地存储的联系人 我在下面的方法中使用了各种选项来代替ContactsContract.Contacts.CONTENT\u URI。但我看到很多联系人(很多都是垃圾邮件,只有电子邮件ID)显示出来 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContent

我的目标是只向用户显示带有电话号码的联系人,并让用户选择几个我想在本地存储的联系人

我在下面的方法中使用了各种选项来代替ContactsContract.Contacts.CONTENT\u 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作为上述方法的参数传递,如果是以下处理程序方法,则将查询方法的字符串[]作为投影参数传递(显示为注释),则该方法会因java.lang.IllegalArgumentException而失败。若我在下面的方法中传递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();
                }
            }
        }
    }
是否有任何方法可以只显示用户可以看到的联系人,通常是在用户转到电话簿时,并且其中有可用的电话号码

我试着浏览stackoverflow和其他站点中的所有线程,但找不到任何解决方案来解决这个问题,尽管很多人已经发布了这个问题。我没有在Android平台上做过很多工作,我可能遗漏了一些小细节,我相信一定有一个简单的方法来实现这一点

请建议。谢谢你的帮助


谢谢。

请使用下面的代码

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

下面的代码将执行您想要的操作

Intent intent = new Intent(Intent.ACTION_PICK,ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
startActivityForResult(Intent.createChooser(intent, "Contact"), PICK_CONTACT);
使用以下命令:

Intent intent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts/people"));
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(intent, 1);
*->将读取联系人数据的权限添加到应用程序清单中。
->在活动中使用Intent.ACTION\u选项
Intent contactPickerIntent=新的Intent(Intent.ACTION\u PICK,
ContactsContract.CommonDataTypes.Phone.CONTENT\u URI);
startActivityForResult(联系人拾取内容、结果拾取联系人);
->然后重写onActivityResult()并检索数据中的ID、电话号码和姓名。
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
//检查结果是否正常
if(resultCode==RESULT\u OK){
//检查请求代码,我们可能正在使用多个startActivityForReslut
开关(请求代码){
案例结果\u选择\u联系人:
游标=空;
试一试{
字符串phoneNo=null;
字符串名称=null;
Uri=data.getData();
cursor=getContentResolver().query(uri,null,null,null,null);
cursor.moveToFirst();
int phoneIndex=cursor.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NUMBER);
phoneNo=cursor.getString(phoneIndex);
textView2.setText(电话号码);
}捕获(例外e){
e、 printStackTrace();
}
打破
}
}否则{
Log.e(“MainActivity”,“未能选择联系人”);
}
}
这会有用的,看看吧*

谢谢。成功了。我只是开始编写代码,没有读很多基础知识。我使用了Contacts contract.Contacts.CONTENT\u TYPE,但现在我看到了其他选项以及它们之间的区别。尽管我没有看到为联系人返回的电子邮件信息。有没有任何字符串参数可以带来所有与联系相关的信息,包括家庭、手机号码和电子邮件?在浏览了更多详细信息并阅读了下面的帖子后,就可以非常清楚地了解获得电子邮件和电话号码所需的内容。简而言之,从上面示例中显示的意图中检索选定联系人的_id后,我们需要使用联系人解析程序重新查询,传递电话号码和电子邮件的_id和适当的Uri以检索所需的详细信息。另外,link解释了如何处理给定联系人有多个电话号码的情况。例如,我们使用什么类型来获取具有mailid的联系人?不理解您的问题
Intent intent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts/people"));
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(intent, 1);
*-> 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*