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

Отправить вывод Logcat приложения в адрес электронной почты

Теперь мы тестируем наше приложение несколькими друзьями. Иногда возникают некоторые ошибки, которые не вызывают исключения. Поэтому я действительно не знаю, в чем проблема. Поэтому я подумал, что было бы неплохо реализовать элемент меню, который позволяет отправлять вывод logcat на адрес электронной почты, чтобы мы могли проверить журнал.

К сожалению, я не нашел подсказки в Интернете о том, как извлечь лог-код с телефона. Как отправить электронное письмо не должно быть проблемой.

4b9b3361

Ответ 1

Посмотрите android-log-collector, поскольку он делает то, что вы пытаетесь сделать.

Невозможно собрать произвольные данные LogCat с Android 4.1. Никогда не было документированного и поддерживаемого способа сделать это, а недокументированный/неподдерживаемый способ был заблокирован в желе Bean. Для ваших собственных сбоев вам лучше использовать библиотеку журналов сбоев, например ACRA.

Ответ 2

Я также рассмотрю Flurry (flurry.com), который не только дает вам общую аналитику, но и позволяет записывать произвольную информацию, а также журналы неискушенные исключения для вас. Я установил его буквально через 5 минут, но нужно иметь в виду, что это не в режиме реального времени, как уведомление по электронной почте. Вам нужно будет подождать несколько часов за то, что вы входите в приложение, чтобы появиться на панели управления. Это также может быть излишним, если у вас действительно легкое приложение, но я не заметил потери производительности в своем приложении в результате использования службы.

Ответ 3

Я нашел LogCollector очень полезным (отзыв от CommonsWare):

И не забудьте указать в своем приложении:

<uses-permission android:name="android.permission.READ_LOGS" />

Ответ 4

Я определенно рекомендую посмотреть также на этот проект здесь

Ответ 5

Это решение не отправляет электронное письмо, а отправляет его на сервер через UDP.

https://github.com/Chemik/logcatudp

Исходный код доступен. Его можно легко встроить в наше приложение. Я не пытался это сделать.

Ответ 6

В вашем файле манифеста дайте следующие разрешения:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

В вашей первой активности/запусках, сразу после

super.onCreate(savedInstanceState);

Запишите строки ниже: это приведет к записи вашего лог файла приложения на внешнее хранилище вашего устройства.

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, EXTERNAL_PERMISSION_CODE);
    }
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, READ_PERMISSION_CODE);
    }

    if ( isExternalStorageWritable() ) {

        File appDirectory = new File( Environment.getExternalStorageDirectory() + "/MyAppLog" );
        File logDirectory = new File( appDirectory + "/log" );
        File logFile = new File( logDirectory, "logcat" + ".txt" );

        // create app folder
        if ( !appDirectory.exists() ) {
            appDirectory.mkdir();
        }

        // create log folder
        if ( !logDirectory.exists() ) {
            logDirectory.mkdir();
        }

        // clear the previous logcat and then write the new one to the file
        if ( logFile.exists()){
            logFile.delete();
        }

        try {
            Process process = Runtime.getRuntime().exec("logcat -c");
            process = Runtime.getRuntime().exec("logcat -f " + logFile);
        } catch ( IOException e ) {
            e.printStackTrace();
        }

    } else if ( isExternalStorageReadable() ) {
        // only readable
    } else {
        // not accessible
    }

Для отправки logcat на требуемый адрес электронной почты: используйте ниже метод

public void sendLogcatMail(){

    if ( isExternalStorageWritable() ) {

        File appDirectory = new File(Environment.getExternalStorageDirectory() + "/MyAppLog");
        File logDirectory = new File(appDirectory + "/log");
        File logFile = new File(logDirectory, "logcat" + ".txt");

        if (logFile.exists()) {
            Intent emailIntent = new Intent(Intent.ACTION_SEND);
            emailIntent.setType("vnd.android.cursor.dir/email");
            String to[] = {"[email protected]"};
            emailIntent.putExtra(Intent.EXTRA_EMAIL, to);
            emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(String.valueOf(logFile.toURI())));
            emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Log files");
            emailIntent.putExtra(Intent.EXTRA_TEXT, "Send some message along");
            startActivity(Intent.createChooser(emailIntent, "Send email..."));
        }
    }
}

Метод проверки наличия или отсутствия разрешений для записи на внешнее хранилище:

/* Проверяет наличие внешнего хранилища для чтения и записи */

public static boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if ( Environment.MEDIA_MOUNTED.equals( state ) ) {
        return true;
    }
    return false;
}

Ответ 7

Спасибо вам 2, но, просмотрев форум андроид-журнала-коллекционера, я нашел решение, которое еще проще в обращении:

Там вы можете хранить файл php где-то на своем сервере (или если вы не хотите использовать свой собственный сервер, у них также есть script на своем сервере). В этом файле php вы можете определить, что должно быть сделано, когда сообщение сообщения достигнет сервера. Я просто отказался от очень простого кода, который пересылает данные на мой почтовый адрес.

Это работает только в том случае, если было выбрано неперехваченное исключение. Но можно было бы расширить обработчик исключенных исключений по умолчанию, чтобы также можно было не только получить стек, но также и logcat.