android 收集已发布版本的错误信息(UncaughtExceptionHandler)

前言:在开发安卓的过程中,debug绝对是任何开发人员极为痛绝的事情。在本地开发过程中,如果出现错误,还可以查看logcat信息,但是市场上的手机五花八门,各种型号各种屏幕尺寸,甚至各种各样的用户,开发者难以确定什么时候用户会出现bug.那么搜集已经发布的版本bug信息,对于版本更新和用户体验是十分重要的事情,那么如何实现?

在项目中用到这种需求,花了半天时间研究了一下,具体用法待我一一道来。

首先,是实现UncaughtExceptionHandler。

/**
 * 收集用户手机崩溃信息,上传服务器
 * Created by xygy on 2015/7/30.
 */
public class UserError implements Thread.UncaughtExceptionHandler{
    private String TAG = "usererror-------->";

    private Context context;
    //获取系统的版本号
    private int versionMain;//大的版本号,如1
    private int versionMini;//小的版本号,如.1

    //用于格式化日期,作为日志文件名的一部分
    private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");

    //实例
    private static UserError userError;
    //系统默认处理实例
    private Thread.UncaughtExceptionHandler exceptionHandler;

    //初始化
    public void init(Context context){
        this.context = context;
        //获取默认实例
        exceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
        //设置为程序的默认处理器
        Thread.setDefaultUncaughtExceptionHandler(this);
    }

    /**
     * 使用单例模式
     * 构造函数设置为private
     */
    private UserError(){}
    public static UserError getInstance(){
        if(userError == null){
            return new UserError();
        }else{
            return userError;
        }
    }

    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        Log.v(TAG, "thread.getName()------------------------>" + thread.getName());

        caughtException(thread, ex);
        //调用系统默认处理
        exceptionHandler.uncaughtException(thread, ex);

        //如果不是主线程,则强制关闭线程
        if(thread.getName().equals("main")){
            Log.v(TAG, "usererror------------------------>" + null);
        }else{

        }
    }

    /**
     * 处理用户的崩溃信息
     * @param thread
     * @param ex
     */
    private void caughtException(Thread thread, Throwable ex){
        final Writer result = new StringWriter();
        final PrintWriter printWriter = new PrintWriter(result);

        //获取跟踪的栈信息,除了系统栈信息,还把手机型号、系统版本、编译版本的唯一标示上传
        StackTraceElement[] trace = ex.getStackTrace();
        StackTraceElement[] trace2 = new StackTraceElement[trace.length+3];

        System.arraycopy(trace, 0, trace2, 0, trace.length);

        trace2[trace.length+0] = new StackTraceElement("Android", "MODEL", android.os.Build.MODEL, -1);
        trace2[trace.length+1] = new StackTraceElement("Android", "VERSION", android.os.Build.VERSION.RELEASE, -1);
        trace2[trace.length+2] = new StackTraceElement("Android", "FINGERPRINT", android.os.Build.FINGERPRINT, -1);

        //追加信息,因为后面会回调默认的处理方法
        ex.setStackTrace(trace2);
        ex.printStackTrace(printWriter);
        //把上面获取的堆栈信息转为字符串,打印出来
        String stacktrace = result.toString();
        printWriter.close();
        //Log.v(TAG, "usererror------------------------>" + stacktrace);

        getVersion();
        JSONArray jsonArray = new JSONArray();
        JSONObject jsonObject = new JSONObject();
        try{
            jsonObject.put("userId",new KFXApp().getUserName());//用户id
            jsonObject.put("deviceType","安卓:" + Build.VERSION.RELEASE);//安卓版本信息
            jsonObject.put("versionMain",versionMain);//代码大版本
            jsonObject.put("versionMini",versionMini);//代码小版本
            jsonObject.put("crashStackTrace",stacktrace);//崩溃信息
            jsonObject.put("crashTime",formatter.format(new Date()));//崩溃时间
            jsonObject.put("phoneInfo","制造商:" + Build.MANUFACTURER + "    手机型号:" + Build.MODEL + "    " + Build.BRAND);//手机信息
            jsonObject.put("others","");

            jsonArray.put(jsonObject);

            Log.v(TAG,"json-->" + jsonArray.toString());

        }catch(JSONException e){
            e.printStackTrace();
        }

        //以下上传服务器的代码

    }

    /**
     * 获取代码的版本信息
     */
    private void getVersion(){
    }

}

然后在Application的oncreate()方法中初始化后,即可成功应用。

        UserError userError = UserError.getInstance();
        userError.init(getApplicationContext());

【完】

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-27 03:30:31

android 收集已发布版本的错误信息(UncaughtExceptionHandler)的相关文章

swoole-1.7.18 版本已发布,支持 PHP7

