Android编程实现项目中异常捕获及对应Log日志文件保存功能

本文实例讲述了Android编程实现项目中异常捕获及对应Log日志文件保存功能。分享给大家供大家参考,具体如下:

做程序开发,肯定离不开与BUG打交道,更加离不开程序异常的出现。在开发的时候,我们可以通断点调试,日志打印,异常捕获工具等方式发现或处理程序中的Exception。那客户在使用我们的应用时,程序了问题,我们怎么可以知道呢?当然,我们可以加上友盟统计等第三方工具。另外还能怎么做呢?那就是把异常信息通过文档地形式保存下来,如果用户在使用的时候程序出了异常,可以让用户把对应的日志信息发给我们或客服人员,更好的是在程序中做好处理,把日志发到指定服务器(程序中记得添加网络权限哦)中,我们也可以拿到日志,我们就能发现问题,处理问题啦。

异常捕获的关键代码:

/**
 * UncaughtExceptionHandler:线程未捕获异常控制器是用来处理未捕获异常的。 实现该接口并注册为程序中的默认未捕获异常处理
 * 这样当未捕获异常发生时,就可以做些异常处理操作 例如:收集异常信息,发送错误报告 等。
 *
 * @description:
 * @author ldm
 * @date 2016-4-18 上午11:31:19
 */
public class MyExceptionHandler implements UncaughtExceptionHandler {
  // 上下文
  private Context mContext;
  // 是否打开上传
  public boolean openUpload = true;
  // Log文件路径
  private static final String LOG_FILE_DIR = "log";
  // log文件的后缀名
  private static final String FILE_NAME = ".log";
  private static MyExceptionHandler instance = null;
  // 系统默认的异常处理(默认情况下,系统会终止当前的异常程序)
  private UncaughtExceptionHandler mDefaultCrashHandler;
  private MyExceptionHandler(Context cxt) {
    // 获取系统默认的异常处理器
    mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler();
    // 将当前实例设为系统默认的异常处理器
    Thread.setDefaultUncaughtExceptionHandler(this);
    // 获取Context,方便内部使用
    this.mContext = cxt.getApplicationContext();
  }
  public synchronized static MyExceptionHandler create(Context cxt) {
    if (instance == null) {
      instance = new MyExceptionHandler(cxt);
    }
    return instance;
  }
  /**
   * 当程序中有未被捕获的异常,系统将会自动调用#uncaughtException方法
   * thread为出现未捕获异常的线程,ex为未捕获的异常,有了这个ex,我们就可以得到异常信息。
   */
  @Override
  public void uncaughtException(Thread thread, Throwable ex) {
    try {
      // 保存导出异常日志信息到SD卡中
      saveToSDCard(ex);
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      // 如果系统提供了默认的异常处理器,则交给系统去结束我们的程序,否则就由我们自己结束自己
      Toast.makeText(mContext,
          "很抱歉,程序出错,即将退出:\r\n" + ex.getLocalizedMessage(),
          Toast.LENGTH_LONG).show();
      if (mDefaultCrashHandler != null) {
        mDefaultCrashHandler.uncaughtException(thread, ex);
      } else {
        ex.printStackTrace();
      }
    }
  }
  /**
   * 保存文件到SD卡
   *
   * @description:
   * @author ldm
   * @date 2016-4-18 上午11:37:17
   */
  private void saveToSDCard(Throwable ex) throws Exception {
    File file = FileUtil.getAppointFile(mContext.getPackageName()
        + File.separator + LOG_FILE_DIR,
        getDataTime("yyyy-MM-dd-HH-mm-ss") + FILE_NAME);
    PrintWriter pw = new PrintWriter(new BufferedWriter(
        new FileWriter(file)));
    // 导出发生异常的时间
    pw.println(getDataTime("yyyy-MM-dd-HH-mm-ss"));
    // 导出手机信息
    savePhoneInfo(pw);
    pw.println();
    // 导出异常的调用栈信息
    ex.printStackTrace(pw);
    pw.close();
  }
  /**
   * 保存手机硬件信息
   *
   * @description:
   * @author ldm
   * @date 2016-4-18 上午11:38:01
   */
  private void savePhoneInfo(PrintWriter pw) throws NameNotFoundException {
    // 应用的版本名称和版本号
    PackageManager pm = mContext.getPackageManager();
    PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(),
        PackageManager.GET_ACTIVITIES);
    pw.print("App Version: ");
    pw.print(pi.versionName);
    pw.print('_');
    pw.println(pi.versionCode);
    pw.println();
    // android版本号
    pw.print("OS Version: ");
    pw.print(Build.VERSION.RELEASE);
    pw.print("_");
    pw.println(Build.VERSION.SDK_INT);
    pw.println();
    // 手机制造商
    pw.print("Manufacturer: ");
    pw.println(Build.MANUFACTURER);
    pw.println();
    // 手机型号
    pw.print("Model: ");
    pw.println(Build.MODEL);
    pw.println();
  }
  /**
   * 根据时间格式返回时间
   *
   * @description:
   * @author ldm
   * @date 2016-4-18 上午11:39:30
   */
  private String getDataTime(String format) {
    SimpleDateFormat df = new SimpleDateFormat(format);
    return df.format(new Date());
  }
}

