对于某些 Android 设备,添加联系人不会 return 数据 onactivityresult 方法
Add Contact does not return data onactivityresult method for some Android devices
我正在修改以下代码以使其在所有设备上 运行。
幸运的是,它在 LG Nexus 5 (Android 6.0.1)
上运行良好
我在 Sony Xperia D6503 (Android 6.0.1) 上尝试的同一段代码。
但它不起作用。
private void addContactUsingIntent() {
Intent intent = new Intent(Intent.ACTION_INSERT, ContactsContract.Contacts.CONTENT_URI);
intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
intent.putExtra(INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED, true);
//ContactsListActivity.this.startActivityForResult(intent, INSERT_CONTACT_REQUEST);
startActivityForResult(intent, INSERT_CONTACT_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == INSERT_CONTACT_REQUEST) {
if (resultCode == RESULT_OK) {
Uri contactData = data.getData();
Cursor cursor = getContentResolver().query(contactData, null, null, null, null);
if (cursor.moveToFirst()) {
long newId = cursor.getLong(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
String email = getEmail(String.valueOf(newId));
ArrayList<String> phones = new ArrayList<>();
Cursor cPhones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
new String[]{String.valueOf(newId)}, null);
while (cPhones.moveToNext()) {
phones.add(cPhones.getString(cPhones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
}
cursor.close();
cPhones.close();
Uri photoUri = getPhotoUri(newId);
Log.i("Photo URI", photoUri.toString());
updateViews(newId, name, phones, email, photoUri);
}
}
}
}
请查看上面的代码,如果我做错了什么请告诉我。
在 LG Nexus 5 设备上,当我的应用程序调用 addContactUsingIntent
时,设备的默认联系人应用程序将打开。一旦用户保存联系人,我就会在 onActivityResult
中得到 data
。在 Sony Xperia 设备上,添加联系人的默认联系人屏幕也会打开,但在用户保存后,它会显示新添加的联系人,然后用户必须手动按返回 return 到我的应用程序。这样做,当onActivityResult" is called, it comes back with data as null and
resultCodeas
-1`时,显然不是这样。
我也尝试过以下解决方案,但它不适用于此设备。
Add contact intent doesn't return data onActivityResult under ICS
任何让它发挥作用的建议都将不胜感激。
谢谢
P.S。我还在 Oppo F3 Plus (Android 6.0.1) 上测试了这段代码,它运行得非常好。
问题出在您的 Intent
索尼 XPERIA 设备上即将出现的应用程序中。他们显然没有很好地测试 ACTION_INSERT
(虽然你的 INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED
不是 Android SDK 的一部分,很可能会被忽略)。
但是,您对此无能为力,除非您是 Sony 员工并且可以以某种方式修复其联系人应用程序中的错误。
我正在修改以下代码以使其在所有设备上 运行。 幸运的是,它在 LG Nexus 5 (Android 6.0.1)
上运行良好我在 Sony Xperia D6503 (Android 6.0.1) 上尝试的同一段代码。 但它不起作用。
private void addContactUsingIntent() {
Intent intent = new Intent(Intent.ACTION_INSERT, ContactsContract.Contacts.CONTENT_URI);
intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
intent.putExtra(INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED, true);
//ContactsListActivity.this.startActivityForResult(intent, INSERT_CONTACT_REQUEST);
startActivityForResult(intent, INSERT_CONTACT_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == INSERT_CONTACT_REQUEST) {
if (resultCode == RESULT_OK) {
Uri contactData = data.getData();
Cursor cursor = getContentResolver().query(contactData, null, null, null, null);
if (cursor.moveToFirst()) {
long newId = cursor.getLong(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
String email = getEmail(String.valueOf(newId));
ArrayList<String> phones = new ArrayList<>();
Cursor cPhones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
new String[]{String.valueOf(newId)}, null);
while (cPhones.moveToNext()) {
phones.add(cPhones.getString(cPhones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
}
cursor.close();
cPhones.close();
Uri photoUri = getPhotoUri(newId);
Log.i("Photo URI", photoUri.toString());
updateViews(newId, name, phones, email, photoUri);
}
}
}
}
请查看上面的代码,如果我做错了什么请告诉我。
在 LG Nexus 5 设备上,当我的应用程序调用 addContactUsingIntent
时,设备的默认联系人应用程序将打开。一旦用户保存联系人,我就会在 onActivityResult
中得到 data
。在 Sony Xperia 设备上,添加联系人的默认联系人屏幕也会打开,但在用户保存后,它会显示新添加的联系人,然后用户必须手动按返回 return 到我的应用程序。这样做,当onActivityResult" is called, it comes back with data as null and
resultCodeas
-1`时,显然不是这样。
我也尝试过以下解决方案,但它不适用于此设备。 Add contact intent doesn't return data onActivityResult under ICS
任何让它发挥作用的建议都将不胜感激。
谢谢
P.S。我还在 Oppo F3 Plus (Android 6.0.1) 上测试了这段代码,它运行得非常好。
问题出在您的 Intent
索尼 XPERIA 设备上即将出现的应用程序中。他们显然没有很好地测试 ACTION_INSERT
(虽然你的 INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED
不是 Android SDK 的一部分,很可能会被忽略)。
但是,您对此无能为力,除非您是 Sony 员工并且可以以某种方式修复其联系人应用程序中的错误。