访问Sony设备上的联系人电子邮件选择器

时间:2015-03-13 14:37:50

标签: android android-intent android-contacts

我的应用程序使用手机内置的联系人选择器允许用户选择电子邮件地址。我遇到的问题是,这适用于我的Nexus 5(Lollipop)和三星(KitKat),但不适用于Sony Experia Z1(KitKat)。

据我所知,显然没有找到活动,但我找不到兼容索尼Android版本的替代品,但这必须以某种方式实现?

以下是我正在使用的代码段:

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI);
startActivityForResult(intent, 1);

以下是抛出的异常:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.PICK dat=content://com.android.contacts/data/emails }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1632)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1424)
at android.app.Activity.startActivityForResult(Activity.java:3424)
at android.app.Activity.startActivityForResult(Activity.java:3385)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:817)
at com.mtickner.runningmotivator.FriendListActivity.onOptionsItemSelected(FriendListActivity.java:73)
at android.app.Activity.onMenuItemSelected(Activity.java:2600)
at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:350)
at android.support.v7.app.ActionBarActivity.onMenuItemSelected(ActionBarActivity.java:155)
at android.support.v7.app.ActionBarActivityDelegate$1.onMenuItemSelected(ActionBarActivityDelegate.java:74)
at android.support.v7.app.ActionBarActivityDelegateBase.onMenuItemSelected(ActionBarActivityDelegateBase.java:556)
at android.support.v7.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:802)
at android.support.v7.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:153)
at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:949)
at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:939)
at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:596)
at android.support.v7.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:145)
at android.view.View.performClick(View.java:4569)
at android.view.View$PerformClick.run(View.java:18553)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:212)
at android.app.ActivityThread.main(ActivityThread.java:5135)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:877)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
at dalvik.system.NativeStart.main(Native Method)

修改

此权限位于清单中:

<uses-permission android:name="android.permission.READ_CONTACTS" />

3 个答案:

答案 0 :(得分:2)

这是索尼手机的错误。您可以通过检查活动是否可用于意图来确保应用程序不会崩溃。

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI);

if(getPackageManager().resolveActivity(intent,0) != null)
{
    startActivityForResult(intent, 1);
}

答案 1 :(得分:1)

Wombat建议的解决方案绝对是一个很好的解决方案,因为它不仅针对索尼设备,也针对可能存在此问题的任何其他设备。

不幸的是,从Lollipop开始,修复工具不再适用于索尼设备。

事实上,从Android 5.0开始,索尼设备在没有问题的情况下打开联系人应用程序,但在实际选择联系人时抛出SecurityException ... 我在检查时通过更严格的限制来修复它。

Intent intent = new Intent(Intent.ACTION_PICK,
ContactsContract.CommonDataKinds.Email.CONTENT_URI);

if(getPackageManager().resolveActivity(intent,0) != null &&
!Build.MANUFACTURER.equals("Sony"))
{
    startActivityForResult(intent, 1);
}

答案 2 :(得分:0)

我为此而采用的解决方案包括捕获为了显示错误消息而抛出的异常。我没有找到一个有效的替代方案,虽然我还没能尝试索尼的Lollipop版本。

// Launch the contacts picker activity
try {
    Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI);
    startActivityForResult(intent, 1);
} catch (ActivityNotFoundException e) {
    // Catch exception thrown when contacts picker is not found (Sony devices)
    e.printStackTrace();

    // Display error message etc...
}

@Wombat的解决方案看起来在避免异常方面会更有效率,但我想我会在未来添加它以帮助其他人。