Подтвердить что ты не робот

Вход в файл на 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...

4b9b3361

Ответ 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();
}

Ответ 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());