通過自定義handler實現Thread.UncaughtExceptionHandler,實現全域性捕獲異常,或者第二種方式可以通過騰訊bugly自動整合,可在bugly文件中心檢視使用指南
全域性捕獲異常類需要的的許可權
//向sd卡寫的許可權
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
//讀sd卡的許可權
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
//獲取手機資訊許可權
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
//獲取網路請求的許可權
<uses-permission android:name="android.permission.INTERNET" />
//獲取網路狀態許可權
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
//獲取WiFi狀態許可權
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
//讀取log日誌許可權
<uses-permission android:name="android.permission.READ_LOGS"
tools:ignore="ProtectedPermissions" />
UnCatchHandler異常捕獲
package com.bawei.uncatchhandler;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 全域性捕獲異常類,實現Thread.UncaughtExceptionHandler
* @author hasee
*/
public class UnCatchHandler implements Thread.UncaughtExceptionHandler {
private static UnCatchHandler mUnCatchHandler;
private Context mContext;
/**
* 一定要寫個單例
* @return
*/
public static UnCatchHandler getInstance(Context context) {
if(mUnCatchHandler == null){
synchronized (UnCatchHandler.class) {
mUnCatchHandler = new UnCatchHandler(context);
}
}
return mUnCatchHandler;
}
private UnCatchHandler(Context context) {
init(context);
}
public void init(Context context) {
//獲取預設的系統異常捕獲器
//把當前的crash捕獲器設定成預設的crash捕獲器
Thread.setDefaultUncaughtExceptionHandler(this);
mContext = context.getApplicationContext();
}
/**
* 儲存我們丟擲的異常至SD卡
* @param t
* @param e
*/
@Override
public void uncaughtException(Thread t, Throwable e) {
try {
//如果不需要寫到SD卡,則不需要開啟以下注釋
// saveSD(e);
//列印異常資訊
Log.i("1607C", e.getLocalizedMessage());
} catch (Exception ex) {
ex.printStackTrace();
}
}
// /**
// * 儲存sd卡
// */
// private void saveSD(Throwable throwable) throws Exception {
// //判斷SD卡狀態
// //MEDIA_MOUNTED 儲存媒體已經掛載,並且掛載點可讀/寫
// if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
// //徹底退出
// android.os.Process.killProcess(android.os.Process.myPid());
// System.exit(0);
// return;
// }
//
// //獲取手機的一些資訊
// PackageManager pm = mContext.getPackageManager();
// PackageInfo inFo = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);
//
// //獲取版本資訊
// String versionName = inFo.versionName;
// int versionCode = inFo.versionCode;
//
// int version_code = Build.VERSION.SDK_INT;
//
// //Android版本號
// String release = Build.VERSION.RELEASE;
// //手機型號
// String mobile = Build.MODEL;
//
// //手機制造商
// String mobileName = Build.MANUFACTURER;
//
// //儲存至sdCard下
// String path = Environment.getExternalStorageDirectory().getAbsolutePath();
//
// SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
// String time = simpleDateFormat.format(new Date());
//
// //找到資料夾路徑,建立exception資料夾
// File f = new File(path, "exception");
// f.mkdirs();
//
// //找到資料夾路徑,查詢exception + time的txt資料夾
// File file = new File(f.getAbsolutePath(), "exception" + time + ".txt");
//
// //如果檔案沒有,則建立
// if (!file.exists()) {
// file.createNewFile();
// }
//
// String data = "\nMobile型號:" + mobile + "\nMobileName:" + mobileName + "\nSDK版本:" + version_code +
// "\n版本名稱:" + versionName + "\n版本號:" + versionCode + "\n異常資訊:" + throwable.toString();
//
// Log.i("dj", data);
//
// //以下是寫入檔案
// byte[] buffer = data.trim().getBytes();
// FileOutputStream fileOutputStream = new FileOutputStream(file);
// // 開始寫入資料到這個檔案。
// fileOutputStream.write(buffer, 0, buffer.length);
// fileOutputStream.flush();
// fileOutputStream.close();
//
// android.os.Process.killProcess(android.os.Process.myPid());
// System.exit(0);
// }
}
MyApplication 需要清單檔案中註冊
package com.bawei.uncatchhandler;
import android.app.Application;
import com.tencent.bugly.crashreport.CrashReport;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
UnCatchHandler.getInstance(getApplicationContext()).init(getApplicationContext());
// CrashReport.initCrashReport(getApplicationContext(), "f9f67393ee", true);
}
}
自動整合bugly文件網址
https://bugly.qq.com/docs/user-guide/instruction-manual-android/?v=20181014122344
相關文章
- Flutter 通過Clipper實現各種自定義形狀Flutter
- 如何自定義一個全域性異常捕獲器-SpiderManIDE
- 聊聊如何通過自定義註解實現springmvc和sentinel整合SpringMVC
- wpf 捕獲全域性異常
- SpringBoot之全域性捕獲異常Spring Boot
- Feign通過自定義註解實現路徑的轉義
- android 螢幕適配一:通過自定義View的方式實現適配AndroidView
- 通過 App Groups 實現程式間通訊APP
- 通過佇列實現棧OR通過棧實現佇列佇列
- 儲存過程——異常捕獲&列印異常資訊儲存過程
- WPF 通過程式實現異常隔離的客戶端客戶端
- spring boot 實現監聽器、過濾器、全域性異常處理Spring Boot過濾器
- 中介軟體自定義檢測 JWT 並通過自定義異常丟擲錯誤--筆記JWT筆記
- 【android】自定義佈局控制控制元件的位置可以通過繼承FrameLayout實現Android控制元件繼承
- 異常-自定義異常的實現和測試
- React - Context API 維護全域性狀態,實現全域性元件通訊ReactContextAPI元件
- 通過激勵協作實現語義 Web 的弱中心化Web中心化
- 如何利用 Netty 實現自定義協議通訊?Netty協議
- LRU 實現 通過 LinkedHashMapHashMap
- 通過模板實現POI
- 如何動手實現一個自定義的通訊協議?協議
- 通過自動化和現代化實現網路優化優化
- Java的通過管道來實現執行緒通訊Java執行緒
- Android Studio通過style和layer-list實現自定義進度條Android
- Python Selenium實現自動觀看學習通視訊Python
- Feign失敗重試與全域性異常捕獲
- Android 騰訊Bugly熱更新接入(Kotlin語言)AndroidKotlin
- 通過redis實現session共享RedisSession
- Rainbond通過外掛整合SkyWalking,實現APM即插即用AI
- 通過Gradle自動實現Android元件化模組構建GradleAndroid元件化
- 【實戰】通過Python實現疫情地圖視覺化Python地圖視覺化
- Webview獨立程式並通過AIDL實現資料通訊WebViewAI
- vue-video-player,通過自定義按鈕元件實現全屏切換效果VueIDE元件
- 通過Gradle Plugin實現Git Hooks檢測機制GradlePluginGitHook
- Android技術分享| Bugly 應用升級自定義UIAndroidUI
- Vue3 如何實現全域性異常處理?Vue
- Task異常捕獲的方式
- 驅動開發:透過應用堆實現多次通訊