android 捕获系统异常并上传日志具体实现
在做项目时,经常会把错误利用异常抛出去,这样在开发时就可以通过手机抛出的异常排查错误。但是当程序开发完毕,版本稳定,需要上线时,为了避免抛出异常影响用户感受,可以用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 设置控件的颜色字体的方法