其他分享
首页 > 其他分享> > Android 获取通讯录联系人,打开通讯录获取联系人信息;整个流程封装在基类中;

Android 获取通讯录联系人,打开通讯录获取联系人信息;整个流程封装在基类中;

作者:互联网

打开原生通讯录获取联系人姓名和手机号

1、获取通讯录权限:

 <!--访问通讯录-->
    <uses-permission android:name="android.permission.READ_CONTACTS"/>

2、6.0动态权限和打开通讯录:

    protected final int REQUEST_PERMISSION_ADDRESSBOOK = 10;
    protected final int REQUEST_ADDRESSBOOK = 11;
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M 
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_PERMISSION_ADDRESSBOOK);
        }else{
            // 跳转到联系人界面
            Intent intent = new Intent();
            intent.setAction("android.intent.action.PICK");
            intent.addCategory("android.intent.category.DEFAULT");
            intent.setType("vnd.android.cursor.dir/phone_v2");
            startActivityForResult(intent, REQUEST_ADDRESSBOOK);
        }

3、通讯录动态权限回调处理:

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
         if (requestCode == REQUEST_PERMISSION_ADDRESSBOOK){
            if (grantResults.length > 0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
                // 跳转到联系人界面
                Intent intent = new Intent();
                intent.setAction("android.intent.action.PICK");
                intent.addCategory("android.intent.category.DEFAULT");
                intent.setType("vnd.android.cursor.dir/phone_v2");
                startActivityForResult(intent, REQUEST_ADDRESSBOOK);
            }else {
                new AlertDialog.Builder(BaseApplication.get().getTopActivity())
                        .setTitle(R.string.warm_tips)
                        .setMessage("您已经拒绝了获取联系人权限,请手动设置")
                        .setPositiveButton("去设置", (dialogInterface, i) -> SysIntentUtil.goSettings(BaseApplication.get()))
                        .setNegativeButton("不了", null)
                        .show();
            }
        }
    }

4、获取回调的数据:

  @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //选择联系人的回调
        if (requestCode == REQUEST_ADDRESSBOOK) {
            try {
                if (data != null) {
                    Uri uri = data.getData();
                    String phoneNum = null;
                    String contactName = null;
                    // 创建内容解析者
                    ContentResolver contentResolver = getContentResolver();
                    Cursor cursor = null;
                    if (uri != null) {
                        cursor = contentResolver.query(uri, new String[]{"display_name", "data1"}, null, null, null);
                    }
                    while (cursor.moveToNext()) {
                        contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                        phoneNum = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    }
                    cursor.close();
                    if (phoneNum != null) {
                        phoneNum = phoneNum.replaceAll("-", " ");
                        phoneNum = phoneNum.replaceAll(" ", "");
                    }
                    Toast.makeText(this,contactName+ "=="+phoneNum,Toast.LENGTH_LONG).show();
                } else {
                   Toast.makeText(this,"用户未选择联系人",Toast.LENGTH_LONG).show(); //用户未选择联系人
                }
            }catch (Exception e){Toast.makeText(this,"获取联系人失败",Toast.LENGTH_LONG).show();} //异常
        }
    }

好了,大概就这4步就可以获取到联系人的姓名和手机号码了;

下面把获取联系人这一流程封装在Activity的基类中,使用起来就更爽了!!!看BaseActivity

直接上代码啦!!!

public abstract class BaseActivity extends AppCompatActivity {
    /***************************你基类中其它代码*********************/

 protected final int REQUEST_PERMISSION_ADDRESSBOOK = 10;
    protected final int REQUEST_ADDRESSBOOK = 11;

  interface OnNativeAddressBookListener{
        void onNativeAddress(String assressBook);
    }
  private OnNativeAddressBookListener onNativeAddressBookListener;

    protected void getNativeAddressBook(OnNativeAddressBookListener onNativeAddressBookListener){
        this.onNativeAddressBookListener = onNativeAddressBookListener;

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_PERMISSION_ADDRESSBOOK);
        }else{
            // 跳转到联系人界面
            Intent intent = new Intent();
            intent.setAction("android.intent.action.PICK");
            intent.addCategory("android.intent.category.DEFAULT");
            intent.setType("vnd.android.cursor.dir/phone_v2");
            startActivityForResult(intent, REQUEST_ADDRESSBOOK);
        }
    }

    private void callbackNativeAddressBook(int code , String name , String phone){
        Map<String , Object> addressBookMap = new HashMap<>();
        addressBookMap.put("name",name);
        addressBookMap.put("phone",phone);
        addressBookMap.put("errorCode",code);
        if (code != 0) {addressBookMap.put("errorMessage","获取联系人信息失败,请选择联系人或检查通讯录权限是否开启");}
        if (onNativeAddressBookListener != null) onNativeAddressBookListener.onNativeAddress(GsonUtils.toJson(addressBookMap));
    }

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //选择联系人的回调
        if (requestCode == REQUEST_ADDRESSBOOK) {
            try {
                if (data != null) {
                    Uri uri = data.getData();
                    String phoneNum = null;
                    String contactName = null;
                    // 创建内容解析者
                    ContentResolver contentResolver = getContentResolver();
                    Cursor cursor = null;
                    if (uri != null) {
                        cursor = contentResolver.query(uri, new String[]{"display_name", "data1"}, null, null, null);
                    }
                    while (cursor.moveToNext()) {
                        contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                        phoneNum = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    }
                    cursor.close();
                    if (phoneNum != null) {
                        phoneNum = phoneNum.replaceAll("-", " ");
                        phoneNum = phoneNum.replaceAll(" ", "");
                    }
                   
                    callbackNativeAddressBook(0, contactName, phoneNum);
                } else {
                    callbackNativeAddressBook(-2, null, null); //用户未选择联系人
                }
            }catch (Exception e){callbackNativeAddressBook(-3, null, null);} //异常
        }
    }

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
         if (requestCode == REQUEST_PERMISSION_ADDRESSBOOK){
            if (grantResults.length > 0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
                // 跳转到联系人界面
                Intent intent = new Intent();
                intent.setAction("android.intent.action.PICK");
                intent.addCategory("android.intent.category.DEFAULT");
                intent.setType("vnd.android.cursor.dir/phone_v2");
                startActivityForResult(intent, REQUEST_ADDRESSBOOK);
            }else {
                callbackNativeAddressBook(-1, null, null);
                new AlertDialog.Builder(BaseApplication.get().getTopActivity())
                        .setTitle(R.string.warm_tips)
                        .setMessage("您已经拒绝了获取联系人权限,请手动设置")
                        .setPositiveButton("去设置", (dialogInterface, i) -> SysIntentUtil.goSettings(BaseApplication.get()))
                        .setNegativeButton("不了", null)
                        .show();
            }
        }
    }

}

使用:继承BaseActivity调用这个方法就行了,就和设置个Button的点击事件一样简单;

            getNativeAddressBook(new OnNativeAddressBookListener() {
                    @Override
                    public void onNativeAddress(String assressBook) {
                        Log.i(callback, assressBook);
                    }
                });

注:一些工具类就不贴出来了 

Gson:GsonUtils.toJson(addressBookMap); 把对象转Json

SysIntentUtil.goSettings(BaseApplication.get()); 打开应用的设置界面;

标签:REQUEST,phoneNum,联系人,cursor,获取,intent,通讯录,null
来源: https://blog.csdn.net/qq_35605213/article/details/90045997