在 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

在android中查找设备的相对方向

如何在android中使用NFC在两个设备之间发送数据?

在 android 设备中使用相机显示图像捕获

如何以编程方式在 Android 设备中获取设备 (AOSP) 内部版本号?

如何在 android 和 PC 或其他 android 设备中使用蓝牙传输文件