Вход в файл на Android - PullRequest
       41

Вход в файл на Android

26 голосов
/ 22 января 2010

Есть ли способ получить сообщения журнала с телефона Android.

Я создаю приложение, которое использует GPS моего HTC Hero. Я могу запустить и отладить приложение из Eclipse, но это не очень хороший вариант использования GPS, сел за мой стол.

Когда я запускаю приложение, когда я иду, я получаю прерывистое исключение. Можно ли в любом случае вывести эти исключения в текстовый файл на SD-карте или вывести вызовы на Log.x("") в текстовый файл, чтобы я мог видеть, что такое исключение.

Спасибо

РЕДАКТИРОВАТЬ: Решение

Вот код, с которым я наконец-то пошел ...

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 ...

Ответы [ 6 ]

18 голосов
/ 22 января 2010

Вы можете использовать Thread.setUncaughtExceptionHandler(), чтобы перехватить исключения.

Запись на SD-карту так же проста, как и поиск каталога для карты с помощью Environment.getExternalStorageDirectory() и создание там файла.

File f = new File(Environment.getExternalStorageDirectory(),filename);

Вам необходимо дать приложению правильное разрешение на запись на SD-карту, добавив его в свой манифест:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
6 голосов
/ 24 декабря 2011

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();
}
5 голосов
/ 20 мая 2010

Вы можете взглянуть на microlog4android. У них есть готовое решение для входа в файл.

https://github.com/johanlkarlsson/microlog4android

4 голосов
/ 29 ноября 2014

Использование slf4-android lib, созданное BrightInventions . Это простая реализация slf4j api с использованием android java.util.logging. *.

Особенности:

  • вход в файл из коробки
  • вход в любой другой пункт назначения LoggerConfiguration.configuration().addHandlerToLogger
  • встряхните устройство, чтобы отправлять журналы со скриншотом по электронной почте
  • действительно маленький, он занимает всего ~ 55kB

slf4android поддерживается в основном @miensol.

Узнайте больше о slf4android в нашем блоге:

4 голосов
/ 18 января 2013

Я попробовал оба варианта выше (microlog4android & android-logging-log4j), и они пытались заставить работать Как только они скомпилированы нормально, я получу java.lang.NoClassDefFoundError во время выполнения.

Итак, я наткнулся на logback-android ... также можно найти здесь http://logback.qos.ch/

У него намного лучшие инструкции, и я заработал за пару часов.

Похоже, это лучшее решение для ведения журнала для Android.

1 голос
/ 15 февраля 2013

Основываясь на решении @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();
                            }
                        }
                    });
        }

    }

}

Назовите его из любой темы, как это,

            UnhandledExceptionHandler.setUndhandledException(Thread.currentThread());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...