Отправить вывод Logcat приложения на адрес электронной почты - PullRequest
19 голосов
/ 17 мая 2010

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

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

Ответы [ 7 ]

15 голосов
/ 18 мая 2010

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

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

7 голосов
/ 18 мая 2010

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

6 голосов
/ 01 апреля 2011

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

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

<uses-permission android:name="android.permission.READ_LOGS" />
3 голосов
/ 05 августа 2010

Я бы определенно рекомендовал посмотреть также этот проект здесь

1 голос
/ 08 августа 2017

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

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

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

super.onCreate(savedInstanceState);

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

        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[] = {"yourEmailAddress@gmail.com"};
            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;
}
1 голос
/ 01 октября 2014

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

https://github.com/Chemik/logcatudp

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

0 голосов
/ 18 мая 2010

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

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

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

...