android 捕獲系統(tǒng)異常并上傳日志具體實(shí)現(xiàn)
在做項(xiàng)目時(shí),經(jīng)常會(huì)把錯(cuò)誤利用異常拋出去,這樣在開發(fā)時(shí)就可以通過手機(jī)拋出的異常排查錯(cuò)誤。但是當(dāng)程序開發(fā)完畢,版本穩(wěn)定,需要上線時(shí),為了避免拋出異常影響用戶感受,可以用UncaughtExceptionHandler捕獲全局異常,對(duì)異常做出處理。比如我們可以獲取到拋出異常的時(shí)間、手機(jī)的硬件信息、錯(cuò)誤的堆棧信息,然后將獲取到的所有的信息發(fā)送到服務(wù)器中,也可以發(fā)送到指定的郵件中,以便及時(shí)修改bug。
示例:
自定義異常類實(shí)現(xiàn)UncaughtExceptionHandler接口,當(dāng)某個(gè)頁(yè)面出現(xiàn)異常就會(huì)調(diào)用uncaughtException這個(gè)方法,我們可以在這個(gè)方法中獲取異常信息、時(shí)間等,然后將獲取到的信息發(fā)送到我們指定的服務(wù)器
/**
* 自定義的 異常處理類 , 實(shí)現(xiàn)了 UncaughtExceptionHandler接口
* @author Administrator
*
*/
public class MyCrashHandler implements UncaughtExceptionHandler {
// 需求是 整個(gè)應(yīng)用程序 只有一個(gè) MyCrash-Handler
private static MyCrashHandler myCrashHandler ;
private Context context;
private DoubanService service;
private SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
//1.私有化構(gòu)造方法
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.獲取當(dāng)前程序的版本號(hào). 版本的id
String versioninfo = getVersionInfo();
// 2.獲取手機(jī)的硬件信息.
String mobileInfo = getMobileInfo();
// 3.把錯(cuò)誤的堆棧信息 獲取出來(lái)
String errorinfo = getErrorInfo(arg1);
// 4.把所有的信息 還有信息對(duì)應(yīng)的時(shí)間 提交到服務(wù)器
try {
service.createNote(new PlainTextConstruct(dataFormat.format(new Date())),
new PlainTextConstruct(versioninfo+mobileInfo+errorinfo), "public", "yes");
} catch (Exception e) {
e.printStackTrace();
}
//干掉當(dāng)前的程序
android.os.Process.killProcess(android.os.Process.myPid());
}
/**
* 獲取錯(cuò)誤的信息
* @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;
}
/**
* 獲取手機(jī)的硬件信息
* @return
*/
private String getMobileInfo() {
StringBuffer sb = new StringBuffer();
//通過反射獲取系統(tǒng)的硬件信息
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();
}
/**
* 獲取手機(jī)的版本信息
* @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 "版本號(hào)未知";
}
}
}
創(chuàng)建一個(gè)Application實(shí)例將MyCrashHandler注冊(cè)到整個(gè)應(yīng)用程序上,創(chuàng)建出服務(wù)并進(jìn)行傳遞:
/**
* 整個(gè)(app)程序初始化之前被調(diào)用
* @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);
}
}
相關(guān)文章
android 觸屏的震動(dòng)響應(yīng)接口調(diào)用方法
android 相關(guān)開發(fā)過程中,經(jīng)常會(huì)使用到觸屏的震動(dòng)響應(yīng)接口,為此本文列出以下方法,想要了解的朋友可以參考下2012-11-11
Android編程動(dòng)態(tài)修改RelativeLayout寬高的方法
這篇文章主要介紹了Android編程動(dòng)態(tài)修改RelativeLayout寬高的方法,涉及Android動(dòng)態(tài)布局的相關(guān)技巧,需要的朋友可以參考下2015-12-12
android開發(fā)之蜂鳴提示音和震動(dòng)提示的實(shí)現(xiàn)原理與參考代碼
蜂鳴提示音和震動(dòng)提示此功能在手機(jī)使用中很實(shí)用,最近在讀zxing項(xiàng)目,學(xué)到了不少東西;我們一起來(lái)看看他是怎么做的,感興趣的朋友可以了解下哦2013-01-01
Android 屬性動(dòng)畫原理與DataBinding
這篇文章主要介紹了Android 屬性動(dòng)畫原理與DataBinding的相關(guān)資料,需要的朋友可以參考下2017-04-04
詳解Android App中ViewPager使用PagerAdapter的方法
這篇文章主要介紹了詳解Android App中ViewPager使用PagerAdapter的方法,同時(shí)附帶了一個(gè)ViewPager的PagerAdapter不能更新數(shù)據(jù)的問題解決方法,需要的朋友可以參考下2016-03-03
Android之在linux終端執(zhí)行shell腳本直接打印當(dāng)前運(yùn)行app的日志的實(shí)現(xiàn)方法
今天小編就為大家分享一篇關(guān)于Android之在linux終端執(zhí)行shell腳本直接打印當(dāng)前運(yùn)行app的日志的實(shí)現(xiàn)方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
Android制作一個(gè)錨點(diǎn)定位的ScrollView
這篇文章主要介紹了Android制作一個(gè)錨點(diǎn)定位的ScrollView,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-04-04
android將圖片轉(zhuǎn)換存到數(shù)據(jù)庫(kù)再?gòu)臄?shù)據(jù)庫(kù)讀取轉(zhuǎn)換成圖片實(shí)現(xiàn)代碼
有時(shí)候我們想把圖片存入到數(shù)據(jù)庫(kù)中,盡管這不是一種明智的選擇,但有時(shí)候還是不得以會(huì)用到,下面說(shuō)說(shuō)將圖片轉(zhuǎn)換成byte[]數(shù)組存入到數(shù)據(jù)庫(kù)中去,并從數(shù)據(jù)庫(kù)中取出來(lái)轉(zhuǎn)換成圖像顯示出來(lái)2013-11-11
Android實(shí)現(xiàn)拍照或者選取本地圖片
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)拍照或者選取本地圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

