首先说一下,在魅族手机上需要用户手动开启权限,不然获取到的cursor.moveToFirst()会返回false,反过来,如果cursor.moveToFirst()返回false,一般都是权限问题,那么如何解决这个问题呢?一般解决方案是弹窗提示,需要开启联系人权限,点击确定就跳转到设置权限的页面。
点击跳转到通讯录页面
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, 1);
在onActivityResult方法里获取信息
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && resultCode == Activity.RESULT_OK) {
boolean permission = ContactUtil.getPermission(getApplicationContext(), data);
if (permission) {
HashMap<String, String> params = ContactUtil.getContactInfo(getApplicationContext(), data);
if (params != null) {
if (params.containsKey("name")) {
idTextEditName.setEditText(params.get("name"));
}
if (params.containsKey("mobile")) {
idTextEditContractInfo.setEditText(params.get("mobile"));
}
if (params.containsKey("email")) {
idTextEditEmail.setEditText(params.get("email"));
}
if (params.containsKey("momo")) {
idTextEditRemarks.setEditText(params.get("momo"));
}
} else {
showToast("获取联系人信息失败");
}
} else {
showPermissionDialog();
}
}
}
弹窗提示需要用户手动设置开启联系人权限
/***
* 跳往权限设置界面
*/
private void showPermissionDialog() {
new AlertDialog(this).builder().setMsg("应用需要读取联系人权限").setPositiveButton(0, new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
}
}).setNegativeButton(0,null).show();
}
工具类:判断权限和获取联系人信息
public class ContactUtil {
/***
* 判断权限
*
* @param context
* @param data
* @return
*/
public static boolean getPermission(Context context, Intent data) {
// 获取联系人id游标
Cursor idCursor = context.getContentResolver().query(data.getData(), null, null, null, null);
if (!idCursor.moveToFirst()) {
if (!idCursor.isClosed()) idCursor.close();
return false;
}
if (!idCursor.isClosed()) idCursor.close();
return true;
}
/**
* 获取单个联系的详细信息
*
* @param context
* @param data
* 调用系统联系人返回的Intent
*/
public static HashMap<String, String> getContactInfo(Context context, Intent data) {
Cursor cursor = null;
try {
// 获取联系人id游标
Cursor idCursor = context.getContentResolver().query(data.getData(), null, null, null, null);
if (!idCursor.moveToFirst()) {
return null;
}
// 获取联系人的id,用于筛选
String contactId = idCursor.getString(idCursor.getColumnIndex(ContactsContract.Contacts._ID));
if (!idCursor.isClosed()) idCursor.close();
// 获取系统的所有联系人中筛选出id为“contactId”的所有信息
cursor = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, ContactsContract.Data.CONTACT_ID + " = " + contactId, null, null);
HashMap<String, String> params = new HashMap<>();
// 遍历所有内容
while (cursor.moveToNext()) {
// 获取mimetype,通过mimetype来判断当前数据的类型
String mimetype = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.MIMETYPE));
switch (mimetype) {
// 联系人名称
case ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE:
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME));
params.put("name", name);
break;
// 联系人电话号码,注意电话号码有多个且类型可能不同
case ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE:
int phoneIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
int phoneTypeIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
int phoneType = cursor.getInt(phoneTypeIndex);
String number = cursor.getString(phoneIndex).trim();
params.put("mobile", number.replaceAll(" ", ""));
switch (phoneType) {
// 移动手机
case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE:
String mobile = number;
break;
// 家用座机
case ContactsContract.CommonDataKinds.Phone.TYPE_HOME:
String phone = number;
break;
// 家用传真
case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME:
String faxHome = number;
break;
default:
break;
// 一共有20种类型
// public static final int TYPE_HOME = 1;
// public static final int TYPE_MOBILE = 2;
// public static final int TYPE_WORK = 3;
// public static final int TYPE_FAX_WORK = 4;
// public static final int TYPE_FAX_HOME = 5;
// public static final int TYPE_PAGER = 6;
// public static final int TYPE_OTHER = 7;
// public static final int TYPE_CALLBACK = 8;
// public static final int TYPE_CAR = 9;
// public static final int TYPE_COMPANY_MAIN = 10;
// public static final int TYPE_ISDN = 11;
// public static final int TYPE_MAIN = 12;
// public static final int TYPE_OTHER_FAX = 13;
// public static final int TYPE_RADIO = 14;
// public static final int TYPE_TELEX = 15;
// public static final int TYPE_TTY_TDD = 16;
// public static final int TYPE_WORK_MOBILE = 17;
// public static final int TYPE_WORK_PAGER = 18;
// public static final int TYPE_ASSISTANT = 19;
// public static final int TYPE_MMS = 20;
}
break;
// 获取email
case ContactsContract.CommonDataKinds.Email.CONTENT_TYPE:
String email = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS));
params.put("email", email);
break;
// 获取备注
case ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE:
String note = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE));
params.put("momo", note);
break;
// 获取通讯地址
case ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE:
String street = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));
String poBox = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX));
String city = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
String country = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
String region = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));
String neighborhood = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.NEIGHBORHOOD));
String postcode = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));
// 判断通讯地址类型
int structuredPostalIndexTypeIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE);
int structuredPostalIndexType = cursor.getInt(structuredPostalIndexTypeIndex);
switch (structuredPostalIndexType) {
// 家庭地址
case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME:
break;
// 单位地址
case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK:
break;
// 其他
case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER:
break;
default:
break;
}
break;
default:
break;
}
}
return params;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null && !cursor.isClosed()) {
cursor.close();
}
}
return null;
}
}
完成