swoole-1.7.18 版本已发布,支持 PHP7 matyhtf 发布于: 2015年07月23日 (22评) 分享到:  收藏 +16 3月19日,深圳源创会火热报名中,go>>>»   PHP 的异步并行网络扩展 swoole1.7.18 版本已发布,此版本增加了对PHP7的支持.下载地址: http://pecl.php.net/package/swoole http://git.oschina.net/matyhtf/swoole/tree/swoole-1.7.18-st

Android错误信息的汇总

犯过的错给自己提个醒 [错误信息] [2011-01-19 16:39:10 - ApiDemos] WARNING: Application does not specify an API level requirement! [2011-01-19 16:39:10 - ApiDemos] Device API version is 8 (Android 2.2) 原因: 不影响正常运行.在AndroidManifest.xml文件中没有加API的版本号,在<manifest> </

学习笔记6-Android查看应用输出的错误信息 如何部署应用到真实手机 发布软件

查看应用输出的错误信息 1.      通过LogCat窗口查看信息 右上角图标可以筛选不同级别的信息(比如info等). 右上角的+可以进行信息筛选 把应用部署到真实手机 1.      要把手机的驱动安装到电脑上 2.      将手机通过usb链接到电脑上 打开设备管理试图(Devices),手机链接到电脑上的时候自己的手机就会出现在这个列表里面. 右击项目run as →application 可以选择我们链接上的手机.就安装到真是的手机了. 发布软件(打包成APK) 右击项目Expor

[开源类库/项目] android保存崩溃时的错误信息log至本地【源码+jar包+使用说...

不知大家是否经常遇到这种情况:自己的项目有时会在没有连接到电脑时发生崩溃,好不容易发现的bug结果连接到电脑时又复现不出来了:又或者自己写的一个功能在开机启动时产生小bug导致崩溃,而刚启动的机器想让他打出log又不是那么容易.此时我们有必要将程序的崩溃信息写入本地的文件,方便我们做bug的修复.本项目为开源共同讨论的,奉上项目源码(有javadoc),以及打包好的jar包还有jar包的使用手册. 如果看官自行阅读源码,代码均有注释,应该简明易懂.如果看官想直接使用,请看下文的使用手册.推荐直接

Oracle 通过ADR工具 收集ORA-600错误信息

 问题描述: 2014-06-10 在点检数据库预警文件时,出现Ora -00600 错误,并且Rman L1 备份失败,查询相关资料,得知是Bug:9835218.于是,提SR寻求Oracle 官方技术支持. Oracle回复如下: Your Service Request has been submitted as anORA-600/ORA-7445 issue based on the problem type you chose when logging the SR. Additio

PhoneGap/Cordova Android应用签名发布系列问题处理收集

PhoneGap/Cordova Android应用签名发布注意事项 Android APK 签名比对 android获取签名,兼容5.0 Android APK 签名比对,防止软件被破解使用 用apktool和dex2jar反编译 Android proguard代码混淆 获取已安装或未安装的apk签名

Android 打包出现jdk版本错误的问题

Android 打包出现 jdk 版本错误的问题,本质上是 SDK 的问题,与 JDK 无关.如果 SDK 的 API 是24或者更高,就要求 jdk 1.8,我这里指定的 API 是22,所以去勾选22的 SDK Platform 进行安装. [dex] Pre-Dexing D:\Jenkins\workspace\Android\Bugtags-Android-Eclipse-Lib\bin\classes.jar -> classes-3f7282283aa00 a87ee9fdbff3

金笛短信中间件Web版本和研发信息发布

金笛短信中间件VC版经过8年的不断完善,一直在客户中拥有良好的口碑.随着产品用户群日益扩大, 更多客户提出基于WEB收发.管理的需求. 金笛短信中间件Web版从金笛JAVA开发包发展而来,历时V3.1,V3.2,V3.3, V3.4, V3.5各个版本,不觉已经5个春秋. 在这个春日盎然.煦日洋溢的日子里,金笛短信中间件Web版V3.6.1隆重发布了!新版本有更多激动人心的功能.这个版本在推出之前,已经经过长时间的测试与完善,经过多年的技术积累和沉淀,相信这个版本的稳定性和智能化会给您留下印象.

系统断定检查已失败。有关详细信息,请查看 SQL Server 错误日志

[1]报错信息 运行删除时报错 操作的删除语句: IF OBJECT_ID('tempdb..#temp_Robot') IS NOT NULL DROP TABLE #temp_Robot CREATE TABLE #temp_Robot(UserID INT NOT NULL PRIMARY KEY) select * from #temp_robot INSERT INTO #temp_Robot SELECT UserID FROM Db_Tank..Sys_Users_Order WH