我正在使用
final Intent notice = new Intent();
notice.setType("text/plain");
notice.putExtra(Intent.EXTRA_SUBJECT, "My Subject");
notice.putExtra(Intent.EXTRA_TEXT, "My Text");
try {
getContext().startActivity(Intent.createChooser(notice, "Send..."));
} catch(final android.content.ActivityNotFoundException ex) {
Toast.makeText(getContext(), "There are no email clients installed.", Toast.LENGTH_SHORT).show();
} catch(final SecurityException ex) {
Toast.makeText(getContext(), "Sorry, application does not have permissions to send to this destination.", Toast.LENGTH_SHORT).show();
} // try/catch
如How can I send emails from my Android application?
所示但是,有一些应用程序,如果用户选择,会使应用程序崩溃SecurityException
,因为当前应用程序没有足够的权限来发送意图:
02-05 23:11:33.417: E/AndroidRuntime(20255): java.lang.SecurityException: Permission Denial: starting Intent { typ=text/plain flg=0x3000000 cmp=com.google.android.gm/.AutoSendActivity (has extras) } from ProcessRecord{4084ca60 20255:com.example.myapp/10065} (pid=20255, uid=10065) requires com.google.android.gm.permission.AUTO_SEND 02-05 23:11:33.417: E/AndroidRuntime(20255): at android.os.Parcel.readException(Parcel.java:1322) 02-05 23:11:33.417: E/AndroidRuntime(20255): at android.os.Parcel.readException(Parcel.java:1276) 02-05 23:11:33.417: E/AndroidRuntime(20255): at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1351) 02-05 23:11:33.417: E/AndroidRuntime(20255): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1374) 02-05 23:11:33.417: E/AndroidRuntime(20255): at android.app.Activity.startActivityForResult(Activity.java:2827) 02-05 23:11:33.417: E/AndroidRuntime(20255): at android.app.Activity.startActivity(Activity.java:2933) 02-05 23:11:33.417: E/AndroidRuntime(20255): at com.android.internal.app.ResolverActivity.onIntentSelected(ResolverActivity.java:203) 02-05 23:11:33.417: E/AndroidRuntime(20255): at com.android.internal.app.ResolverActivity.onClick(ResolverActivity.java:117) 02-05 23:11:33.417: E/AndroidRuntime(20255): at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:873) 02-05 23:11:33.417: E/AndroidRuntime(20255): at android.widget.AdapterView.performItemClick(AdapterView.java:284) 02-05 23:11:33.417: E/AndroidRuntime(20255): at android.widget.ListView.performItemClick(ListView.java:3513) 02-05 23:11:33.417: E/AndroidRuntime(20255): at android.widget.AbsListView$PerformClick.run(AbsListView.java:1812) 02-05 23:11:33.417: E/AndroidRuntime(20255): at android.os.Handler.handleCallback(Handler.java:587) 02-05 23:11:33.417: E/AndroidRuntime(20255): at android.os.Handler.dispatchMessage(Handler.java:92) 02-05 23:11:33.417: E/AndroidRuntime(20255): at android.os.Looper.loop(Looper.java:130) 02-05 23:11:33.417: E/AndroidRuntime(20255): at android.app.ActivityThread.main(ActivityThread.java:3683) 02-05 23:11:33.417: E/AndroidRuntime(20255): at java.lang.reflect.Method.invokeNative(Native Method) 02-05 23:11:33.417: E/AndroidRuntime(20255): at java.lang.reflect.Method.invoke(Method.java:507) 02-05 23:11:33.417: E/AndroidRuntime(20255): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 02-05 23:11:33.417: E/AndroidRuntime(20255): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 02-05 23:11:33.417: E/AndroidRuntime(20255): at dalvik.system.NativeStart.main(Native Method)
正如您所看到的,该异常并未直接触及我的任何代码。我不想在清单中添加缺少的权限(我不知道选择器中会显示哪些其他应用程序),而只需处理SecurityException
并通知用户。我会在哪里这样做?
在这种情况下,我使用的是Android 2.3.6。
提前致谢!
答案 0 :(得分:4)
但是,有一些应用程序,如果用户选择,会使SecurityException崩溃应用程序,因为当前应用程序没有足够的权限来发送意图
这是其他应用中的错误。任何应用都不应支持Intent
等通用ACTION_SEND
操作,并且需要自定义权限。我真的建议你写下来并发布到http://b.android.com,并提供其他任何信息来重现此错误。我不确定你遇到的是什么应用程序(软件包建议可能是Gmail),但它显然是谷歌生产的应用程序。
我不想在清单中添加缺少的权限(我不知道选择器中会显示哪些其他应用程序)
更不用说相关权限不在SDK中。
但只是处理SecurityException并通知用户。我会在哪里这样做?
关键问题是:您的流程中是否实际发生此异常?
如果答案是肯定的,那么Thread
和setDefaultUncaughtExceptionHandler()
将是您发现问题的地方。您可能已经使用它来绑定崩溃记者(例如,ACRA)。
如果答案是否定的,那么你就不走运了。