【问题标题】:Displaying contacts only with phone numbers using ACTION_PICK intent in Android device在 Android 设备中使用 ACTION_PICK 意图仅显示带有电话号码的联系人
【发布时间】: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();
                }
            }
        }
    }

当用户访问电话簿并且哪些电话号码可用时,有什么方法可以只显示用户可见的联系人?

我尝试遍历 stackoverflow 和其他站点中的所有线程,但找不到任何解决方案来解决此问题,尽管许多人已经发布了该问题。我在 Android 平台上工作不多,可能会遗漏一些小细节,我相信一定有一种简单的方法来实现这一点。

请推荐。感谢您的帮助。

谢谢。

【问题讨论】:

    标签: android android-contacts contactscontract


    【解决方案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 但现在我看到还有其他选项以及它们之间的区别。
    • 虽然我没有看到为联系人返回的电子邮件信息。是不是有什么字符串参数可以带上所有的联系方式,包括家庭、手机、邮箱?
    • 在阅读了更多详细信息并阅读下面stackoverflow.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);
          

          【讨论】:

            猜你喜欢
            • 2013-07-17
            • 2023-03-28
            • 2016-02-16
            • 1970-01-01
            • 2016-01-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多