2015-03-13 296 views
2

我的应用程序使用手机内置的联系人选择器来允许用户选择电子邮件地址。我遇到的问题是,这适用于我的Nexus 5(棒棒糖)和三星(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" /> 

回答

2

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

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

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

我还没有尝试过,因为目前我没有索尼手机的使用权限,但看起来像是一个很好的解决方案。我当时使用的一个涉及捕捉异常,但看起来更整洁。下面将发布我的解决方案。 – 2015-08-23 15:38:41

0

我为此解决的解决方案涉及捕获抛出的异常以显示错误消息。尽管我还没有尝试过索尼版本的棒棒糖,但我没有找到可行的替代方案。

// 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... 
} 

@袋熊的解决方案看起来将是避免异常方面更有效,但我想我想补充一点,以帮助其他人的未来。

1

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

不幸的是,从Lollipop开始,该修复程序不再适用于Sony设备。

事实上,从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); 
} 
相关问题