android 异常打印
Log.e注意问题:
"find bar"字符串中间有空格,所有搜索不到,但是用下划线连接起来,过滤日志时就能搜到。
Log.e("find bar",points[0].toString());
package com.lbstock;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.Thread.UncaughtExceptionHandler;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map; import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Build;
import android.os.Environment;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast; /** * UncaughtException处理类,当程序发生Uncaught异常的时候,由该类来接管程序,并记录发送错误报告.* @author way*/
public class CrashHandler implements UncaughtExceptionHandler { private static final String TAG = "CrashHandler"; private Thread.UncaughtExceptionHandler mDefaultHandler;// 系统默认的UncaughtException处理类 private static CrashHandler INSTANCE = new CrashHandler();// CrashHandler实例 private Context mContext;// 程序的Context对象 private Map<String, String> info = new HashMap<String, String>();// 用来存储设备信息和异常信息 private SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd-HH-mm-ss");// 用于格式化日期,作为日志文件名的一部分 /** 保证只有一个CrashHandler实例 */ private CrashHandler() { } /** 获取CrashHandler实例 ,单例模式 */ public static CrashHandler getInstance() { return INSTANCE; } public void init(Context context) {mContext = context; mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();// 获取系统默认的UncaughtException处理器 Thread.setDefaultUncaughtExceptionHandler(this);// 设置该CrashHandler为程序的默认处理器 } /** * 当UncaughtException发生时会转入该重写的方法来处理 */ public void uncaughtException(Thread thread, Throwable ex) { if (!handleException(ex) && mDefaultHandler != null) { // 如果自定义的没有处理则让系统默认的异常处理器来处理 mDefaultHandler.uncaughtException(thread, ex); } else { try { Thread.sleep(3000);// 如果处理了,让程序继续运行3秒再退出,保证文件保存并上传到服务器 } catch (InterruptedException e) { e.printStackTrace(); } // 退出程序 android.os.Process.killProcess(android.os.Process.myPid()); System.exit(1); } } /** * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.* @param ex 异常信息* @return true 如果处理了该异常信息;否则返回false. */ public boolean handleException(Throwable ex) { if (ex == null) return false; new Thread() { public void run() { Looper.prepare();Log.e("lbsotck",String.valueOf(ex.getMessage()));Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出", Toast.LENGTH_LONG).show();Looper.loop(); } }.start(); // 收集设备参数信息 collectDeviceInfo(mContext); // 保存日志文件 saveCrashInfo2File(ex); return true; } /** * 收集设备参数信息* @param context */ public void collectDeviceInfo(Context context) { try { PackageManager pm = context.getPackageManager();// 获得包管理器 PackageInfo pi = pm.getPackageInfo(context.getPackageName(), PackageManager.GET_ACTIVITIES);// 得到该应用的信息,即主Activity if (pi != null) { String versionName = pi.versionName == null ? "null" : pi.versionName; String versionCode = pi.versionCode + ""; info.put("versionName", versionName); info.put("versionCode", versionCode); } } catch (NameNotFoundException e) { e.printStackTrace(); } Field[] fields = Build.class.getDeclaredFields();// 反射机制 for (Field field : fields) { try { field.setAccessible(true); info.put(field.getName(), field.get("").toString()); Log.d(TAG, field.getName() + ":" + field.get("")); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } private String saveCrashInfo2File(Throwable ex) { StringBuffer sb = new StringBuffer(); for (Map.Entry<String, String> entry : info.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); sb.append(key + "=" + value + "\r\n"); } Writer writer = new StringWriter(); PrintWriter pw = new PrintWriter(writer); ex.printStackTrace(pw); Throwable cause = ex.getCause(); // 循环着把所有的异常信息写入writer中 while (cause != null) { cause.printStackTrace(pw); cause = cause.getCause(); } pw.close();// 记得关闭 String result = writer.toString(); sb.append(result); // 保存文件 long timetamp = System.currentTimeMillis(); String time = format.format(new Date());// String fileName = "crash-" + time + "-" + timetamp + ".log";String fileName = "crash-" + time + ".log";if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { try { File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "1lbg");Log.i("CrashHandler", dir.toString()); if (!dir.exists()) dir.mkdir(); FileOutputStream fos = new FileOutputStream(new File(dir, fileName)); fos.write(sb.toString().getBytes()); fos.close(); return fileName; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } return null; }
}
android 异常打印相关推荐
- android 设置打印级别
https://www.csdn.net/gather_27/MtTakg4sNjY3Ni1ibG9n.html 一.LK层: 首先,在LK中,有一个对log打印级别的控制文档,其路径一般为:vend ...
- android 实现打印功能,Android通过OTG线连接打印机实现打印功能
一.创建demo调用PrinterShare服务,虽然能找到相应的类和方法但调用后没有反应 //打印图片,进入PrinterShare打印图片预览界面 public static void print ...
- Android 蓝牙打印小票与WiFi打印小票两种打印方式的实现(带有图片和二维码)
转载至: https://blog.csdn.net/u011056653/article/details/74308254 最近在做小票打印这块,项目需求是蓝牙和WiFi两种都要实现,开始做的时候也 ...
- android异常 More than one file was found with OS independent path ‘META-INF/XXX‘
android异常 More than one file was found with OS independent path 'META-INF/XXX' 参考文章: (1)android异常 Mo ...
- Android 异常: failed to connect to localhost/127.0.0.1
Android 异常: failed to connect to localhost/127.0.0.1 参考文章: (1)Android 异常: failed to connect to local ...
- traceback异常打印
traceback异常打印 参考文章: (1)traceback异常打印 (2)https://www.cnblogs.com/shangpolu/p/7206348.html (3)https:// ...
- android异常(2)
1.java.lang.IllegalStateException: The content of the adapter has changed but ListView did not recei ...
- android jni打印log信息
今天,讲讲在jni中如何打印logxx,用来进行调试. 一.实现 1.修改Android.mk文件. 在这个配置文件中我们加入如下一行代码: LOCAL_LDLIBS += -llog 注意:这行代码 ...
- android 打印机列表中,在android中打印只搜索打印机
我已经做了一个android应用程序,我试图打印一个示例文本文件,我想使用wifi连接打印机,我试过这个链接Wifi printing in android但它只是去搜索wifi打印机和什么都不做,我 ...
最新文章
- node.js学习5--------------------- 返回html内容给浏览器
- 分享Kali Linux 2017年第29周镜像文件
- 故障排错-解决迅雷播放器在Windows 10中长时间停止响应
- OpenCASCADE:绘制测试线束之入门
- service 层 拼接的html 代码如何直接返回_代码分层的设计之道
- (转)HttpURLConnection与 HttpClient 区别
- eclipse maven scm
- Visual Studio “类视图”和“对象浏览器”图标
- Leetcode 142. Linked List Cycle II
- Give root password for maintenance 问题的解决方法
- RESTful源码笔记之RESTful Framework的基本组件
- VS2005发布网站问题及aspnet_merge.exe”已退出,代码为 1的错误以及所有代码文件生成一个dll
- 单片机ADC0808,DAC0832信号发生器
- 【操作系统真象还原】Mac安装配置bochs
- plc c语言做报警,wincc声音报警C脚本版
- vscode中文注释斜体修改
- 更换主板后 Office无法激活问题解决
- 深度学习笔记——情感分析
- 如何有效管理游戏开发过程
- Linux 命令xxd输出十六进制
热门文章
- c语言变量值与数组元素值交换,编写一个交换变量值的函数,利用该函数交换数组a和数组b中的对应元素值。要求尽量用指针的方法实现。数组a...
- android asmack和xmpp的关系,Android即时通讯开发之XMPP (一)初识XMPP协议和asmack
- java 本地通信_java – 本地JVM之间的通信
- mysql 随机选择数据_从MySQL随机选取数据
- php中post提交参数_PHP中Http协议post请求参数
- 31 号要和谁跨年呢?
- 每日一皮:临近截止日期, 产品经理就这样看着我...
- 自律到极致-人生才精致「第3期」:中奖结果
- linux图形化卡在开机界面,linux怎么在开机时进入图形界面
- python 画roc曲线