报错
java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
代码
registerForActivityResult(ActivityResultContracts.PickContact()) {
// 这里通过Uri获取联系人信息报错
}
联系人获取代码
String[] contact = new String[2];
//得到ContentResolver对象
String[] projection = new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER};
ContentResolver cr = context.getContentResolver();
//取得电话本中开始一项的光标
Cursor cursor = cr.query(uri, projection, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
//取得联系人姓名
int nameFieldColumnIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
contact[0] = cursor.getString(nameFieldColumnIndex);
//取得电话号码
int numberFieldColumnIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
contact[1] = cursor.getString(numberFieldColumnIndex);
cursor.close();
}
执行查询时候,要不提示ContactsContract.CommonDataKinds.Phone.NUMBER
参数错误,要不就是查询为空, 以前用这个查询代码好使, 今天用报错…
后来发现ActivityResultContracts.PickContact()
中使用的type
是ContactsContract.Contacts.CONTENT_TYPE
, 之前打开联系人时候使用的类型是ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE
.
后来自定义一个PickContact
就好了.
public final class CBPickContact extends ActivityResultContract<Void, Uri> {
@NonNull
@Override
public Intent createIntent(@NonNull Context context, @Nullable Void input) {
return new Intent(Intent.ACTION_PICK).setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
}
@Nullable
@Override
public Uri parseResult(int resultCode, @Nullable Intent intent) {
if (intent == null || resultCode != Activity.RESULT_OK) return null;
return intent.getData();
}
}