2015-03-13 299 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); 
} 
相關問題