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>
相关文章:
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; i…...
flutter聊天界面-加号【➕】更多展开相机、相册等操作Panel
flutter聊天界面-加号【➕】更多展开相机、相册等操作Panel 在之前实现了flutter聊天界面的自定义表情的展示,这里记录一下更多操作展开的相机、相册等操作功能实现。 一、查看效果 更多操作展开的相机、相册等操作功能实现。 二、代码实现 展开的操作按钮可能比…...
浅析泵站自动化技术的发展趋势
摘要:基于泵站对我国水利及水务事业的重要性,文章以城市供水行业大型泵站为对象,分析了泵站自动化技术 发展现状,结合泵站自动化技术的发展需求,从管控一体化、系统自诊断、运行信息实时化管理等方面展望了泵 站自动化…...
5.4.1 虚拟专用网VPN
5.4.1 虚拟专用网VPN 我们已经学习了因特网的路由协议(5.3.1 因特网的路由协议(一)、5.3.2 因特网的路由协议(二)基于距离向量算法的RIP协议、5.3.3 因特网的路由协议(三)OSPF协议、5.3.4 因特…...
第42节:cesium 火焰效果(含源码+视频)
结果示例: 完整源码: <template><div class="viewer"><!-- :shouldAnimate="true" 添加动画 --><vc-viewer @ready...
MySQL基础篇第5章(排序与分页)
文章目录 1、排序1.1 排序规则1.2 单列排序1.3 多列排序 2、分页2.1 背景2.2 实现规则2.3 拓展 1、排序 1.1 排序规则 使用 ORDER BY 子句排序 ASC(ascend): 升序DESC(descend):降序 ORDER BY 子句在SELECT语句的结尾。 1.2 …...
LeetCode解法汇总2679. 矩阵中的和
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给你一个下标从 0 开始的二维整数数组 nums 。一开始你的分数为 0 。你需要执行…...
flask-apscheduler实现定时任务
秋风阁-北溪入江流 flask-apscheduler是一个支持apscheduler的flask插件,通过flask-apscheduler可以很方便的定义定时任务。 安装flask-apscheduler pip install flask-apschedulerflask-apscheduler组件 apscheduler库包含有组件: triggers…...
FPGA纯verilog实现UDP协议栈,sgmii接口SFP光口收发,提供工程源码和技术支持
目录 1、前言2、我这里已有的UDP方案3、该UDP协议栈性能4、详细设计方案SFPGMII AXIS接口模块AXIS FIFOUDP协议栈1G/2.5G Ethernet PCS/PMA or SGMII 5、vivado工程详解6、上板调试验证并演示准备工作查看ARPUDP数据回环测试 7、福利:工程代码的获取 1、前言 目前网…...
【Python入门系列】第十五篇:Python数据可视化和图表绘制
文章目录 前言一、可视化与绘图常用库二、Matplotlib1、折线图2、散点图3、柱状图: 三、Seaborn1、散点图2、箱线图3、小提琴图4、热力图 四、Plotly1、折线图2、散点图3、条形图 总结 前言 数据可视化是数据分析和数据科学中非常重要的一部分。通过可视化…...
isBlank函数和isEmpty函数的区别
StrUtil.isBlank(CharSequence):该方法用于判断字符串是否为空或仅包含空白字符。如果传入的字符串为null、空字符串(“”)或仅包含空白字符(如空格、制表符、换行符等),则返回true;否则返回false。 StrUtil.isEmpty(…...
「SQL面试题库」 No_121 The Most Recent Three Orders
🍅 1、专栏介绍 「SQL面试题库」是由 不是西红柿 发起,全员免费参与的SQL学习活动。我每天发布1道SQL面试真题,从简单到困难,涵盖所有SQL知识点,我敢保证只要做完这100道题,不仅能轻松搞定面试࿰…...
【计算机视觉 | 目标检测 | 图像分割】arxiv 计算机视觉关于目标检测和图像分割的学术速递(7 月 7 日论文合集)
文章目录 一、检测相关(5篇)1.1 Contextual Affinity Distillation for Image Anomaly Detection1.2 Noise-to-Norm Reconstruction for Industrial Anomaly Detection and Localization1.3 MMNet: Multi-Collaboration and Multi-Supervision Network for Sequential Deepfake…...
直流运算放大器-----仪表放大器(三)
详见 模拟电子技术基础 6.4.1 电路图 计算公式 仿真 电流流向...
【Zookeeper】终端操作常用命令
文章目录 服务端常用命令客户端常用命令 zookeeper版本3.7.1 Zookeeper是一个开源的分布式协调服务。 Zookeeper是Apache软件基金会的一个项目,它提供了分布式应用程序协调的通用服务,如分布式同步、命名服务、集群维护等,以简化分布式应用协…...
leetcode 1110. 删点成林
给出二叉树的根节点 root,树上每个节点都有一个不同的值。 如果节点值在 to_delete 中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合)。 返回森林中的每棵树。你可以按任意顺序组织答案…...
华为Harmony应用开发初探
HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。在传统的单设备系统能力基础上,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备,提供全场景(移动办公、运动健康、社交通信、媒体…...
电脑应用程序发生异常怎么办?
有时候我们打开电脑上面的某个软件时,会打不开,并且会弹出如下的错误提示“应用程序发生异常 未知的软件异常(xxx),位置为xx”。相信大多数的人在使用电脑的时…...
【JAVA】准备工作------Java开发环境搭建,IDEA的基础设置与操作
🍉内容专栏:【JAVA】 🍉本文脉络:JAVA的准备工作,IDEA的安装以及基础设置和快捷操作 🍉本文作者:Melon西西 🍉发布时间 :2023.7.11 目录 1. 概述JDK、JRE 2. 第一个程序——创建…...
操作系统真象还原——第5章 保护模式进阶,向内核迈进
第5章 保护模式进阶,向内核迈进 BIOS中断利用0x15子功能0xe802获取内存 汇编语言子功能的调用 填写调用前相关寄存器进行int中断调用获取返回结果输出到对应寄存器的值 80286 拥有24 位地址线,其寻址空间是16MB 。有一些ISA 只使用15MB,剩下…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...
