将应用程序的Logcat输出发送到电子邮件地址

时间:2010-05-17 19:38:21

标签: android logcat

我们正在和一些朋友一起测试我们的应用程序。有时会出现一些不会引发异常的错误。所以我真的不知道问题是什么。所以我认为实现一个允许将logcat输出发送到电子邮件地址的菜单项是个好主意,这样我们就可以检查日志了。

不幸的是,我没有在互联网上找到如何从手机中提取logcat的提示。如何发送电子邮件应该不是问题。

7 个答案:

答案 0 :(得分:15)

看看android-log-collector,就像你要做的那样。

从Android 4.1开始,无法收集任意LogCat数据。从来没有一种记录和支持的方式,以及未记录/不支持的方式was locked down in Jelly Bean。对于您自己的崩溃,使用崩溃日志记录库(例如ACRA)可以更好地提供服务。

答案 1 :(得分:7)

我还会研究Flurry(flurry.com),它不仅可以为您提供常规分析,还允许您记录任意信息,并为您记录未捕获的异常。我在5分钟内完成了设置,但有一点要记住,它不像电子邮件警报那样是实时的。您必须等待几个小时才能登录您的应用以显示在其信息中心上。如果你有一个非常轻量级的应用程序,它也可能有点过分,但我注意到由于使用该服务,我的应用程序没有性能损失。

答案 2 :(得分:6)

我发现LogCollector非常有用(来自CommonsWare的提示):

不要忘记在自己的应用程序中设置:

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

答案 3 :(得分:3)

我绝对建议您同时查看此项目here

答案 4 :(得分:1)

此解决方案不会发送电子邮件,但会通过UDP将其发送到服务器。

https://github.com/Chemik/logcatudp

源代码可用。它可以很容易地嵌入我们自己的应用程序中。我还没有尝试过这样做。

答案 5 :(得分:1)

在您的清单文件中,授予以下权限:

<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;
}

答案 6 :(得分:0)

感谢你2但是通过浏览android-log-collector论坛我找到了一个更容易处理的solution

在那里你可以在服务器的某个地方存储一个php文件(或者如果你不想使用你自己的服务器,他们的服务器上也有一个脚本)。在这个php文件中,您可以定义发布消息到达服务器时应该执行的操作。我只是定义了一个非常简单的代码,它将数据转发给我的邮件地址。

这仅在抛出未捕获的异常时才有效。但是可以扩展默认的未捕获异常处理程序,这样它不仅可以获得堆栈跟踪而且还可以获取logcat。