Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何仅从Android设备获取电话号码联系人_Android_Android Contentprovider_Android Contacts_Android Cursor_Contactscontract - Fatal编程技术网

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

如何仅从Android设备获取电话号码联系人,android,android-contentprovider,android-contacts,android-cursor,contactscontract,Android,Android Contentprovider,Android Contacts,Android Cursor,Contactscontract,我遵循这个示例从android设备检索联系人。 它提供所有联系人,包括电子邮件联系人和一些空联系人 我尝试在投影和选择中修改Contacts contract,如Contacts contract.Contacts.HAS\u PHONE\u NUMBER,以获取移动联系人,但没有任何效果 String[] PROJECTION = {ContactsContract.Contacts._ID,ContactsContract.Contacts.LOOKUP_KEY,
ContactsContr

我遵循这个示例从android设备检索联系人。 它提供所有联系人,包括电子邮件联系人和一些空联系人

我尝试在投影和选择中修改Contacts contract,如
Contacts contract.Contacts.HAS\u PHONE\u NUMBER
,以获取移动联系人,但没有任何效果

String[] PROJECTION = {ContactsContract.Contacts._ID,ContactsContract.Contacts.LOOKUP_KEY,
ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.Contacts._ID,
SORT_ORDER,ContactsContract.Contacts.HAS_PHONE_NUMBER};

字符串选择=
 Contacts contract.Contacts.DISPLAY\u NAME+
 ““”“+”和“Contacts contract.Contacts.IN_VISIBLE_GROUP+”=1”


想只获取有手机号码的联系人吗?

您可以使用此代码获取所有联系人姓名和号码

Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);
while (phones.moveToNext())
{
  String contactName=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
  String contactNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

}
phones.close();

仅显示带有电话号码和打开联系人列表的联系人意图:

Intent pickContactIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); // Uri.parse("content://contacts")
// Show only user contacts with phone numbers
pickContactIntent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); // Show only user contacts with phone numbers
startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
从响应/联系人处获取电话号码:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == PICK_CONTACT_REQUEST) {
        if (resultCode == RESULT_OK) {
            Uri contactUri = data.getData();
            String[] projection = {ContactsContract.CommonDataKinds.Phone.NUMBER};

            Cursor cursor = getActivity().getContentResolver().query(contactUri, projection, null, null, null);
            if (cursor == null) {
                // show error msg
                return;
            }
            cursor.moveToFirst();

            int column = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
            if (column >= 0) {
                String phoneNo = cursor.getString(column);
                sendSmsMessage(phoneNo);
            } else {
                // show error msg
            }
            cursor.close();
        }
    }
}
请确保,您还可以在API 23中处理运行时权限+

android.permission.READ_CONTACTS

我创建了这个库来解决您的所有查询。它将只保存至少有一个电子邮件或电话号码的联系人。此外,它还将删除相同联系人(由whatsapp等第三方应用程序创建)的电子邮件和电话号码中的重复项

欢迎提出建议


链接:

使用
联系人contract.commonDataTypes.Phone.CONTENT\u URI
@pskink我尝试在选择中传递Phone.CONTENT\u URI,但给出了无法识别的令牌异常。为什么您有排序顺序,并且在投影中有电话号码?HAS_PHONE_NUMBER应该在选择中-因为您似乎希望根据它进行选择。使用selection=“HAS\u PHONE\u NUMBER=1”并在正确的参数中传递适当的排序顺序以进行查询。将Contacts contract.Contacts.CONTENT\u URI更改为Contacts contract.commondatacates.PHONE.CONTENT\u URI,并在选择中添加HAS\u PHONE\u NUMBER=1而不是投影修复了此问题,@RocketRandom谢谢你的提示。但我确实多次收到相同的联系人,任何建议都可以避免这样做,因为我们可以避免收到电子邮件联系人,但是1.如何在此查询中按显示姓名排序2。如何消除重复的电话号码您可以利用Collections类执行排序和其他操作谢谢,只是它在Helper.java number=PhoneNumberUtils.formatNumber(number,“in”).replaceAll(“\\s+”,”)中的第34行崩溃;其他一切都很有魅力!我们如何在这里搜索?@kathan shah我已经在我创建的给定链接上添加了一个库,请检查它