play license google developer android error-handling crash-reports uncaught-exception

license - Actividad de gestión e informe de errores globales de Android



google developer license (2)

Al implementar ACRA , nunca he podido iniciar una nueva actividad después de recibir una excepción no detectada. Parece que el sistema cambia todo el proceso a un estado especial que le impide permitir cualquier recurso nuevo.

La única opción que he encontrado por el momento es enviar una notificación de la barra de estado que guarda el sistema después de reiniciar la aplicación. La notificación activa una intención para una actividad de diálogo cuando el usuario la selecciona.

Alexey Yakovlev estudió con mucho más detalle este problema y llegó a la conclusión de que podría haber una posibilidad de desencadenar una nueva actividad cuando el bloqueo se produce en un hilo que no es el hilo de la interfaz de usuario. Aunque no encontramos una solución bastante simple para comenzar directamente una actividad en todos los casos.

Me deshice del cuadro de diálogo de cierre de fuerza predeterminado matando el proceso por mí mismo sin invocar el controlador de excepciones no detectadas predeterminado original.

¿Hay alguna manera de registrar un controlador de error global que evitará que la aplicación se cuelgue? Los informes de bloqueo se describen aquí: ¿Cómo obtengo los datos de bloqueo de mi aplicación de Android? . Un pensamiento que tuve fue extender estas soluciones para que tuvieran en cuenta el contexto de la aplicación para poder redirigirlas a una determinada actividad de informes. ¿Pero no estoy seguro de si el contexto de la aplicación es válido en este punto una vez que hay un fallo para informar?

Pero, ¿cómo se puede redirigir al usuario a un mensaje de error global Actividad cuando se produce un bloqueo? ¿Hay alguna forma de alto nivel para registrar un controlador de errores que capture todos los errores y evite un bloqueo? ¿Hay alguna manera de registrar dicho manejador para que prevenga o sobreviva un bloqueo y luego redireccione al usuario a una actividad particular que mostrará el mensaje de error en cuestión?

Aquí está mi modificación al controlador de errores:

1) Simplemente pase applicationContext al constructor como ctx

2) agregue el reportError(stackTrace) para transferir el control a la página de mensaje de error

private void reportError(String stackTrace){ Intent i = new Intent(ctx, DisplayErrorActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.setAction("DISPLAY_ERROR_ACTIVITY"); Bundle b = new Bundle(); b.putString("STACKTRACE", stackTrace); i.putExtras(b); try{ Log.d("MyErrorHandler","reportError ctx="+ctx); ctx.startActivity(i); } catch (Exception e) { Exception ex = e; e.printStackTrace(); } }

Y llame a reportError continuación:

public void uncaughtException(Thread t, Throwable e) { Log.d("MyUncoughtExceptionHandler", "uncoughtException ctx="+ctx); String timestamp=getDateTime(); final Writer result = new StringWriter(); final PrintWriter printWriter = new PrintWriter(result); e.printStackTrace(printWriter); String stacktrace = result.toString(); printWriter.close(); String filename = timestamp + ".stacktrace"; Log.d("MyexceptionHanlder","UncoughtException: "+stacktrace); if (localPath != null) { writeToFile(stacktrace, filename); } if (url != null) { sendToServer(stacktrace, filename); } reportError(stacktrace); // defaultUEH.uncaughtException(t, e); }

Si dejo el valor defaultUEH , aparece el cuadro de diálogo de bloqueo habitual. Sin él - pantalla en blanco. Log indica que ErrorMessageActivity se cierra ErrorMessageActivity junto con el proceso.

Para probar, simplemente pongo la división por cero en el método de creación de la actividad principal justo después de registrar el controlador de errores con el hilo. Si tuviera un bloque try-catch sobre esto, no se bloquearía, pero el controlador global de errores no parece prevenir el bloqueo. Comprobado ctx y parece válido en un depurador.