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

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

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


person RoflcoptrException    schedule 17.05.2010    source источник


Ответы (7)


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

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

person CommonsWare    schedule 17.05.2010
comment
хм спасибо. поэтому мне нужно добавить источник в свой проект или установить приложение на телефон. правильно? - person RoflcoptrException; 18.05.2010
comment
Вы должны спросить их, так как я не использовал их вещи. Как минимум, вы можете посмотреть их исходный код, чтобы увидеть, как они читают журналы. - person CommonsWare; 18.05.2010
comment
хм, да, я прочитал на странице, что разработчики могут его использовать, но документации нет, и я не знаю, как его запустить. но спасибо - person RoflcoptrException; 18.05.2010
comment
Разрешение READ_LOGS не поддерживается для сторонних приложений, начиная с уровня API 16 (4.1). Цитируя разработчика: приложения для Android могут читать только свои собственные записи в журнале, поэтому это приложение не будет работать на Android 4.1 и выше. - person tos; 09.11.2013

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

person Brandon O'Rourke    schedule 17.05.2010

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

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

<uses-permission android:name="android.permission.READ_LOGS" />
person Ronnie    schedule 31.03.2011
comment
LogCollector, кажется, регистрирует какой-то мусор, а не журнал моего приложения. Ни одной линии. - person djdance; 28.08.2014
comment
LogCollector кажется мертвым. Без активности с 2012 года. - person david.perez; 01.10.2014

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

person Juri    schedule 05.08.2010

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

https://github.com/Chemik/logcatudp

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

person david.perez    schedule 01.10.2014
comment
Источники Logcat для UDP перемещены на github.com/Chemik/logcatudp . Приложение BTW может отправлять журнал по электронной почте или делиться им с помощью любого другого установленного приложения. - person Chemik; 14.03.2015

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

<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;
}
person Danger    schedule 08.08.2017

Спасибо вам 2, но, просматривая форум android-log-collector, я нашел решение, которое еще проще ручка:

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

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

person Community    schedule 18.05.2010
comment
Эта ссылка не работает, вы можете обновить ее или опубликовать исходный код? - person gobernador; 07.03.2012
comment
Да, он сломан, и я не могу найти новый. Но, как вы, возможно, видели, ответу почти 2 года. - person ; 07.03.2012
comment
Это старая ссылка. Я исследовал и пытался сделать именно это, и мне просто интересно, знаете ли вы, где это находится. Неважно, я попробую другой ответ. - person gobernador; 07.03.2012