Back to project page android-utils.
The source code is released under:
Apache License
If you think the Android project android-utils listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
/** * Copyright 2014 Zhenguo Jin/* w w w . ja v a 2s . c om*/ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.worthed.app; import java.io.File; import java.io.FileOutputStream; import java.lang.Thread.UncaughtExceptionHandler; import java.util.Date; import com.worthed.util.LogUtils; import android.content.Context; import android.os.Environment; import android.os.Looper; import android.widget.Toast; /** * ?Application?????????????????????????? * * @author jingle1267@163.com */ public class BaseCrashHandler implements UncaughtExceptionHandler { /** * ????????????,?Debug????????, ?Release???????????????? */ public static final boolean DEBUG = true; /** * ?????UncaughtException????? */ private Thread.UncaughtExceptionHandler mDefaultHandler; /** * CrashHandler?? */ private static BaseCrashHandler INSTANCE; private Context mContext; /** * ??????????CrashHandler?? */ private BaseCrashHandler() { } /** * ????CrashHandler?? ,??????? */ public static BaseCrashHandler getInstance() { if (INSTANCE == null) { INSTANCE = new BaseCrashHandler(); } return INSTANCE; } /** * ????,??Context??, ?????????UncaughtException?????, ???CrashHandler???????????? * * @param context ??? */ public void init(Context context) { mContext = context; mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(this); } /** * ?UncaughtException?????????????????? */ @Override public void uncaughtException(Thread thread, Throwable ex) { if (!handleException(ex) && mDefaultHandler != null) { // ??????????????????????????????? mDefaultHandler.uncaughtException(thread, ex); } else { // ?????????????????????????????????app try { Thread.sleep(3000); } catch (InterruptedException e) { } android.os.Process.killProcess(android.os.Process.myPid()); System.exit(10); } } /** * ?????????,???????? ?????????????????????. ???????????????????????????????? * * @return true?????????????????????? * false???????????(??????log??????????)????????(??????????????)?????? * ??????????true???????????????false???? */ private boolean handleException(final Throwable ex) { if (ex == null) { return false; } final StackTraceElement[] stack = ex.getStackTrace(); final String message = ex.getMessage(); // ??Toast??????????? new Thread() { @Override public void run() { Looper.prepare(); Toast.makeText(mContext, "???????,3???????????????,???????,?????????,?????????????!", Toast.LENGTH_LONG).show(); LogUtils.i(message); dosave(stack, message); Looper.loop(); } private void dosave(final StackTraceElement[] stack, final String message) { // ???????????? String fileName = "crash-" + new Date().getTime() + ".txt"; File file = new File(Environment.getExternalStorageDirectory() + "/log"); if (!file.exists()) { file.mkdirs(); } File file1 = new File(file, fileName); try { FileOutputStream fos = new FileOutputStream(file1, true); fos.write(message.getBytes()); for (int i = 0; i < stack.length; i++) { fos.write(stack[i].toString().getBytes()); } fos.flush(); fos.close(); } catch (Exception e) { } } }.start(); return true; } /** * ?????????? * * @return */ public String getPhoneInfo() { String phoneInfo = "Product: " + android.os.Build.PRODUCT; phoneInfo += ", CPU_ABI: " + android.os.Build.CPU_ABI; phoneInfo += ", TAGS: " + android.os.Build.TAGS; phoneInfo += ", VERSION_CODES.BASE: " + android.os.Build.VERSION_CODES.BASE; phoneInfo += ", MODEL: " + android.os.Build.MODEL; phoneInfo += ", SDK: " + android.os.Build.VERSION.SDK_INT; phoneInfo += ", VERSION.RELEASE: " + android.os.Build.VERSION.RELEASE; phoneInfo += ", DEVICE: " + android.os.Build.DEVICE; phoneInfo += ", DISPLAY: " + android.os.Build.DISPLAY; phoneInfo += ", BRAND: " + android.os.Build.BRAND; phoneInfo += ", BOARD: " + android.os.Build.BOARD; phoneInfo += ", FINGERPRINT: " + android.os.Build.FINGERPRINT; phoneInfo += ", ID: " + android.os.Build.ID; phoneInfo += ", MANUFACTURER: " + android.os.Build.MANUFACTURER; phoneInfo += ", USER: " + android.os.Build.USER; return phoneInfo; } }