异常的捕获UnCatchHandler

依赖
implementation ‘com.tencent.bugly:crashreport:2.8.6’

Xml

<EditText
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    
        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintTop_toBottomOf="@id/edit"
            />

MainActivity

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final EditText editText=findViewById(R.id.withText);
    Button button=findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(MainActivity.this, editText.getText().toString(), Toast.LENGTH_SHORT).show();
        }

    });
  }
}

App

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

    UnCatchHandler.getInstance(getApplicationContext()).init(getApplicationContext());
}

UnCachHandler

public class UnCatchHandler implements Thread.UncaughtExceptionHandler {

private static UnCatchHandler mUnCatchHandler;
private Context mContext;

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();
    }
}

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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值