如何使用选择器处理从startActivity抛出的SecurityException?

时间:2012-02-05 22:29:53

标签: android security android-intent

我正在使用

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。

提前致谢!

1 个答案:

答案 0 :(得分:4)

  

但是,有一些应用程序,如果用户选择,会使SecurityException崩溃应用程序,因为当前应用程序没有足够的权限来发送意图

这是其他应用中的错误。任何应用都不应支持Intent 等通用ACTION_SEND操作,并且需要自定义权限。我真的建议你写下来并发布到http://b.android.com,并提供其他任何信息来重现此错误。我不确定你遇到的是什么应用程序(软件包建议可能是Gmail),但它显然是谷歌生产的应用程序。

  

我不想在清单中添加缺少的权限(我不知道选择器中会显示哪些其他应用程序)

更不用说相关权限不在SDK中。

  

但只是处理SecurityException并通知用户。我会在哪里这样做?

关键问题是:您的流程中是否实际发生此异常?

如果答案是肯定的,那么ThreadsetDefaultUncaughtExceptionHandler()将是您发现问题的地方。您可能已经使用它来绑定崩溃记者(例如,ACRA)。

如果答案是否定的,那么你就不走运了。