在android中使用内容提供者获取联系号码

Posted

技术标签:

【中文标题】在android中使用内容提供者获取联系号码【英文标题】:Getting contact number using content provider in android 【发布时间】:2012-04-03 16:59:09 【问题描述】:

我按照本教程学习了 Content Providers 的基础知识:http://www.vogella.de/articles/androidSQLite/article.html

但我想知道如何获取针对显示名称存储的联系号码。尝试使用“ContactsContract.Contacts.CONTENT_VCARD_TYPE”。但是遇到了错误。

如果有任何解决方案,请告诉我。

谢谢 斯内哈

【问题讨论】:

您遇到的错误是什么? 这里:***.com/questions/9496350/… 谢谢 KKD.. 但你能解释一下吗:光标电话 = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = " + id,null,null);以及我们如何知道“ cNumber =phones.getString(phones.getColumnIndex("data1")); ”中的列名是“data1” 【参考方案1】:

这是一个关于在an​​droid中使用内容提供者获取联系号码的好教程

http://www.higherpass.com/Android/Tutorials/Working-With-Android-Contacts/

http://www.app-solut.com/blog/2012/06/retrieval-of-contacts-with-contact-contract/

并且可以像这样选择联系电话

添加按钮点击事件

button1.setOnClickListener(new View.OnClickListener() 

            @Override
            public void onClick(View v) 
                // TODO Auto-generated method stub

                i = new Intent(Intent.ACTION_PICK,
                        ContactsContract.Contacts.CONTENT_URI);
                startActivityForResult(i, PICK_CONTACT);
            
        );


//outside button click

public void onActivityResult(int reqCode, int resultCode, Intent data) 
        super.onActivityResult(reqCode, resultCode, data);

        switch (reqCode) 
        case (PICK_CONTACT):


            if (resultCode == Activity.RESULT_OK) 
                getContactInfo(data);
            
        
    

    // onActivityResult

    private void getContactInfo(Intent data) 
        // TODO Auto-generated method stub

         ContentResolver cr = getContentResolver();




        Cursor cursor = managedQuery(data.getData(), null, null, null, null);
        while (cursor.moveToNext()) 
            String contactId = cursor.getString(cursor
                    .getColumnIndex(ContactsContract.Contacts._ID));
            Name = cursor
                    .getString(cursor
                            .getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));

            String hasPhone = cursor
                    .getString(cursor
                            .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));

            Cursor emailCur = cr.query( 
                    ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
                    null,
                    ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
                    new String[]contactId, null); 


            emailCur.close();






     if (hasPhone.equalsIgnoreCase("1"))
                hasPhone = "true";
            else
                hasPhone = "false";

            if (Boolean.parseBoolean(hasPhone)) 
                Cursor phones = getContentResolver().query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                + " = " + contactId, null, null);
                while (phones.moveToNext()) 
                    phoneNo = phones
                            .getString(phones
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                
                phones.close();
            

            pname.setText(Name);
            //
            phno.setText(phoneNo);

        Toast.makeText(this, Name + "   " + phoneNo, Toast.LENGTH_SHORT).show();


        

    

【讨论】:

【参考方案2】:

此代码适用于手机号码联系人,不适用于电子邮件或其他内容。我发现这段代码最简单。如果有任何问题,请告诉我。

以选择手机数据类型的意图开始活动:

findViewById(R.id.choose_contact_button).setOnClickListener(new View.OnClickListener() 

          @Override
          public void onClick(View v) 
                Intent pickContact = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
                startActivityForResult(pickContact, PICK_CONTACT_REQUEST);
          
     );

现在设置 onAcitivityResult();

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent)
        switch (requestCode)
            case PICK_CONTACT_REQUEST:
                if (resultCode == RESULT_OK)
                    Uri contactUri = intent.getData();
                    Cursor nameCursor = getContentResolver().query(contactUri, null, null, null, null);
                    if (nameCursor.moveToFirst())
                        String name = nameCursor.getString(nameCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                        String number = nameCursor.getString(nameCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        ((EditText)findViewById(R.id.person_name)).setText(name);
                        ((EditText)findViewById(R.id.enter_mobile)).setText(number);
                        nameCursor.close();
                    
                
                break;
        
    

【讨论】:

以上是关于在android中使用内容提供者获取联系号码的主要内容,如果未能解决你的问题,请参考以下文章

阅读联系人时如何在android内容提供商中匹配DISPLAY NAME和Phone.NUMBER

从内容提供者那里获取联系人,没有重复或无效的联系人,并保存到 Realm

如何从 Android 设备中仅获取电话号码联系人

Android - 检索联系人照片和显示

Android 内容提供程序。如何通过通讯录中的一个请求获取所有数据

通过 SQL 加入 Android 联系人表/数据库?