手机查看程序崩溃信息工具类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38875767/article/details/85614436
public class MyExceptionHelp implements Thread.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 MyExceptionHelp instance = null;
    // 系统默认的异常处理(默认情况下,系统会终止当前的异常程序)
    private Thread.UncaughtExceptionHandler mDefaultCrashHandler;
    private MyExceptionHelp(Context cxt) {
        // 获取系统默认的异常处理器
        mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler();
        // 将当前实例设为系统默认的异常处理器
        Thread.setDefaultUncaughtExceptionHandler(this);
        // 获取Context,方便内部使用
        this.mContext = cxt.getApplicationContext();
    }
    public synchronized static MyExceptionHelp create(Context cxt) {
        if (instance == null) {
            instance = new MyExceptionHelp(cxt);
        }
        return instance;
    }

    /**
     * 当程序中有未被捕获的异常,系统将会自动调用#uncaughtException方法
     * thread为出现未捕获异常的线程,ex为未捕获的异常,有了这个ex,我们就可以得到异常信息。
     */
    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        try {
            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();
                android.os.Process.killProcess(android.os.Process.myPid());
                System.exit(1);
            }
        }
    }

    /**
     * 保存文件到SD卡
     *
     * @description:
     * @author ldm
     * @date 2016-4-18 上午11:37:17
     */
    private void saveToSDCard(Throwable ex) throws Exception {
        File file = FileUtils.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 PackageManager.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());
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38875767/article/details/85614436