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

1、获取通讯录权限:

     

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 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()); 打开应用的设置界面;

更多相关文章

  1. Android判断某个Activity是否正在前台显示
  2. Android获取手机当前连接的WiFi信息(SSID,IP,连接状态)
  3. 操作Android中联系人,通话记录,短息,的URI
  4. Android(安卓)6.0打开串口返回-1问题
  5. 浅析Android(安卓)手机卫士设备管理权限锁屏
  6. Android实现关机重启的方法
  7. Android(安卓)获取apk权限
  8. android通讯录根据手机号码查询姓名
  9. android8.1 系统应用使用FileProvider时提示没有权限

随机推荐

  1. centos65安装简测mysql cluster 7.3.7
  2. [z]如何在一台windows主机上搭建mysql主
  3. MySQL免安装配置(亲测过,请放心借鉴)
  4. SQL Server 2005 所允许的 SQL 语句的最
  5. JPA hibernate spring repository pgsql
  6. 【原】Mysql最大连接数
  7. MySQL5.5.22版本安装配置以及基本命令的
  8. 请问用PL/SQL如何判断两个日期之间相差的
  9. 最近用到的SQL语句
  10. QT5.3连接mysql数据库