android 捕获系统异常并上传日志具体实现

android 捕获系统异常并上传日志具体实现,第1张

概述在做项目时,经常会把错误利用异常抛出去,这样在开发时就可以通过手机抛出的异常排查错误。但是当程序开发完毕,版本稳定,需要上线时,为了避免抛出异常影响用户感受,可以用UncaughtExceptionHandler捕获全局异常

在做项目时,经常会把错误利用异常抛出去,这样在开发时就可以通过手机抛出的异常排查错误。但是当程序开发完毕,版本稳定,需要上线时,为了避免抛出异常影响用户感受,可以用UncaughtExceptionHandler捕获全局异常,对异常做出处理。比如我们可以获取到抛出异常的时间、手机的硬件信息、错误的堆栈信息,然后将获取到的所有的信息发送到服务器中,也可以发送到指定的邮件中,以便及时修改BUG。

示例:

自定义异常类实现UncaughtExceptionHandler接口,当某个页面出现异常就会调用uncaughtException这个方法,我们可以在这个方法中获取异常信息、时间等,然后将获取到的信息发送到我们指定的服务器

复制代码 代码如下:
/**
 * 自定义的 异常处理类,实现了 UncaughtExceptionHandler接口
 * @author administrator
 *
 */
public class MyCrashHandler implements UncaughtExceptionHandler {
 // 需求是 整个应用程序 只有一个 MyCrash-Handler
 private static MyCrashHandler myCrashHandler ;
 private Context context;
 private DoubanService service;
 private SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");

 //1.私有化构造方法
 private MyCrashHandler(){

 }

 public static synchronized MyCrashHandler getInstance(){
  if(myCrashHandler!=null){
   return myCrashHandler;
  }else {
   myCrashHandler  = new MyCrashHandler();
   return myCrashHandler;
  }
 }
 public voID init(Context context,DoubanService service){
  this.context = context;
  this.service = service;
 }
 

 public voID uncaughtException(Thread arg0,Throwable arg1) {
  System.out.println("程序挂掉了 ");
  // 1.获取当前程序的版本号. 版本的ID
  String versioninfo = getVersionInfo();

  // 2.获取手机的硬件信息.
  String mobileInfo  = getMobileInfo();

  // 3.把错误的堆栈信息 获取出来
  String errorinfo = getErrorInfo(arg1);

  // 4.把所有的信息 还有信息对应的时间 提交到服务器
  try {
   service.createNote(new PlainTextConstruct(dataFormat.format(new Date())),
     new PlainTextConstruct(versioninfo+mobileInfo+errorinfo),"public","yes");
  } catch (Exception e) {
   e.printstacktrace();
  }

  //干掉当前的程序
  androID.os.Process.killProcess(androID.os.Process.myPID());
 }

 /**
  * 获取错误的信息
  * @param arg1
  * @return
  */
 private String getErrorInfo(Throwable arg1) {
  Writer writer = new StringWriter();
  PrintWriter pw = new PrintWriter(writer);
  arg1.printstacktrace(pw);
  pw.close();
  String error= writer.toString();
  return error;
 }

 /**
  * 获取手机的硬件信息
  * @return
  */
 private String getMobileInfo() {
  StringBuffer sb = new StringBuffer();
  //通过反射获取系统的硬件信息
  try {

   FIEld[] fIElds = Build.class.getDeclaredFIElds();
   for(FIEld fIEld: fIElds){
    //暴力反射,获取私有的信息
    fIEld.setAccessible(true);
    String name = fIEld.getname();
    String value = fIEld.get(null).toString();
    sb.append(name+"="+value);
    sb.append("\n");
   }
  } catch (Exception e) {
   e.printstacktrace();
  }
  return sb.toString();
 }

 /**
  * 获取手机的版本信息
  * @return
  */
 private String getVersionInfo(){
  try {
   PackageManager pm = context.getPackageManager();
    PackageInfo info =pm.getPackageInfo(context.getPackagename(),0);
    return  info.versionname;
  } catch (Exception e) {
   e.printstacktrace();
   return "版本号未知";
  }
 }
}

创建一个Application实例将MyCrashHandler注册到整个应用程序上,创建出服务并进行传递:
复制代码 代码如下:
/**
 * 整个(app)程序初始化之前被调用
 * @author administrator
 *
 */
public class DoubanApplication extends Application {
  public NoteEntry entry;
 @OverrIDe
 public voID onCreate() {
  super.onCreate();
  String APIKey = "0fab7f9aa21f39cd2f027ecfe65dad67";
  String secret = "87fc1c5e99bfa5b3";
  // 获取到service
  DoubanService myService = new DoubanService("我的小豆豆",APIKey,
    secret);
  myService.setAccesstoken("1fa4e5be0f808a0b5eeeb13a2e819e21","56a622c1138dbfce");
  MyCrashHandler handler = MyCrashHandler.getInstance();
  handler.init(getApplicationContext(),myService);
  Thread.setDefaultUncaughtExceptionHandler(handler);
 }
}

您可能感兴趣的文章:Android崩溃异常捕获方法Android 全局异常捕获实例详解Android CrashHandler编写自己的异常捕获的方法详解Android全局异常的捕获处理logcat命令使用方法和查看android系统日志缓冲区内容的方法android轻松管理安卓应用中的log日志 发布应用时log日志全部去掉的方法Android开发之在程序中时时获取logcat日志信息的方法(附demo源码下载)Android 日志系统Logger源代码详细介绍Android 日志工具(log)的使用方法Android编程实现项目中异常捕获及对应Log日志文件保存功能 总结

以上是内存溢出为你收集整理的android 捕获系统异常并上传日志具体实现全部内容,希望文章能够帮你解决android 捕获系统异常并上传日志具体实现所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1142985.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存