ОБНОВЛЕНИЕ: см. "принятое" решение ниже
Когда мое приложение создает необработанное исключение, а не просто завершает работу, я хотел бы сначала дать пользователю возможность отправить файл журнала. Я понимаю, что делать больше работы после получения случайного исключения является рискованным, но, эй, худшее, что приложение заканчивает сбой, и файл журнала не отправляется. Это оказалось сложнее, чем я ожидал:)
Что работает: (1) захват неперехваченного исключения, (2) извлечение информации журнала и запись в файл.
Что еще не работает: (3) начало действия для отправки электронной почты. В конечном счете, у меня будет еще одно действие, чтобы спросить у пользователя разрешение. Если я получаю работу по электронной почте, я не ожидаю больших проблем для другого.
Суть проблемы в том, что необработанное исключение попадает в мой класс Application. Поскольку это не активность, не очевидно, как начать работу с Intent.ACTION_SEND. То есть, как правило, для запуска активности вызывается startActivity и возобновляется с onActivityResult. Эти методы поддерживаются Activity, но не Application.
Любые предложения о том, как это сделать?
Вот несколько сокращений кода в качестве руководства по началу работы:
public class MyApplication extends Application
{
defaultUncaughtHandler = Thread.getDefaultUncaughtExceptionHandler();
public void onCreate ()
{
Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException (Thread thread, Throwable e)
{
handleUncaughtException (thread, e);
}
});
}
private void handleUncaughtException (Thread thread, Throwable e)
{
String fullFileName = extractLogToFile(); // code not shown
// The following shows what I'd like, though it won't work like this.
Intent intent = new Intent (Intent.ACTION_SEND);
intent.setType ("plain/text");
intent.putExtra (Intent.EXTRA_EMAIL, new String[] {"[email protected]"});
intent.putExtra (Intent.EXTRA_SUBJECT, "log file");
intent.putExtra (Intent.EXTRA_STREAM, Uri.parse ("file://" + fullFileName));
startActivityForResult (intent, ACTIVITY_REQUEST_SEND_LOG);
}
public void onActivityResult (int requestCode, int resultCode, Intent data)
{
if (requestCode == ACTIVITY_REQUEST_SEND_LOG)
System.exit(1);
}
}