Use Custom View if Force Close happen,
![]() | ![]() | ![]() |
|---|---|---|
| Default dialog error | Error screen that you can customize | Error screen with log |
- Manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest >
...
<application>
...
<activityandroid:name=".log.SomeThingWrongActivity" />
</application>
</manifest>- BaseActivity.java
publicclassBaseActivityextendsAppCompatActivity {
@OverrideprotectedvoidonCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
//add this code to BaseActivity to use Custom Force Close ScreenThread.setDefaultUncaughtExceptionHandler(newExceptionHandler(this));
}
}- MainActivity.java
publicclassMainActivityextendsBaseActivity {
TextViewtextView;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//trigger Force CLose NowfindViewById(R.id.btn).setOnClickListener(v -> textView.setText(""));
}
}- log/ExceptionHandler.java
publicclassExceptionHandlerimplementsjava.lang.Thread.UncaughtExceptionHandler {
privatefinalActivitymyContext;
privatefinalStringLINE_SEPARATOR = "\n";
publicExceptionHandler(Activitycontext) {
myContext = context;
}
publicvoiduncaughtException(Threadthread, Throwableexception) {
StringWriterstackTrace = newStringWriter();
exception.printStackTrace(newPrintWriter(stackTrace));
StringBuildererrorReport = newStringBuilder();
errorReport.append("************ CAUSE OF ERROR ************\n\n");
errorReport.append(stackTrace.toString());
errorReport.append(LINE_SEPARATOR);
errorReport.append("************ DEVICE INFORMATION ***********\n");
errorReport.append("Brand: ");
errorReport.append(Build.BRAND);
errorReport.append(LINE_SEPARATOR);
errorReport.append("Device: ");
errorReport.append(Build.DEVICE);
errorReport.append(LINE_SEPARATOR);
errorReport.append("Model: ");
errorReport.append(Build.MODEL);
errorReport.append(LINE_SEPARATOR);
errorReport.append("Id: ");
errorReport.append(Build.ID);
errorReport.append(LINE_SEPARATOR);
errorReport.append("Product: ");
errorReport.append(Build.PRODUCT);
errorReport.append(LINE_SEPARATOR);
errorReport.append("************ FIRMWARE ************\n");
errorReport.append("SDK: ");
errorReport.append(Build.VERSION.SDK);
errorReport.append(LINE_SEPARATOR);
errorReport.append("Release: ");
errorReport.append(Build.VERSION.RELEASE);
errorReport.append(LINE_SEPARATOR);
errorReport.append("Incremental: ");
errorReport.append(Build.VERSION.INCREMENTAL);
errorReport.append(LINE_SEPARATOR);
Intentintent = newIntent(myContext, SomeThingWrongActivity.class);
intent.putExtra(SomeThingWrongActivity.DATA, errorReport.toString());
myContext.startActivity(intent);
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(10);
}
}- log/SomeThingWrongActivity.java
publicclassSomeThingWrongActivityextendsAppCompatActivity {
publicstaticStringDATA = "data_error";
@OverrideprotectedvoidonCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_some_thing_wrong);
TextViewtextView = findViewById(R.id.error);
Buttonbutton = findViewById(R.id.btn);
if (BuildConfig.DEBUG) textView.setVisibility(View.VISIBLE);
textView.setText(getIntent().getStringExtra(DATA));
//String[] data = new String[]{getIntent().getStringExtra(DATA)};//buat file dalam folder App// /storage/emulated/0/MyLibsTesting/MyFile.txt //try {// String fileName = "/"+ FunctionGLobal.getCurrentTime()+".txt";// String saveTo = "/LogsError";// FGFile.initFile(fileName, saveTo,data);//} catch (Exception e){// e.printStackTrace();//}button.setOnClickListener(v -> {
finishAffinity();
});
}
@OverridepublicvoidonBackPressed() {
finishAffinity();
}
}Copyright 2021 M. Fadli Zein


