目录
这里是在安卓客户端中为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("保存失败,请重新尝试");
}
}