Вход в файл на Android
Есть ли способ получить сообщения журнала с телефона Android.
Я создаю приложение, которое использует GPS моего HTC Hero. Я могу запускать и отлаживать приложение из eclipse, но это плохой вариант использования GPS, он сидел за моим столом.
Когда я запускаю приложение, когда иду, я получаю прерывистое исключение. Есть ли в любом случае я могу вывести эти исключения в текстовый файл на SD-карте или вывести вызовы на Log.x("")
в текстовый файл, чтобы я мог видеть, что такое исключение.
Спасибо
EDIT: решение
Вот код, который я, наконец, пошел с...
Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
PrintWriter pw;
try {
pw = new PrintWriter(
new FileWriter(Environment.getExternalStorageDirectory()+"/rt.log", true));
ex.printStackTrace(pw);
pw.flush();
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
Мне пришлось обернуть строку
pw = new PrintWriter(new FileWriter(Environment.getExternalStorageDirectory()+"/rt.log", true));
в try/catch, поскольку Eclipse не позволит мне скомпилировать приложение. Он продолжал говорить
Unhandled exception type IOException
1 quick fix
Sorround with try/catch
Итак, я сделал, и все это работает отлично, но это заставляет меня задаться вопросом, что такое Eclipse...
Ответы
Ответ 1
Вы можете использовать Thread.setUncaughtExceptionHandler()
, чтобы поймать Исключения.
Запись на SD-карту так же просто, как получение каталога для карты с помощью Environment.getExternalStorageDirectory()
и создание там файла.
File f = new File(Environment.getExternalStorageDirectory(),filename);
Вам необходимо предоставить правильное разрешение на запись на SD-карту, добавив это в свой манифест:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Ответ 2
Log4j или slf4j также могут использоваться в качестве фреймворков регистрации в Android вместе с logcat. См. Проект android-logging-log4j. Настройка ведения журнала на (вращающийся) файл очень проста.
static {
final LogConfigurator logConfigurator = new LogConfigurator();
logConfigurator.setFileName(Environment.getExternalStorageDirectory() + "myapp.log");
logConfigurator.setRootLevel(Level.DEBUG);
// Set log level of a specific logger
logConfigurator.setLevel("org.apache", Level.ERROR);
logConfigurator.configure();
}
Ответ 3
Вы можете взглянуть на microlog4android. У них есть решение, готовое к регистрации в файл.
https://github.com/johanlkarlsson/microlog4android
Ответ 4
Я попробовал оба варианта выше (microlog4android и android-logging-log4j), и они были борьбой за попытку работать. Как только они скомпилированы, я получаю Runtime java.lang.NoClassDefFoundError.
Итак, я наткнулся на logback-android
... также найдено здесь http://logback.qos.ch/
У этого есть намного лучшие инструкции, и я получил его, работая через пару часов.
Это, по-видимому, лучшее решение для ведения журналов для Android.
Ответ 5
Используйте slf4-android lib, созданный BrightInventions. Это простая реализация slf4j api с помощью android java.util.logging. *.
Особенности:
- запись в файл из коробки
- запись в любой другой пункт назначения
LoggerConfiguration.configuration().addHandlerToLogger
- встряхните свое устройство, чтобы отправлять журналы со снимком экрана по электронной почте
- действительно маленький, он взял только ~ 55kB
slf4android поддерживается главным образом @miensol.
Подробнее о slf4android в нашем блоге:
Ответ 6
На основании решения @Greg B и вопроса @JPM в комментарии я сделал этот статический метод в отдельном классе и каждый раз, когда вы запускаете новый поток, вызывайте его.
пакет com.stackoverflow.
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import android.os.Environment;
public class UnhandledExceptionHandler {
public static void setUndhandledException(Thread thread) {
if (thread.getUncaughtExceptionHandler() == null) {
Thread.currentThread().setUncaughtExceptionHandler(
new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread,
Throwable ex) {
PrintWriter pw;
try {
pw = new PrintWriter(new FileWriter(Environment
.getExternalStorageDirectory()
+ "/rt-networkandgps"
+ "/gpx/"
+ thread.getId() + ".log", true));
ex.printStackTrace(pw);
pw.flush();
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
}
Вызовите его из anythread, как это,
UnhandledExceptionHandler.setUndhandledException(Thread.currentThread());