public class MyApplication extends Application {
private Stack<Activity> mActivities = new Stack<>();
//當Activity create的時候放入到Stack
public void addToStack(Activity activity) {
mActivities.push(activity);
}
//當Activity 銷燬的時候
public void removeFromStack(Activity activity) {
mActivities.remove(activity);
}
@Override
public void onCreate() {
super.onCreate();
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, final Throwable ex) {
new Thread() {
@Override
public void run() {
//上傳處理程序錯誤
procesError(ex);
Looper.prepare();
//出現錯誤彈窗提示
AlertDialog.Builder builder = new AlertDialog.Builder(/*getApplicationContext()*/mActivities.peek());//這裏的上下文應該拿棧頂部的上下文
builder.setTitle("提示").setMessage("包抱歉,程序出錯,我們將盡快修復錯誤,確定退出程序")
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//1、其中一個界面出現錯誤應該退出整個應用程序而不是退出當前的界面
while (!mActivities.empty()) {
mActivities.pop().finish();
}
//當程序出現了不可預料的錯誤把錯誤捕獲了在殺掉程序進程
android.os.Process.killProcess(android.os.Process.myPid());
}
}).setCancelable(false).create().show();
Looper.loop();
}
}.start();
}
});
}
private void procesError(Throwable ex) {
File file = saveReport(ex);
uploadReport(file);
}
/*
生成錯誤日誌
*/
private File saveReport(Throwable ex) {
FileWriter writer = null;
PrintWriter printWriter = null;
try {
File file = new File(getFilesDir(), "" + System.currentTimeMillis());
writer = new FileWriter(file);
printWriter = new PrintWriter(writer);
writer.append("========Build==========\n");
writer.append(String.format("BOARD\t%s\n", Build.BOARD));
writer.append(String.format("BOOTLOADER\t%s\n", Build.BOOTLOADER));
writer.append(String.format("BRAND\t%s\n", Build.BRAND));
writer.append(String.format("CPU_ABI\t%s\n", Build.CPU_ABI));
writer.append(String.format("CPU_ABI2\t%s\n", Build.CPU_ABI2));
writer.append(String.format("DEVICE\t%s\n", Build.DEVICE));
writer.append(String.format("DISPLAY\t%s\n", Build.DISPLAY));
writer.append(String.format("FINGERPRINT\t%s\n", Build.FINGERPRINT));
writer.append(String.format("HARDWARE\t%s\n", Build.HARDWARE));
writer.append(String.format("HOST\t%s\n", Build.HOST));
writer.append(String.format("ID\t%s\n", Build.ID));
writer.append(String.format("MANUFACTURER\t%s\n", Build.MANUFACTURER));
writer.append(String.format("MODEL\t%s\n", Build.MODEL));
writer.append(String.format("SERIAL\t%s\n", Build.SERIAL));
writer.append(String.format("PRODUCT\t%s\n", Build.PRODUCT));
writer.append("========APP==========\n");
try {
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
int versionCode = packageInfo.versionCode;
String versionName = packageInfo.versionName;
writer.append(String.format("versionCode\t%s\n", versionCode));
writer.append(String.format("versionName\t%s\n", versionName));
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
writer.append("========Exception==========\n");
ex.printStackTrace(printWriter);
return file;
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
if (printWriter != null) {
printWriter.close();
}
}
}
/*
上傳錯誤日誌
*/
private void uploadReport(File report) {
OutputStream os = null;
FileInputStream fis = null;
try {
URL url = new URL(Constant.HOST + "/ErrorReportServlet");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("POST");
urlConnection.setDoOutput(true);
os = urlConnection.getOutputStream();
fis = new FileInputStream(report);
byte[] buf = new byte[1024 * 8];
int len = 0;
while ((len = fis.read(buf)) != -1) {
os.write(buf, 0, len);
}
int responseCode = urlConnection.getResponseCode();
Log.d("uploadReport", "" + responseCode);
} catch (Exception e) {
e.printStackTrace();
} finally {
close(os);
close(fis);
}
}
public static void close(Closeable closeable) {
if (closeable != null) {
try {
closeable.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Android中錯誤異常日誌管理(上傳服務器)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.