我正在尝试使用 ContactsContract,Phone 中的联系人 ID 从 CommonDataKinds.Phone 中提取电话号码

Posted

技术标签:

【中文标题】我正在尝试使用 ContactsContract,Phone 中的联系人 ID 从 CommonDataKinds.Phone 中提取电话号码【英文标题】:I'm trying to extract phone number from CommonDataKinds.Phone using contact ID from ContactsContract,Phone 【发布时间】:2021-10-27 21:59:45 【问题描述】:

在请求访问联系人的权限时,只要用户按“是”按钮,就会产生以下错误消息。

java.lang.RuntimeException: Failure delivering result ResultInfowho=@android:requestPermissions:, request=131074, result=-1, data=Intent  act=android.content.pm.action.REQUEST_PERMISSIONS (has extras)  to activity com.example.criminalintent/com.example.criminalintent.CrimePagerActivity: java.lang.IllegalArgumentException: the bind value at index 1 is null
  com.example.criminalintent.CrimeFragment.getSuspectPhoneNumber(CrimeFragment.java:302)
   at com.example.criminalintent.CrimeFragment.updateSuspectNumber(CrimeFragment.java:322) at com.example.criminalintent.CrimeFragment.onRequestPermissionsResult(CrimeFragment.java:337)

302行是查询可疑电话号码。我从联系人 ID 中获取电话号码的代码如下。

private String getSuspectPhoneNumber(String contactId)
    String suspectPhoneNumber=null;

    Uri phoneContactUri= ContactsContract.CommonDataKinds.Phone.CONTENT_URI;

    //returns columns
    String[] queryFields= new String[] 
            ContactsContract.Data.CONTACT_ID,
            ContactsContract.CommonDataKinds.Phone.NUMBER,
            ContactsContract.CommonDataKinds.Phone.TYPE;

    //Selection criteria (where clause)
    String mSelectionClause= ContactsContract.Data.CONTACT_ID + "=?";

    //Selection criteria (where args)
    String mSelectionArgs[] = contactId ;

    //Does query and returns cursor object
    //line 302
    Cursor c= getActivity().getContentResolver().
            query(phoneContactUri,queryFields,mSelectionClause,mSelectionArgs,null);

    try 
        if (c.getCount() == 0) 
            return null;
        

        c.moveToNext();
        int phoneType=c.getInt(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
        if (phoneType==ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE) 
            suspectPhoneNumber=c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        
    finally 
        c.close(); 

    return suspectPhoneNumber;

以下代码是 onActivityResults 方法的一部分,用于获取联系人/嫌疑人姓名及其电话号码的权限。

     else if (requestCode == REQUEST_CONTACT && data != null)
       String suspectName=getCrimeSuspect(data);
       mCrime.setSuspect(suspectName);
       mSuspectButton.setText(suspectName);

       if (hasContactsPermission())
            updateSuspectNumber(); 
        else
            requestPermissions(CONTACTS_PERMISSIONS,REQUEST_CONTACTS_PERMISSIONS);
        

【问题讨论】:

请添加 onActivityResult() 代码。会有问题的。 嗨,我已经添加了 onActivityResult 方法,如上所示。我认为我的问题是我不确定如何使用联系人 ID 变量来提取电话号码。我的联系人 ID 变量在另一种方法中初始化,仅提取联系人姓名和 ID。但是,getSuspectNumber 方法中的联系人 id 变量为 null。 那么,您在 getSuspectNumber 中得到了 null? 【参考方案1】:

当没有找到特别是 _ID 的联系人并使用 onRequestPermissionsResult() 而不是 onActivityResult() 时,您将获得 null。

注意:请在 Manifest 中检查您的 ReadContact 权限,并授予运行时权限。

完整示例:

    public class MainActivity extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) 
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
                requestPermissions(new String[]Manifest.permission.READ_CONTACTS, 0);
            
         else 
            getId();
        
    

    //get _ID and NAME
    public void getId() 
        ContentResolver cr = getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

        if (cur.getCount() > 0) 
            while (cur.moveToNext()) 
                String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                getNumbers(cr, id);
            
        
    

    //get Numbers where ( _ID = CONTACT_ID).
    public String getNumbers(ContentResolver cr, String Id) 
        List<String> Numbers = new ArrayList<>();

        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));
            int phoneType = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
            System.out.println("Contact No:==> " + phoneType);
            if (phoneType == ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE) 
                Numbers.add(phoneNumber);
            
        
        //return null when when no contacts found in specific ID otherwise it will generate error.
        if (Numbers.size() == 0) 
            return null;
         else 
            System.out.println("Contact No:==> " + Numbers.get(0));
            return Numbers.get(0);// get number from particular index and to get all numbers set datatype String to List<String>.
        
    

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) 
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 0) 
            getId();
        
    

【讨论】:

以上是关于我正在尝试使用 ContactsContract,Phone 中的联系人 ID 从 CommonDataKinds.Phone 中提取电话号码的主要内容,如果未能解决你的问题,请参考以下文章

ContactsContract 按联系人 ID 查找电话号码

在 ContactsContract 中更新照片的功能

联系人列表仅使用意图 ContactsContract 显示一个电话号码

从 ContactsContract 表中获取数据时出现 SQLITE 异常

无法从 ContactsContract.Contacts.CONTENT_URI 获取已删除的联系人

如何使用android ContactsContract.Data