我们正在和一些朋友一起测试我们的应用程序。有时会出现一些不会引发异常的错误。所以我真的不知道问题是什么。所以我认为实现一个允许将logcat输出发送到电子邮件地址的菜单项是个好主意,这样我们就可以检查日志了。
不幸的是,我没有在互联网上找到如何从手机中提取logcat的提示。如何发送电子邮件应该不是问题。
答案 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。