我们现在正在和几个朋友一起测试我们的应用程序。有时有些错误不会引发异常。所以我真的不知道问题是什么。所以我认为实现一个允许将 logcat 输出发送到电子邮件地址的菜单项是一个好主意,这样我们就可以检查日志。
不幸的是,我在互联网上没有找到如何从手机中提取 logcat 的提示。如何发送电子邮件应该不是问题。
查看android-log-collector,因为它会执行您正在尝试做的事情。
从 Android 4.1 开始,无法收集任意 LogCat 数据。从来没有记录和支持的方式来做到这一点,并且未记录/不受支持的方式被锁定在 Jelly Bean中。对于您自己的崩溃,最好使用崩溃日志库,如ACRA。
我还会研究 Flurry ( flurry.com ),它不仅为您提供一般分析,还允许您记录任意信息并为您记录未捕获的异常。我在 5 分钟内完成了设置,但要记住的一件事是它不像电子邮件警报那样是实时的。您必须等待几个小时才能让您在应用程序中登录的内容显示在他们的仪表板上。如果您有一个非常轻量级的应用程序,这也可能是矫枉过正,但我注意到我的应用程序没有因使用该服务而导致性能损失。
我发现LogCollector确实非常有用(来自 CommonsWare 的提示):
并且不要忘记在您自己的应用程序中设置:
<uses-permission android:name="android.permission.READ_LOGS" />
我绝对建议在这里也看看这个项目
此解决方案不发送电子邮件,而是通过 UDP 将其发送到服务器。
https://github.com/Chemik/logcatudp
源代码可用。它可以很容易地嵌入到我们自己的应用程序中。我没有尝试这样做。
在您的清单文件中提供以下权限:
<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;
}
感谢您 2,但通过浏览 android-log-collector 论坛,我找到了一个更易于处理的解决方案:
在那里,您可以在服务器的某个位置存储一个 php 文件(或者,如果您不想使用自己的服务器,他们的服务器上也有一个脚本)。在这个 php 文件中,您可以定义当 post 消息到达服务器时应该做什么。我刚刚定义了一个非常简单的代码,它将数据转发到我的邮件地址。
这仅在抛出未捕获的异常时才有效。但是可以扩展默认的未捕获异常处理程序,这样不仅可以获得堆栈跟踪,还可以获得 logcat。