我正在尝试使用 ContactsContract,Phone 中的联系人 ID 从 CommonDataKinds.Phone 中提取电话号码 [英] I'm trying to extract phone number from CommonDataKinds.Phone using contact ID from ContactsContract,Phone

查看:27
本文介绍了我正在尝试使用 ContactsContract,Phone 中的联系人 ID 从 CommonDataKinds.Phone 中提取电话号码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

The following error message is produced whenever user presses Yes button when requested permission to access contacts.

java.lang.RuntimeException: Failure delivering result ResultInfo{who=@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 中获取电话号码的代码如下.

The line 302 refers to query to get suspect phone number. My code to obtain the phone number from contact ID is as below.

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 方法的一部分,用于获取联系人/嫌疑人姓名及其电话号码的权限.

The following code is a portion of onActivityResults method to get the contact/suspect name and permission for their phone number.

    } 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);
        }

推荐答案

如果没有找到联系人,特别是 _ID 并且使用 onRequestPermissionsResult() 而不是 onActivityResult(),你会得到 null.

You are getting null when no contacts are found in particular _ID and use onRequestPermissionsResult() instead of onActivityResult().

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

Note: please check your ReadContact permission in Manifest and also give runtime permission.

完整示例:

    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 中提取电话号码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