使用的时候,我们需要在Application中初始化:

public class MyApplication extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    MyExceptionHandler.create(this);
  }
}

在AndroidManifest.xml文件中注册好Application:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.ldm.exception"
  android:versionCode="1"
  android:versionName="1.0" >
  <uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="21" />
  <uses-permission android:name="android.permission.INTERNET" />
  <application
    android:name="com.ldm.exception.MyApplication"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
      android:name="com.ldm.activity.MainActivity"
      android:label="@string/app_name" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
</manifest>

注:更多关于Android Manifest权限控制文件的说明可点击此处查看Android权限操作说明

文件上传的方法有写好,但是没有具体实现,比如一但有日志文件就上传或是日志文件达到一定大小再上传,这就要根据实际情况来定啦。

当我们应用出现异常时,在手机文件夹中存在我们应用包名的文件夹,里面就有日志文件。

附:完整Demo点击此处本站下载

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android调试技巧与常见问题解决方法汇总》、《Android开发入门与进阶教程》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

您可能感兴趣的文章:

  • Android崩溃异常捕获方法
  • Android 全局异常捕获实例详解
  • Android CrashHandler编写自己的异常捕获的方法
  • android 捕获系统异常并上传日志具体实现
  • 详解Android全局异常的捕获处理
  • logcat命令使用方法和查看android系统日志缓冲区内容的方法
  • android轻松管理安卓应用中的log日志 发布应用时log日志全部去掉的方法
  • Android开发之在程序中时时获取logcat日志信息的方法(附demo源码下载)
  • Android 日志系统Logger源代码详细介绍
  • Android 日志工具(log)的使用方法
(0)

