在Android 11中,由于隐私限制,应用程序无法访问其他应用程序的数据。因此,如果您尝试使用旧的代码从另一个应用程序中检索数据,则可能会遇到空游标的问题。您可以通过限制查询表的列来解决这个问题。下面是一个例子,假设您现在正在检索其他应用程序的数据并获得空游标:
Cursor cursor = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[]{ ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY}, null, null, null);
if (cursor != null && cursor.getCount() > 0) { // 取得返回数据 while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY)); String number = cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER)); } }
cursor.close();
替换成:
Cursor cursor = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[]{ ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY}, ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " = ?", new String[]{"John"}, // 这里可以是任何一个名字 null);
if (cursor != null && cursor.getCount() > 0) { // 取得查询结果 while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY)); String number = cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER)); } }
cursor.close();
在这个示例中,我们通过将一个查询参数添加到表中来限制结果,以无法获取表中的所有数据。在这种情况下,我们只检索特定名称的联系人信息。您可以使用各种不同的查询参数来重新定义表的选择,以获取