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

news/2025/1/15 22:01:22/

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.ppmy.cn/news/841190.html

相关文章

台灯c语言,基于msp单片机的智能台灯设计(C语言).doc

基于msp单片机的智能台灯设计(C语言).doc 基于msp430单片机的智能台灯设计(C语言) 桂林理工大学信息学院 实 习 报 告 实习名称&#xff1a; 电子系统设计创新与实践 设计题目&#xff1a; 基于单片机的智能台灯设计 专业班级&#xff1a; 姓 名&#xff1a; 学 号&#xff1a;…

计算机图形学台灯光照代码,光照控制自动调光台灯工作原理及设计

《光照控制自动调光台灯工作原理及设计》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《光照控制自动调光台灯工作原理及设计(2页珍藏版)》请在人人文库网上搜索。 1、光照控制自动调光台灯工作原理及设计时间&#xff1a;2011-01-02 20:01:09 来源&#xff1a; 作者…

关于电源线 USB台灯3C认证相关介绍

电源线台灯等属于电源相关产品&#xff0c;正好处于3c强制认证行列&#xff1b;并且&#xff0c;台灯的电压普遍在36V以上所以是在3c认证行列。 台灯申请3C认证的检测标准&#xff1a; GB7000.1-2015; GB7000.204-2008 1、3C认证是强制性认证&#xff0c;是进入国内市场的通行…

学生护眼台灯怎么选?性价比高的学生护眼台灯

随着经济的快速发展&#xff0c;从小孩子都开始用起电子产品&#xff0c;不管是电视机、手机等&#xff0c;都是非常普遍的&#xff0c;这就可能导致孩子进入学生时期时就开始近视了&#xff0c;不仅要在学校学习知识&#xff0c;回家也要对着电视机&#xff0c;不知道怎么适当…

计算机和书桌还有台灯英语,台灯的英语单词是什么

一、英语单词&#xff1a;desk lamp; table lamp; reading lamp 二、双语例句&#xff1a; 1 嘟嘟会将床头的台灯关掉&#xff0c;房间里一片漆黑。 Doodle will turn my desk lamp, dark room. 2 从亚洲到美洲&#xff0c;从新德里到丹佛&#xff0c;全世界每年所有电器的用电…

如何选择一款优秀的儿童读写台灯?

如何选择一款优秀的儿童阅读台灯&#xff1f;除了品牌、外观、材质、价格等因素外&#xff0c;最关键的是技术参数。 先说结论&#xff0c;满足如下几点参数&#xff0c;当数优选&#xff1a; 1-光通量&#xff1a;500lm以上 2-显色指数&#xff1a;≥95 3-色温&#xff1a…

台灯c语言,Jya无线台灯C 告诉你如何重新定义光的含义

原标题&#xff1a;Jya无线台灯C 告诉你如何重新定义光的含义 凡是要去撼动非常传统的行业或者产品的时候&#xff0c;肯定会遭到大多数人的质疑&#xff0c;都会说怎么可能&#xff1f;怎么会&#xff1f;拿现在的台灯举例&#xff0c;造型永远都是单一的弯曲状&#xff0c;目…

学生护眼台灯哪个牌子最好?高品质的护眼灯推荐

护眼台灯的品牌有很多的&#xff0c;但是有护眼效果的却不多&#xff0c;根据学生使用台灯的次数会比较多&#xff0c;那我们一定要选择高品质的护眼台灯&#xff0c;达到照度国AA级标准、显色值Ra95以上、色温在3800K左右、无频闪&#xff0c;根据这几个重要指标来选择。 推荐…