我可以在不打开意向的情况下从联系人中检索 phone 号码吗?

Can I retrieve a phone number from contacts without opening an intent?

我想通过仅询问姓名而不显示我的联系人的方式以编程方式获取联系人的电话号码 activity。

可能吗?以及如何?

我尝试了以下操作,但即使我在清单中设置了我的权限,我仍然收到权限错误

ContentResolver cr = getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);



    ArrayList<String> contact_names = new ArrayList<String>();

    if (cur.getCount() > 0)
    {
        while (cur.moveToNext())
        {
            String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
            String name = "GIAGIA";
            if (cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER.trim())).equalsIgnoreCase("1"))
            {
                if (name!=null){
                    //contact_names[i]=name;

                    Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{id}, null);
                    while (pCur.moveToNext())
                    {
                        String PhoneNumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                        Toast.makeText(getBaseContext(),PhoneNumber ,Toast.LENGTH_LONG).show();
                        //i++;
                        break;
                    }
                    pCur.close();
                    pCur.deactivate();
                    // i++;
                }else
                {
                    Toast.makeText(getBaseContext(),"Does not exist",Toast.LENGTH_LONG).show();
                }
            }
        }
        cur.close();
        cur.deactivate();
    }

    String[] contactList = new String[contact_names.size()];

    for(int j = 0; j < contact_names.size(); j++){
        contactList[j] = contact_names.get(j);
    }

    return contactList;
}

如果您的意思是从用户那里获取联系人姓名并在 Contacts 数据库中找到一个 phone 号码,这应该可行:

public List<String> getPhoneNumbersByName(String name) {
    List<String> phones = new ArrayList<>();
    String[] projection = new String[] { Phone.DISPLAY_NAME, Phone.NUMBER };
    Cursor cur = cr.query(Phone.CONTENT_URI, projection, Phone.DISPLAY_NAME + "=?", new String[]{ name }, null);
    while (cur != null && cur.moveToNext()) {
        phones.add = cur.getString(1);
    }
    if (cur != null) {
        cur.close();
    }
    return phones;
}

备注:

  1. 可以有多个联系人同名,这将 return 属于所有匹配给定姓名的联系人的所有号码
  2. 每个联系人可以存储多个号码,因此此函数 returns 是 phones
  3. 的列表
  4. 名称必须完全匹配,您可以通过将选择更改为不区分大小写来放宽此限制and/or使用Sqlite的“LIKE”选项