Cómo manejar SecurityException lanzado de startActivity con el selector?

Estoy usando

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 

Como se indica en ¿Cómo puedo enviar mensajes de correo electrónico desde mi aplicación de Android?

Sin embargo, hay algunas aplicaciones, si son elegidas por el usuario, que bloquearán la aplicación con una SecurityException , ya que la aplicación actual no tiene suficientes privilegios para enviar la intención:

 02-05 23: 11: 33.417: E / AndroidRuntime (20255): java.lang.SecurityException: Denegación de permisos: Intención inicial {typ = text / plain flg = 0x3000000 cmp = com.google.android.gm / .AutoSendActivity Extras)} de ProcessRecord {4084ca60 20255: com.example.myapp / 10065} (pid = 20255, uid = 10065) requiere com.google.android.gm.permission.AUTO_SEND
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en android.os.Parcel.readException (Parcel.java:1322)
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en android.os.Parcel.readException (Parcel.java:1276)
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en android.app.ActivityManagerProxy.startActivity (ActivityManagerNative.java:1351)
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en android.app.Instrumentation.execStartActivity (Instrumentation.java:1374)
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en android.app.Activity.startActivityForResult (Activity.java:2827)
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en android.app.Activity.startActivity (Activity.java:2933)
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en com.android.internal.app.ResolverActivity.onIntentSelected (ResolverActivity.java:203)
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en com.android.internal.app.ResolverActivity.onClick (ResolverActivity.java:117)
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en com.android.internal.app.AlertController $ AlertParams $ 3.onItemClick (AlertController.java:873)
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en android.widget.AdapterView.performItemClick (AdapterView.java:284)
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en android.widget.ListView.performItemClick (ListView.java:3513)
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en android.widget.AbsListView $ PerformClick.run (AbsListView.java:1812)
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en android.os.Handler.handleCallback (Handler.java:587)
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en android.os.Handler.dispatchMessage (Handler.java:92)
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en android.os.Looper.loop (Looper.java:130)
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en android.app.ActivityThread.main (ActivityThread.java:3683)
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en java.lang.reflect.Method.invokeNative (Método nativo)
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en java.lang.reflect.Method.invoke (Method.java:507)
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:839)
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en com.android.internal.os.ZygoteInit.main (ZygoteInit.java:597)
 02-05 23: 11: 33.417: E / AndroidRuntime (20255): en dalvik.system.NativeStart.main (Método nativo)

Como puedes ver, la excepción no está tocando ninguno de mi código directamente. No quiero añadir el permiso faltante al manifiesto (no sé qué otras aplicaciones aparecerán en el selector), sino simplemente manejar la excepción de SecurityException y notificar al usuario. ¿Dónde lo haría?

Estoy en Android 2.3.6 en este caso.

¡Gracias por adelantado!

Sin embargo, hay algunas aplicaciones, si son elegidas por el usuario, que se bloqueará la aplicación con un SecurityException, ya que la aplicación actual no tiene suficientes privilegios para enviar la intención

Eso es un error en la otra aplicación. Ninguna aplicación debe admitir una acción de Intent genérica como ACTION_SEND y requiere un permiso personalizado. Te recomiendo que escribas esto y lo publiques en http://b.android.com , con cualquier otra información que puedas proporcionar para reproducir este error. No estoy seguro de qué aplicación se encontró (el paquete sugiere quizá Gmail), pero es claramente una aplicación producida por Google.

No quiero agregar el permiso faltante al manifiesto (no sé qué otras aplicaciones aparecerán en el selector)

Sin mencionar que el permiso en cuestión no está en el SDK.

Pero simplemente maneje el SecurityException y notifique al usuario. ¿Dónde lo haría?

La pregunta clave es: ¿esta excepción realmente ocurre en su proceso?

Si la respuesta es afirmativa, entonces Thread y setDefaultUncaughtExceptionHandler() serán el lugar donde se encuentra el problema. Es posible que ya esté usando esto para empatar en un reportero de accidente (por ejemplo, ACRA).

Si la respuesta es no, entonces usted está fuera de suerte.

  • Protección de contraseña de Android Keystore
  • Cifrado del dispositivo Android ICS
  • ¿Cómo guarda de forma segura una orden en la nube, si no puede verificar el pago desde la nube?
  • Calcular SHA256 Hash en Android / Java y C #
  • ¿Qué protege las contraseñas de AccountManager de Android de ser leídas por otras aplicaciones?
  • Instalación / Acceso a Certs para VPN / WIFI mediante programación en Android
  • Leyendo ActivityManager-logs en un dispositivo de Jelly Bean?
  • ¿Cuál es la mejor manera de ocultar la contraseña de keystore en Android?
  • Cómo proteger url webservice en el archivo android apk
  • Uso de un certificado autofirmado para crear una conexión cliente-servidor segura en android
  • Comprobación de que el mensaje provenía de un punto específico de aplicación / punto final
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.