相关推荐

  • logcat命令使用方法和查看android系统日志缓冲区内容的方法

    *注:可以用 adb logcat > 路径/文件名 来保存,此命令执行之时起的全部日志信息到一个文件里,ctrl + C 结束日志输出:后面不加 > 路径/文件名 的话,则在 stdout (终端窗口)中输出!例如:$ adb logcat -v long Checkin *:S > ~/桌面/log.txt 一.在 Java 与 C 语言中输出日志:1) Java 代码在程序中输出日志, 使用 android.util.Log 类的以下 5 个方法:   Log.v().Log.d(

  • android轻松管理安卓应用中的log日志 发布应用时log日志全部去掉的方法

    管理log一般有两种方法,博主推荐大家使用下面的第一种方法: 第一种方法: 第一步:定义一个logTools工具类,相信你能够看懂的,谁的log,可以用谁的名字做方法名,如logli,这就是工程师li打印的日志 复制代码 代码如下: import android.util.Log; public class LogTools { public static boolean isShow = true;//上线模式 //public static boolean isShow = false;//

  • Android CrashHandler编写自己的异常捕获的方法

    平时写代码,我们可能会抛出各种异常,这些异常有些是我们测试过程中发现进行解决的,但是也有一些异常是我们未知的,不论是代码的逻辑问题还是Android本身底层的一些bug,我们都需要及时了解并进行解决.当用户在使用app出现崩溃现象时我们需要知道是什么原因,并将原因记录下来上到服务器,这样以后我们就可以知道具体是什么原因了 CrashHandler类 用于记录crash原因保存到sd卡中. public class CrashHandler implements Thread.UncaughtEx

  • Android开发之在程序中时时获取logcat日志信息的方法(附demo源码下载)

    本文实例讲述了Android开发之在程序中时时获取logcat日志信息的方法.分享给大家供大家参考,具体如下: 今天分享一个在软件开发中很实用的例子,也是这几天在通宵加班中我使用的一个小例子, 在程序中监听Log信息. 为什么说它实用?原因是Android的开发厂商各种修改之后手机和手机之间以后存在很多差异.比如说魅族M9手机 开发中如果项目中涉及到访问手机系统的地方,例如访问系统短信库,M9手机它会提示一个dialog框 让用户自己去选择 访问还是不访问.这样就给开发适配带来了巨大的麻烦.本来

  • 详解Android全局异常的捕获处理

    在Android开发中在所难免的会出现程序crash,俗称崩溃.用户的随意性访问出现测试时未知的Bug导致我们的程序crash,此时我们是无法直接获取的错误log的,也就无法修复Bug.这就会极大的影响用户体验,此时我们需要注册一个功能来捕获全局的异常信息,当程序出现crash信息,我们把错误log记录下来,上传到服务器,以便于我们能及时修复bug.实现这个功能我们需要依赖于UncaughtExceptionHandler这个类,UncaughtExceptionHandler是一个接口,在Th

  • Android崩溃异常捕获方法

    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面.而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里.但平时使用的时候给你闹崩溃,那你就欲哭无泪了. 那么今天主要讲一下如何去捕捉系统出现的Unchecked异常.何为Unchecked异常呢,换句话说就是指非受检异常,它不能用try-catch来显示捕捉. 我们先从Exception讲起.Exception分为两类:一种是CheckedException,一种是UncheckedException

  • Android 日志工具(log)的使用方法

    使用Android的日志工具Log 方法: Android中的日志工具类为Log,这个类提供了如下方法来供我们打印日志: 使用方法: Log.d("MainActivity","onCreate execute"); 第一个参数tag:一般传入当前类名就好,主要用于队打印信息进行过滤. 第二个参数:msg,具体想打印的内容. 如: public class MainActivity extends AppCompatActivity { protected void

  • Android 全局异常捕获实例详解

    Android 全局异常捕获 今天就来说说作为程序猿的我们每天都会遇到的东西bug,出bug不可怕可怕的是没有出bug时的堆栈信息,那么对于bug的信息收集就显得尤为重要了,一般用第三方bugly或者友盟等等都能轻易收集,但是由于公司不让使用第三方,而安卓正好有原生的异常收集类UncaughtExceptionHandler,那么今天博客就从这个类开始. UncaughtExceptionHandler见名知意,即他是处理我们未捕获的异常,具体使用分两步 1.实现我们自己的异常处理类 publi

  • Android 日志系统Logger源代码详细介绍

    我们知道,在Android系统中,提供了一个轻量级的日志系统,这个日志系统是以驱动程序的形式实现在内核空间的,而在用户空间分别提供了Java接口和C/C++接口来使用这个日志系统,取决于你编写的是Android应用程序还是系统组件.在前面的文章浅谈Android系统开发中LOG的使用中,已经简要地介绍了在Android应用程序开发中Log的使用方法,在这一篇文章中,我们将更进一步地分析Logger驱动程序的源代码,使得我们对Android日志系统有一个深刻的认识. 既然Android 日志系统是

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

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

随机推荐