安卓客户端实现将联系人保存到通讯录

目录

1、声明访问和修改通讯录权限

2、为h5提供将联系人保存到通讯录的方法

这里是在安卓客户端中为h5页面提供了一个将联系人保存到通讯录的方法。

1、声明访问和修改通讯录权限

在AndroidManifest.xml文件中声明如下权限:

<!-- 访问和修改手机通讯录权限   -->
<uses-permission android:name="android.permission.WRITE_CONTACTS" />

2、为h5提供将联系人保存到通讯录的方法

// @JavascriptInterface这个注解表示可以从一个网页中的javaScript代码调用安卓的原生方法
@JavascriptInterface
        public void saveContact(String json){
// 将网页传过来的联系人手机号和姓名进行解析
            JSONObject jsonObject = JSON.parseObject(json);
            teacherMobilePhone = jsonObject.getString("mobilePhone");
            teacherName = jsonObject.getString("name");

// 将联系人保存到通迅录之前先检查是否有修改通讯录的权限,如果有权限则直接保存通讯录;没有权限需要先申请修改通讯录的权限
            if(requestPermissions(PERMISSIONS_REQUEST_WRITE_CONTACTS, Manifest.permission.WRITE_CONTACTS)){
                // 如果已经开启了权限,则直接将联系人保存到通讯录
                saveMobilePhoneAndName(teacherMobilePhone,teacherName);
            }
        }



/**
     * 检查并申请权限
     * @return 是否所需权限已经申请
     */
    public boolean requestPermissions(int req, String... permissions){
        if (getActivity() == null || permissions == null){
            return true;
        }
        fastClickUtil.start(REQUEST_PERMISSIONS_TAG);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            List<String> data = CheckPermissionUtils.getRequestPermissionList(getContext(), permissions);
        if (!CommonUtil.isEmpty(data)){
            requestPermissions(data.toArray(new String[0]), req);
            return false;
         }
         return true;
        }else{
            return ((BaseActivity)getActivity()).requestPermissions(req, permissions);
        }
    }


/**
* 检查权限是否已经申请
**/
public static List<String> getRequestPermissionList(Context context, String... permissions){
        if (context == null || permissions == null){
            return null;
        }
        List<String> data = new ArrayList<>();//存储未申请的权限
        for (String permission : permissions) {
            int checkSelfPermission = ContextCompat.checkSelfPermission(context, permission);
            if(checkSelfPermission == PackageManager.PERMISSION_DENIED){//未申请
                data.add(permission);
            }
        }
        return data;
    }


/**
     * 保存手机号和姓名到通讯录
     * @param mobilePhone
     * @param name
     */
    private void saveMobilePhoneAndName(String mobilePhone,String name){
        // 创建一个操作列表,它将包含所有要执行的操作,以将新的联系人信息插入到通讯录中
        ArrayList<ContentProviderOperation> ops = new ArrayList<>();

        // 为新联系人创建一个新的rawContact,这是保存联系人的第一个步骤,相当于创建了一个存放联系人信息的空间
        ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
                .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
                .build());

        /* 创建联系人姓名
           .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)表示使用上一步创建的rawContact
           .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)这个是用来设置MIME类型,这里表示设置MIME类型为联系人的姓名,这样系统就知道该如何进行显示
           .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name)这个用来设置联系人的姓名   */
        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name)
                .build());
        
        /* 创建联系人的手机号
           与上一步设置姓名不同的一点是,多了一个设置。
           即.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)用来表示手机号的类型为移动手机号码  */
        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, mobilePhone)
                .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
                .build());
        try {
            // 执行操作
            getContext().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
            showToast("保存成功");
        } catch (Exception e) {
            e.printStackTrace();
            showToast("保存失败,请重新尝试");
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值