当前位置: 首页 > news >正文

Android 报错,闪退(错误)日志保存到手机内存中,以文本文件的形式保存

1.直接贴代码

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Environment;
import android.util.Log;import com.nuotu.atmBookClient.App;import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.Thread.UncaughtExceptionHandler;
import java.text.SimpleDateFormat;
import java.util.Date;/*** 全局捕获导常,保存到本地错误日志。日志* 路径位于sdcard/错误日志Log/myErrorLog下。*/
public class MyCrashHandler implements UncaughtExceptionHandler {private static MyCrashHandler instance;//报错具体信息内容,具体到是哪一行报错String result;public static MyCrashHandler getInstance() {if (instance == null) {instance = new MyCrashHandler();}return instance;}private Thread.UncaughtExceptionHandler mDefaultHandler;public void init(Context ctx) {// 获取默认异常处理器mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();// 将当前类设为默认异常处理器Thread.setDefaultUncaughtExceptionHandler(this);}/*** 核心方法,当程序crash 会回调此方法, Throwable中存放这错误日志*///如果程序出现报错,闪退,有错误信息,都会回调到这个方法@Overridepublic void uncaughtException(Thread arg0, Throwable arg1) {Log.d("111333","打印报错信息="+arg1.getMessage());//这个if语句进行报错信息捕获,并用result接收if (handleException(arg1)) {// 已经处理,APP重启,方法放在最下面//   restartApp();} else {// 如果不处理,则调用系统默认处理异常,弹出系统强制关闭的对话框if (mDefaultHandler != null) {mDefaultHandler.uncaughtException(arg0, arg1);}}String logPath;if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {logPath = Environment.getExternalStorageDirectory().getAbsolutePath()+ File.separator+ File.separator+ "错误日志Log";//我们可以根据这个路径去手机内存中查找这个文件Log.d("1113332","打印报错信息文件的存放路径="+logPath);File file = new File(logPath);if (!file.exists()) {file.mkdirs();}try {FileWriter fw = new FileWriter(logPath + File.separator+ "myErrorlog.log", true);// 错误信息// 这里还可以加上当前的系统版本,机型型号 等等信息StackTraceElement[] stackTrace = arg1.getStackTrace();//这里用write方法进行数据写入到文件中fw.write(getNowTime());//这里暂时注释,这个for循环的报错信息不够具体
//                for (int i = 0; i < stackTrace.length; i++) {
//                    fw.write("file:" + stackTrace[i].getFileName() + " class:"
//                            + stackTrace[i].getClassName() + " method:"
//                            + stackTrace[i].getMethodName() + " line:"
//                            + stackTrace[i].getLineNumber() + "\n");
//                }fw.write("\n========================这里存放最重要的错误信息提示,具体到哪一行报错(开始)===========================\n");fw.write(result);fw.write("\n========================这里存放最重要的错误信息提示,具体到哪一行报错(结束)===========================\n");fw.close();// 上传错误信息到服务器// uploadToServer();} catch (IOException e) {Log.e("crash handler", "load file failed...", e.getCause());}}arg1.printStackTrace();//这行代码是杀死进程,暂时注释//    android.os.Process.killProcess(android.os.Process.myPid());}private boolean handleException(Throwable e) {if (e == null) {return false;}Writer writer = new StringWriter();PrintWriter pw = new PrintWriter(writer);e.printStackTrace(pw);pw.close();//这里捕获报错日志,用result接收result = writer.toString();// 打印出错误日志Log.d("111333", "打印出错误日志================================(开始)\n"+result+"打印出错误日志================================(结束)\n");return true;}/*** 1s后让APP重启*/private void restartApp() {Intent intent = App.getContext().getPackageManager().getLaunchIntentForPackage(App.getContext().getPackageName());PendingIntent restartIntent = PendingIntent.getActivity(App.getContext(), 0, intent, 0);AlarmManager mgr = (AlarmManager) App.getContext().getSystemService(Context.ALARM_SERVICE);// 1秒钟后重启应用mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, restartIntent);System.exit(0);}/*** 获取当前时间** @return 当前时间*/private static String getNowTime() {SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date curDate = new Date(System.currentTimeMillis());//获取当前时间return formatter.format(curDate);}}

2.在Application中进行初始化

import android.app.Application;public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();//打开错误日志,保存到sd卡MyCrashHandler myCrashHandler = MyCrashHandler.getInstance();myCrashHandler.init(getApplicationContext());TextView t=null;//这里写一个空对象,调用他的方法,进行报错t.setText("");}
}

3.修改mainfests,添加权限,修改application节点。需要配置全局启动类,不然不会启动MyApplication 类。还有需要注意,如果是安卓6.0以上的系统需要动态申请权限(读写文件权限)。
就是图片中的权限
在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.yu.myapplication"><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><applicationandroid:name=".MyApplication"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"><activityandroid:name=".MainActivity"android:label="@string/app_name"android:theme="@style/AppTheme.NoActionBar"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>
http://www.lryc.cn/news/94696.html

相关文章:

  • flutter聊天界面-加号【➕】更多展开相机、相册等操作Panel
  • 浅析泵站自动化技术的发展趋势
  • 5.4.1 虚拟专用网VPN
  • 第42节:cesium 火焰效果(含源码+视频)
  • MySQL基础篇第5章(排序与分页)
  • ​LeetCode解法汇总2679. 矩阵中的和
  • flask-apscheduler实现定时任务
  • FPGA纯verilog实现UDP协议栈,sgmii接口SFP光口收发,提供工程源码和技术支持
  • 【Python入门系列】第十五篇:Python数据可视化和图表绘制
  • isBlank函数和isEmpty函数的区别
  • 「SQL面试题库」 No_121 The Most Recent Three Orders
  • 【计算机视觉 | 目标检测 | 图像分割】arxiv 计算机视觉关于目标检测和图像分割的学术速递(7 月 7 日论文合集)
  • 直流运算放大器-----仪表放大器(三)
  • 【Zookeeper】终端操作常用命令
  • leetcode 1110. 删点成林
  • 华为Harmony应用开发初探
  • 电脑应用程序发生异常怎么办?
  • 【JAVA】准备工作------Java开发环境搭建,IDEA的基础设置与操作
  • 操作系统真象还原——第5章 保护模式进阶,向内核迈进
  • 设计一款助听器可能需要用到以下音频算法
  • 【端午节】用Vue3写粽子——从零开始
  • 大象机器人人工智能套装2023版深度学习协作机器人、先进机器视觉与应用场景
  • Cesium Token申请
  • ubuntu系统自带的Text Editor编辑器不高亮解决办法
  • Docker NGINX 加载Geoip模板
  • springboot基于协同过滤算法商品推荐系统
  • 基于机器学习算法:朴素贝叶斯和SVM 分类-垃圾邮件识别分类系统(含Python工程全源码)
  • 在Linux下将PNG和JPG批量互转的四种方法
  • Scala中使用 break 和 continue
  • 【全栈开发指南】打包sentinel-dashboard镜像推送到Docker Hub镜像仓库