Android捕获全局异常信息并实现上传

上一篇 / 下一篇  2012-04-11 09:31:47 / 个人分类:杂谈

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

w EB.QEu0  示例:51Testing软件测试网'Z5pE9F"?"Qr

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

+[ K"rV b;V.R9xACG051Testing软件测试网 Eo Dk;e z

vbafo~0
51Testing软件测试网q l/P-o,U${k?&C

/**51Testing软件测试网k3E0t}\/H
 * 自定义的 异常处理类 , 实现了 UncaughtExceptionHandler接口51Testing软件测试网]2[7w%q u$P/[
 * @author Administrator51Testing软件测试网IS&mn R9i1O5Sf
 *51Testing软件测试网e9{Z cH}(Y\j(x
 */
iSh ~Ma\8^N:{0public class MyCrashHandler implements UncaughtExceptionHandler {
Ng(n-xb#oC9e+a0 // 需求是 整个应用程序 只有一个 MyCrash-Handler
&AlIN8i(w#DbK;@%Z0 private static MyCrashHandler myCrashHandler ;51Testing软件测试网Ai$oBn'r|U
 private Context context;
4vrs0M m0 private DoubanService service;
k;goju8|u6cm0 private SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");51Testing软件测试网{'Z9Iy'VC{,A
 51Testing软件测试网pEt!KjC`;j_&n
 //1.私有化构造方法
g] k@,E^-?!E$c0 private MyCrashHandler(){
QNL#K3X7Cr L0  51Testing软件测试网aYE(fK${1ACILp
 }51Testing软件测试网.W T([M'{"Fu
 
qF-}~~ Xn\c0 public static synchronized MyCrashHandler getInstance(){
o}&AkQ2q6] ]0  if(myCrashHandler!=null){
Xk;I2P$E1W*q"p o0   return myCrashHandler;51Testing软件测试网s#whP%x8k8y
  }else {
-r0P+P~ \v-R0   myCrashHandler  = new MyCrashHandler();51Testing软件测试网F*R#xa;U1kaZ'eW-c
   return myCrashHandler;
p|3ak(K)} uT0  }51Testing软件测试网T-mb w T;_H(r
 }51Testing软件测试网!@2j _3\.a
 public void init(Context context,DoubanService service){51Testing软件测试网T2P%D;s8O8L/TR
  this.context = context;
9F2P j&o a!b;Ny0  this.service = service;51Testing软件测试网 y5`Q.q L2c;E
 }51Testing软件测试网/| wh3qN&GP
 

%\(N$k%bh.B0

-Y~j+Uy0y2\0 public void uncaughtException(Thread arg0, Throwable arg1) {51Testing软件测试网te#G1gS'Xo0`^
  System.out.println("程序挂掉了 ");
.Ta+z$b[%t,bS7P7J0  // 1.获取当前程序的版本号. 版本的id51Testing软件测试网 F2k}q g ^W
  String versioninfo = getVersionInfo();51Testing软件测试网@#X*u(f3P6OJ^3` [
  51Testing软件测试网EIL3] H.h*a
  // 2.获取手机的硬件信息.
(G9d d2G1Z[ j;I0  String mobileInfo  = getMobileInfo();
Mxh0Eux(q1c}0  51Testing软件测试网+I7l2B1Ar{f&@
  // 3.把错误的堆栈信息 获取出来
tP:OB7Q2qI-O1Y.}0  String errorinfo = getErrorInfo(arg1);51Testing软件测试网n%O_ \ j,P5a
  51Testing软件测试网 g } h/H {[3Y;@X
  // 4.把所有的信息 还有信息对应的时间 提交到服务器
b5l~1@,A}$u?0  try {
3Uq!x k6DN }M0   service.createNote(new PlainTextConstruct(dataFormat.format(new Date())),
\\3h)d vr&b0     new PlainTextConstruct(versioninfo+mobileInfo+errorinfo), "public", "yes");
C"U?I!V:KiZ0  } catch (Exception e) {51Testing软件测试网 Q/v;vyz0s nH5C z
   e.printStackTrace();
\t r'Ob8m0  }
(o7BdO^~B$O|$Q0 
,j8xK,x Mj2q2x0  //干掉当前的程序51Testing软件测试网,a;Ypni ];M%` r
  android.os.Process.killProcess(android.os.Process.myPid());51Testing软件测试网P z8N/C6Qh|S ? N8JT
 }

6{#jxQe5M X0

8}M kI}k0 /**51Testing软件测试网3w9RIP7gv
  * 获取错误的信息51Testing软件测试网L|'l5ie
  * @param arg1
4G}U*vF1B:Oq0  * @return
.w4{:HB-s&i3Y`d8k0  */51Testing软件测试网k6CC-iUkF
 private String getErrorInfo(Throwable arg1) {
VE&}%ukv6G0  Writer writer = new StringWriter();
%O\0x&] L s%fq0  PrintWriter pw = new PrintWriter(writer);
g7}^[Q4k%r)KW_0  arg1.printStackTrace(pw);
+D&?(~:RzIW(_0  pw.close();
c_BP'Y'k0ya0  String error= writer.toString();51Testing软件测试网S%aX q(I
  return error;
@P N,k X`5Z0 }51Testing软件测试网4oa5S z t%I_y:d$c

51Testing软件测试网Hp(|RyT |-S

 /**
*q:g |T5^0  * 获取手机的硬件信息
*@'uU!sQh(oo&G8q7_0  * @return51Testing软件测试网5us+F)mK9fd
  */
+k[ Z/Hx~#R0 private String getMobileInfo() {51Testing软件测试网B~9F@+Z sq$DI-z?f
  StringBuffer sb = new StringBuffer();
6MTF&Yd,l.X0  //通过反射获取系统的硬件信息51Testing软件测试网lR7C}?Gs
  try {

Fi_ z mq;qt051Testing软件测试网0~ f'L(`6x1k4T

   Field[] fields = Build.class.getDeclaredFields();
2U g3IJ^r {+q0   for(Field field: fields){
+F6[Z#g*[L L{_0    //暴力反射 ,获取私有的信息51Testing软件测试网R3@(_'B9g s@&M'v
    field.setAccessible(true);51Testing软件测试网&Sh]bk&D
    String name = field.getName();
|eBya"_`2j9Q ^0    String value = field.get(null).toString();
/_O6M:i^V:O p5v0    sb.append(name+"="+value);51Testing软件测试网T&R[snB
    sb.append("\n");
x$F2rgz6f(Li0   }51Testing软件测试网#h0Cy/PZ4Cin
  } catch (Exception e) {
{n$]7OIHJ?$k!Lr0   e.printStackTrace();51Testing软件测试网k&L a i/l
  }51Testing软件测试网9A }qw@6m [
  return sb.toString();
'spqCg(D6_0 }51Testing软件测试网|9__N4R-^

#S0Q\uW{0 /**
n%T0IxH0  * 获取手机的版本信息
;A8W2}YU T p5|"\/C9^0  * @return51Testing软件测试网.~1V Zq_)C/~!`
  */
K4x u%Ji/sA0 private String getVersionInfo(){51Testing软件测试网g2T rXz
  try {51Testing软件测试网g5R3[sJ)aT-w2k}S
   PackageManager pm = context.getPackageManager();51Testing软件测试网r})?a[;AR,_1l
    PackageInfo info =pm.getPackageInfo(context.getPackageName(), 0);51Testing软件测试网4z]? tH'mA
    return  info.versionName;
-](lb|*M{0  } catch (Exception e) {51Testing软件测试网P+BAH*i M kf)}
   e.printStackTrace();51Testing软件测试网'\@)xQ o;Oo?S$^
   return "版本号未知";51Testing软件测试网$nEe(Ic#o\
  }
H:Nn~+xU2i8TI"q K0 }51Testing软件测试网[ m,R.d lH(P
}

,mjLh h\,C{1MR0
51Testing软件测试网%WKz J8@p/N~}o

0]-p:Ch&xj;_051Testing软件测试网@q Kqa:XAVR3c%`_Z

  创建一个Application实例将MyCrashHandler注册到整个应用程序上,创建出服务并进行传递:

5Hg'M;DH;u"I!B[051Testing软件测试网)mXF^F\

51Testing软件测试网"\ li.Q:b!`

/**51Testing软件测试网HOb)XB7|bxP X9[
 * 整个(app)程序初始化之前被调用
|$X"w@8Q0 * @author Administrator
$_6hpO.im0 *51Testing软件测试网|T,Q\_z N3v^
 */51Testing软件测试网sM fYC6O9m
public class DoubanApplication extends Application {
]|[2Bp%p0  public NoteEntry entry;51Testing软件测试网j5y$`0w*p
 @Override51Testing软件测试网a9A`SF&c\s
 public void onCreate() {51Testing软件测试网NF G WU
  super.onCreate();51Testing软件测试网8pJ'Wt.L?OZF^
  String apiKey = "0fab7f9aa21f39cd2f027ecfe65dad67";51Testing软件测试网#rwN8]j;z R9u&?2n
  String secret = "87fc1c5e99bfa5b3";
7t5LV7l8g`9g-\0  // 获取到service51Testing软件测试网cz1X5~Cm
  DoubanService myService = new DoubanService("我的小豆豆", apiKey,51Testing软件测试网 WJ9RwW1l P]?
    secret);
v;v POX X y0  myService.setAccessToken("1fa4e5be0f808a0b5eeeb13a2e819e21", "56a622c1138dbfce");51Testing软件测试网B#`n$hl1tdS/c/U,M k&?
  MyCrashHandler handler = MyCrashHandler.getInstance();
s'Ip g#Ba%VN'Y0  handler.init(getApplicationContext(),myService);
+E7_3T"m#P:\^!I2m0  Thread.setDefaultUncaughtExceptionHandler(handler);
{JUNvr+o0 }
6`w}aF0}

|;MB,F{0

wxoX I8q"}4n0

TAG:

 

评分:0

我来说两句

Open Toolbar