Android 保存崩溃日志到本地目录下
代码如下可以直接复制过去,别人的代码修改了下
package com.hly.rtxt;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Environment;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.reflect.Field;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;public class CrashHandler implements Thread.UncaughtExceptionHandler {public static final String TAG = "CrashHandler";// 系统默认的UncaughtException处理类private Thread.UncaughtExceptionHandler mDefaultHandler;// CrashHandler实例private static CrashHandler INSTANCE = new CrashHandler();// 程序的Context对象private Context mContext;// 用来存储设备信息和异常信息private Map<String, String> infos = new HashMap<String, String>();// 用于格式化日期,作为日志文件名的一部分@SuppressLint("SimpleDateFormat")private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");/** 保证只有一个CrashHandler实例 */private CrashHandler() {}/** 获取CrashHandler实例 ,单例模式 */public static CrashHandler getInstance() {return INSTANCE;}/*** 初始化** @param context*/public void init(Context context) {mContext = context;// 获取系统默认的UncaughtException处理器mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();// 设置该CrashHandler为程序的默认处理器Thread.setDefaultUncaughtExceptionHandler(this);}/*** 当UncaughtException发生时会转入该函数来处理*/@Overridepublic void uncaughtException(Thread thread, Throwable ex) {if (!handleException(ex) && mDefaultHandler != null) {// 如果用户没有处理则让系统默认的异常处理器来处理mDefaultHandler.uncaughtException(thread, ex);} else {try {Thread.sleep(3000);} catch (InterruptedException e) {Log.e(TAG, "error : ", e);}// 退出程序android.os.Process.killProcess(android.os.Process.myPid());System.exit(1);}}/*** 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.** @param ex* @return true:如果处理了该异常信息;否则返回false.*/private boolean handleException(Throwable ex) {if (ex == null) {return false;}// 使用Toast来显示异常信息new Thread() {@Overridepublic void run() {Looper.prepare();Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出.", Toast.LENGTH_LONG).show();Looper.loop();}}.start();// 收集设备参数信息collectDeviceInfo(mContext);// 保存日志文件saveCrashInfo2File(ex);return true;}/*** 收集设备参数信息** @param ctx*/public void collectDeviceInfo(Context ctx) {try {PackageManager pm = ctx.getPackageManager();PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(), PackageManager.GET_ACTIVITIES);if (pi != null) {String versionName = pi.versionName == null ? "null" : pi.versionName;String versionCode = pi.versionCode + "";infos.put("versionName", versionName);infos.put("versionCode", versionCode);}} catch (PackageManager.NameNotFoundException e) {Log.e(TAG, "an error occured when collect package info", e);}Field[] fields = Build.class.getDeclaredFields();for (Field field : fields) {try {field.setAccessible(true);infos.put(field.getName(), field.get(null).toString());Log.d(TAG, field.getName() + " : " + field.get(null));} catch (Exception e) {Log.e(TAG, "an error occured when collect crash info", e);}}}/*** 保存错误信息到文件中** @param ex* @return 返回文件名称,便于将文件传送到服务器*/private String saveCrashInfo2File(Throwable ex) {StringBuffer sb = new StringBuffer();for (Map.Entry<String, String> entry : infos.entrySet()) {String key = entry.getKey();String value = entry.getValue();sb.append(key + "=" + value + "\n");}Writer writer = new StringWriter();PrintWriter printWriter = new PrintWriter(writer);ex.printStackTrace(printWriter);Throwable cause = ex.getCause();while (cause != null) {cause.printStackTrace(printWriter);cause = cause.getCause();}printWriter.close();String result = writer.toString();sb.append(result);try {long timestamp = System.currentTimeMillis();String time = formatter.format(new Date());String fileName = "crash-" + time + "-" + timestamp + ".log";String mPath = mContext.getExternalCacheDir().getPath();String path = mPath+"/"+fileName;File dir = new File(path);if (!dir.exists()) {dir.createNewFile();}FileOutputStream fos = new FileOutputStream(path + fileName);fos.write(sb.toString().getBytes());fos.close();return fileName;} catch (Exception e) {Log.e(TAG, "an error occured while writing file...", e);}return null;}}
然后在Application 里面填写如下
public class BaseApplication extends Application{@Overridepublic void onCreate() {super.onCreate();CrashHandler.getInstance().init(getApplicationContext());}}
查看的地方在Android 然后是自己的报名 里面然后 然后点击找到log 即可查看。。。。。。。。
Android 保存崩溃日志到本地目录下相关推荐
- Android之用UncaughtExceptionHandler实现保存崩溃日志到sdcard目录下的文件夹
1.异常和UncaughtExceptionHandler的介绍 1).Java异常处理机制中: 如果抛出的是Exception异常的话,需要有try catch进行处理,属于可以捕获exceptio ...
- android开发之应用Crash自动抓取Log_自动保存崩溃日志到本地
应用发生crash之后要查看log,判断问题出在什么地方,可是一旦应用发布出去,就要想办法把用户的崩溃日志拿到分析. 所以要在发生crash之后抓取log,然后上传到服务器,方便开发者查看,现在都有很 ...
- Android 异常崩溃日志,捕捉并保存到本地
Android 异常崩溃日志,捕捉并保存到本地: 前几天因为在省公安厅做一个通讯类之类的应用:碰到个问题,就是download人员信息将信息保存到本地数据库完成的时候,菊花转还没有dismission ...
- android studio 抓log,Android studio保存logcat日志到本地的操作
windows环境下 1.输出logcat日志到本地文件 adb logcat -> F:/logcat.txt 2.输出带时间的logcat日志到本地文件: adb logcat -v thr ...
- Android捕捉崩溃日志并输出日志文件
Android捕捉崩溃日志并输出日志文件 当程序与运行时发生崩溃,可以捕捉到当前崩溃的日志信息并写入文件保存到指定的目录下.这里还做了最大文件数量限制,超过数量即删除旧日志文件. import jav ...
- android xlog崩溃日志,腾讯Xlog接入指南与踩过的坑
一 为什么要接入日志打印系统? 相信大家在开发应用的时候,总会遇到bug,这个时候,如果bug是在我们本地开发的过程中发现的,那么我们把手机插入android studio进行联调,就可以马上定位到出 ...
- Android保存配置文件内容到本地(txt、xml两种)
在做项目的时候难免需要保存一下配置文件,我们经常使用的就是SharedPreferences,但是当我们清除掉缓存或者卸载后重新安装这些配置文件内容就不存在了,当我们想卸载后重新安装这些配置文件还在, ...
- Android 应用崩溃日志的收集和上传
如何将应用崩溃日志收集起来? Android 应用难以避免的会 crash ,也称为崩溃,无论你的程序多完美,总是无法避免 crash 的发生.这对用户来说是很不友好的,也是开发者所不愿意看到的.更糟 ...
- android --------- Android10系统上访问本地相机下的视频文件报错 /storage/emulated/0/DCIM/Camera/ open failed: EACCES
最近在Android10系统上访问本地相机下的视频文件报错: 华为Mate30上试的 FileNotFoundException(/storage/emulated/0/DCIM/Camera/xx. ...
最新文章
- 无废话-SQL Server 2005新功能(1) - TSQL
- C 整数反转
- LPC1768外部中断与GPIO中断
- 学习ASP.NET一定要学习ASP.NET AJAX吗?
- FreeMarker 用户自定义指令@(3.4)
- sqlite3_finalize sqlite3_close
- 知乎万赞:人并不是活一辈子,而是活几个瞬间
- 干货!无需任何工具,实测macOS双开微信客户端
- 无人驾驶(pid算法)
- C#、TypeScript之父Anders Hejlsberg:“会用Excel就是程序员 ”
- Flash: 涅磐与重生
- mysql隔离性与隔离级别
- python医学科研中能做什么-科研画图都用什么软件?
- linux I2C驱动实验
- 人工智能 2 级就来越塔来杀我,论文已被NeurIPS收录!
- 地铁线路查询(easyx)
- 文字图片滚动 jquery 实现代码
- hdu-2072 单词数(“水”解法)
- ESP32A1S开发之智能家居 语音唤醒 语音命令控制(持续更新)
- 个人项目——基于STM32的智能物联网寝室