Android(安卓)捕获App意外退出错误的日志信息
16lz
2021-01-26
1.创建获取日志信息的类AppLogHandler,该类的功能是捕获导致应用程序意外退出的错误的日志信息,这里写的是一个错误保存一个log文件,保存到SD卡对应的目录下。代码如下:
2.为了读取Logcat的信息并保存到SD卡中,必须添加对应的权限:
3.新建MyApplication类继承自Application,在应用启动时开启对导致程序意外退出的错误的捕获:
4.为了使MyApplication生效,必须修改AndroidMenifest.xml文件:
package com.ryan.test.crash;import java.io.File;import java.io.FileOutputStream;import java.lang.Thread.UncaughtExceptionHandler;import android.content.Context;import android.os.Environment;import android.os.Looper;public class AppLogHandler implements UncaughtExceptionHandler {public static final boolean DEBUG = true;public static final String AGR_LOG_DIRECOTORY = "agrlog";private Thread.UncaughtExceptionHandler mDefaultHandler;private static AppLogHandler instance;private AppLogHandler() {}public static AppLogHandler getInstance() {if (instance == null) {instance = new AppLogHandler();}return instance;}public void init(Context context) {mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();Thread.setDefaultUncaughtExceptionHandler(this);}@Overridepublic void uncaughtException(Thread thread, Throwable ex) {if (!handleException(ex) && mDefaultHandler != null) {mDefaultHandler.uncaughtException(thread, ex);} else {try {Thread.sleep(3000);} catch (Exception e) {e.printStackTrace();}android.os.Process.killProcess(android.os.Process.myPid());System.exit(10);}}private boolean handleException(final Throwable ex) {if (DEBUG) {if (ex == null) {return false;}final StackTraceElement[] stack = ex.getStackTrace();final String message = ex.getMessage();new Thread() {@Overridepublic void run() {Looper.prepare();createLogDirectory();String fileName = AGR_LOG_DIRECOTORY + "/crash-" + System.currentTimeMillis() + ".log";File file = new File(Environment.getExternalStorageDirectory(), fileName);try {FileOutputStream fos = new FileOutputStream(file, true);fos.write(message.getBytes());for (int i = 0; i < stack.length; i++) {fos.write(stack[i].toString().getBytes());}fos.flush();fos.close();} catch (Exception e) {}Looper.loop();}}.start();}return false;}private void createLogDirectory() {File file = new File(Environment.getExternalStorageDirectory(), AGR_LOG_DIRECOTORY);try {if (!file.exists() || !file.isDirectory()) {file.mkdir();}} catch (Exception e) {e.printStackTrace();}}}
2.为了读取Logcat的信息并保存到SD卡中,必须添加对应的权限:
<uses-permission android:name="android.permission.READ_LOGS" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
3.新建MyApplication类继承自Application,在应用启动时开启对导致程序意外退出的错误的捕获:
import com.ryan.test.crash.AppLogHandler;import android.app.Application;public class MyApplication extends Application{@Overridepublic void onCreate() {super.onCreate();AppLogHandler appLogHandler = AppLogHandler.getInstance();appLogHandler.init(getApplicationContext());}}
4.为了使MyApplication生效,必须修改AndroidMenifest.xml文件:
<application android:name="com.ryan.test.MyApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar"> <!-- 省略其他信息 --> </application>
更多相关文章
- 捕获TextView超链接
- Android之屏幕方向改变以及onConfigurationChanged事件
- Android(安卓)INSTALL_FAILED_ACWF_INCOMPATIBLE
- Android进阶篇-百度地图获取地理信息
- Android错误提示:IMGSRV::0: gralloc_module_unmap: find buffer
- Android(安卓)Studio Error—Gradle: 错误:编码 GBK 的不可映射
- android在ubuntu桌面系统下编译可能的错误和解决方法
- Android(安卓)log日志信息获取
- Android四大组件安全问题