美文网首页权限管理其他
Android获取通讯录

Android获取通讯录

作者: 淮左明都 | 来源:发表于2019-02-27 19:03 被阅读264次

    最近开发Android项目中遇到需要用到通讯录的需求,谷歌百度查了一下,根据自己的需求,利用ContentProvder的ContentResolver来获取的通讯录并封装的一个工具类ContactUtils

    /**
     * 获取通讯录工具类
     * 返回的数据:
     * [{
     * "name": "xxx",
     * "note": "呵呵呵呵",
     * "phone": "13333333332"
     * },
     * {
     * "name": "yyy",
     * "phone": "13333333333"
     * },
     * {
     * "name": "zzz",
     * "phone": "13333333334"
     * },
     * ......
     * ]
     */
    public class ContactUtils {
        public static ArrayList<MyContacts> getAllContacts(Context context) {
            ArrayList<MyContacts> contacts = new ArrayList<MyContacts>();
    
            Cursor cursor = context.getContentResolver().query(
                    ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
            while (cursor.moveToNext()) {
                //新建一个联系人实例
                MyContacts temp = new MyContacts();
                String contactId = cursor.getString(cursor
                        .getColumnIndex(ContactsContract.Contacts._ID));
                //获取联系人姓名
                String name = cursor.getString(cursor
                        .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                temp.name = name;
    
                //获取联系人电话号码
                Cursor phoneCursor = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId, null, null);
                while (phoneCursor.moveToNext()) {
                    String phone = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    phone = phone.replace("-", "");
                    phone = phone.replace(" ", "");
                    temp.phone = phone;
                }
    
                //获取联系人备注信息
                Cursor noteCursor = context.getContentResolver().query(
                        ContactsContract.Data.CONTENT_URI,
                        new String[]{ContactsContract.Data._ID, ContactsContract.CommonDataKinds.Nickname.NAME},
                        ContactsContract.Data.CONTACT_ID + "=?" + " AND " + ContactsContract.Data.MIMETYPE + "='"
                                + ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE + "'",
                        new String[]{contactId}, null);
                if (noteCursor.moveToFirst()) {
                    do {
                        String note = noteCursor.getString(noteCursor
                                .getColumnIndex(ContactsContract.CommonDataKinds.Nickname.NAME));
                        temp.note = note;
                        Log.i("note:", note);
                    } while (noteCursor.moveToNext());
                }
                contacts.add(temp);
                //记得要把cursor给close掉
                phoneCursor.close();
                noteCursor.close();
            }
            cursor.close();
            return contacts;
        }
    }
    

    bean类MyContacts里包含了三个属性:name,phone,note(备注),这里就不贴代码了,都是可以根据IDE自动构建的getter、setter和toString。
    需要注意的点有几个:

    一、权限问题

    在Android6.0版本加强了用户的安全体验,在2015年8月,Google发布了Android6.0版本,在用户权限的选择方面给了更灵活、更安全的操作方式。要知道原先(6.0之前)的用户对于权限的操作,只需要在安装时点击同意,所有权限就都给了,不然的话用户只能选择拒绝安装。也就是说,假如用户不想App获取通讯录等隐私信息,只能选择不安装应用。6.0开始,Google引入了权限申请机制,把权限分为危险权限和正常权限。
    ok~科普结束。现在你要知道获取通讯录的权限是属于危险权限,需要动态申请该权限。

    二、申请方法

    在调用上述通讯录工具类之前,默认是没有权限的,需要动态申请权限:
    (1)首先在AndroidManifest.xml中添加所需权限

    <uses-permission android:name="android.permission.READ_CONTACTS" />
    

    (2)根据不同版本,封装一个方法来检查和申请权限

    /**
         * 动态权限
         */
        public void addPermissByPermissionList(Activity activity, String[] permissions, int request) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                ArrayList<String> mPermissionList = new ArrayList<>();
                for (int i = 0; i < permissions.length; i++) {
                    if (ContextCompat.checkSelfPermission(activity, permissions[i])
                            != PackageManager.PERMISSION_GRANTED) {
                        mPermissionList.add(permissions[i]);
                    }
                }
                if (mPermissionList.isEmpty()) {
                    Logger.i("已授权");
                } else {
                    //请求权限方法
                    String[] permissionsNew = mPermissionList.toArray(new String[mPermissionList.size()]);//将List转为数组
                    ActivityCompat.requestPermissions(activity, permissionsNew, request);
                }
            }
        }
    

    (3)重写onRequestPermissionsResult方法根据用户的不同选择做出响应

    /**
         * requestPermissions的回调
         * 一个或多个权限请求结果回调
         */
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            boolean hasAllGranted = true;
            //判断是否拒绝  拒绝后要怎么处理 以及取消再次提示的处理
            for (int grantResult : grantResults) {
                if (grantResult == PackageManager.PERMISSION_DENIED) {
                    hasAllGranted = false;
                    break;
                }
            }
            switch (requestCode) { //同意权限的处理
                case PERMISS_CONTACT:   //获取通讯录的动态权限
                    Logger.i("通讯录");
                    if (hasAllGranted) {        //同意权限做的处理,开启服务提交通讯录
                        ContactIntentService.startActionContact(MainActivity.this);
                    } else {                    //拒绝权限且权限被手动不再提示做的处理,打开权限
                        MainHelper.getInstance().dealwithPermiss(MainActivity.this, permissions[0]);
                    }
                    break;
                case PERMISS_CAMERA:    //获取相机的动态权限
                    if (!hasAllGranted) {
                        MainHelper.getInstance().dealwithPermiss(MainActivity.this, permissions[0]);
                    }
                    break;
                case PERMISS_SMS:       //获取短信的动态权限
                    if (!hasAllGranted) {
                        MainHelper.getInstance().dealwithPermiss(MainActivity.this, permissions[0]);
                    }
                    break;
                case PERMISS_DX:
                    Logger.i("读写权限");
                    break;
                case PERMISS_ALL:       //获取所有权限
                    Logger.i("所有权限");
                    break;
                default:        //其他
                    Logger.i("其他");
                    break;
            }
        }
    

    引导处理权限拒绝之后的操作:

     public void dealwithPermiss(final Activity context, String permission) {
            if (!ActivityCompat.shouldShowRequestPermissionRationale(context, permission)) {
                new CustomDialog(context).setTitle("操作提示").
                        setMessage("注意:当前缺少必要权限!\n请点击“设置”-“权限”-打开所需权限\n最后点击两次后退按钮,即可返回")
                        .setSingle(false)
                        .setPositive("去授权")
                        .setNegtive("取消")
                        .setOnClickBottomListener(new CustomDialog.OnClickBottomListener() {
                            @Override
                            public void onPositiveClick() {
                                //引导用户至设置页手动授权
                                Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                Uri uri = Uri.fromParts("package", context.getApplicationContext().getPackageName(), null);
                                intent.setData(uri);
                                context.startActivity(intent);
                            }
    
                            @Override
                            public void onNegtiveClick() {
    
                            }
                        }).show();
            }
        }
    
    Ps

    当然你也可以使用RxPermission,这里有篇博客可以参考一下

    https://blog.csdn.net/u013553529/article/details/68948971

    相关文章

      网友评论

        本文标题:Android获取通讯录

        本文链接:https://www.haomeiwen.com/subject/jphjfqtx.html