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?
- Comprobar si el sistema de archivos Android está encriptado
- Android obfuscation código y la aplicación segura de Android de la piratería
- Autenticar la aplicación HTML5 envuelta con Phonegap (o equivalente)
- Construcción de BoringSSL y Conscrypt y agrupación con Android apk
- Uso de Android Fingerprint API para comprobar si se ha agregado una nueva huella digital
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!
- Prevención de piratería de Android con solicitudes de servidor
- Seguridad de la carpeta de Android
- ¿Cómo se puede comprobar el permiso en tiempo de ejecución sin lanzar SecurityException?
- Enigma de encriptación
- ¿Cómo funciona la autenticación de WhatsApp?
- Android - Almacenamiento de datos confidenciales en la base de datos sqlite
- SecurityException - Nombre del paquete de llamadas desconocido -Android 6.0.1
- Autenticación de Facebook para el servicio JSON con la aplicación Android
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.
- ¿Cómo encontrar Fragmento que fue cambiado dinámicamente?
- Android: Spinners dentro de un ListView pierden sus valores cuando agrego dinámicamente nuevas entradas ListView