Android-Send application crash report to developer
-->
-->
Implemented by objects that want to
handle cases where a thread is being terminated by an uncaught
exception. Upon such termination, the handler is notified of the
terminating thread and causal exception. If there is no explicit
handler set then the thread's group is the default handler.
Below I wrote the code user can send some bug report to Developer when the application crashed.
Activity Code
-->
import
android.app.Activity;
import
android.os.Bundle;
import
android.widget.TextView;
import
android.widget.ViewFlipper;
/**
*
*
@author
vijayakumar
*
*/
public
class
AndroidMADQAActivity extends
Activity {
ViewFlipper flipper;
TextView textView
= null;
Throwable throwable;
UnCaughtException un
= null;
@Override
public
void
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Thread.setDefaultUncaughtExceptionHandler(new
UnCaughtException(AndroidMADQAActivity.this));
Integer[] items
= { R.drawable.a,
R.drawable.e,R.drawable.d,R.drawable.c};
setContentView(R.layout.main);
textView.setText("Helloo
Error Welcome");
}
}
Screen Shot
User Got Alert When Application Crashed! |
When User click Report Button |
Developer Got Bug Report In EMail |
UnCaughtException.Class
-->
package
com.madqa;
import
java.io.File;
import
java.io.PrintWriter;
import
java.io.StringWriter;
import
java.io.Writer;
import
java.lang.Thread.UncaughtExceptionHandler;
import
java.util.Date;
import
java.util.Locale;
import
android.app.AlertDialog;
import
android.content.Context;
import
android.content.DialogInterface;
import
android.content.Intent;
import
android.content.pm.PackageInfo;
import
android.content.pm.PackageManager;
import
android.net.Uri;
import
android.os.Environment;
import
android.os.Looper;
import
android.os.StatFs;
import
android.util.Log;
/**
*
{@link UncaughtExceptionHandler}
send an e-mail
with
*
some debug information to the developer.
*
*
@author
VIJAYAKUMAR
*/
public
class
UnCaughtException implements
UncaughtExceptionHandler {
private
static
final
String RECIPIENT
= "iamvijayakumar@gmail.com";
private
Thread.UncaughtExceptionHandler previousHandler;
private
Context context;
private
static
Context context1;
public
UnCaughtException(Context ctx) {
context
= ctx;
context1
= ctx;
}
private
StatFs getStatFs() {
File path =
Environment.getDataDirectory();
return
new
StatFs(path.getPath());
}
private
long
getAvailableInternalMemorySize(StatFs stat) {
long
blockSize = stat.getBlockSize();
long
availableBlocks = stat.getAvailableBlocks();
return
availableBlocks * blockSize;
}
private
long
getTotalInternalMemorySize(StatFs stat) {
long
blockSize = stat.getBlockSize();
long
totalBlocks = stat.getBlockCount();
return
totalBlocks * blockSize;
}
private
void
addInformation(StringBuilder message) {
message.append("Locale:
").append(Locale.getDefault()).append('\n');
try
{
PackageManager pm =
context.getPackageManager();
PackageInfo pi;
pi =
pm.getPackageInfo(context.getPackageName(),
0);
message.append("Version:
").append(pi.versionName).append('\n');
message.append("Package:
").append(pi.packageName).append('\n');
}
catch
(Exception e) {
Log.e("CustomExceptionHandler",
"Error",
e);
message.append("Could
not get Version information for ").append(
context.getPackageName());
}
message.append("Phone
Model: ").append(android.os.Build.MODEL).append(
'\n');
message.append("Android
Version: ").append(
android.os.Build.VERSION.RELEASE).append('\n');
message.append("Board:
").append(android.os.Build.BOARD).append('\n');
message.append("Brand:
").append(android.os.Build.BRAND).append('\n');
message.append("Device:
").append(android.os.Build.DEVICE).append('\n');
message.append("Host:
").append(android.os.Build.HOST).append('\n');
message.append("ID:
").append(android.os.Build.ID).append('\n');
message.append("Model:
").append(android.os.Build.MODEL).append('\n');
message.append("Product:
").append(android.os.Build.PRODUCT).append(
'\n');
message.append("Type:
").append(android.os.Build.TYPE).append('\n');
StatFs stat = getStatFs();
message.append("Total
Internal memory: ").append(
getTotalInternalMemorySize(stat)).append('\n');
message.append("Available
Internal memory: ").append(
getAvailableInternalMemorySize(stat)).append('\n');
}
public
void
uncaughtException(Thread t, Throwable e) {
try
{
StringBuilder report = new
StringBuilder();
Date curDate = new
Date();
report.append("Error
Report collected on :
").append(curDate.toString()).append('\n').append('\n');
report.append("Informations
:").append('\n');
addInformation(report);
report.append('\n').append('\n');
report.append("Stack:\n");
final
Writer result = new
StringWriter();
final
PrintWriter printWriter = new
PrintWriter(result);
e.printStackTrace(printWriter);
report.append(result.toString());
printWriter.close();
report.append('\n');
report.append("****
End of current Report ***");
Log.e(UnCaughtException.class.getName(),
"Error
while sendErrorMail"+report);
sendErrorMail(report);
}
catch
(Throwable ignore) {
Log.e(UnCaughtException.class.getName(),
"Error
while sending error e-mail",
ignore);
}
//
previousHandler.uncaughtException(t, e);
}
/**
*
This method for call alert dialog when application crashed!
*
@author
vijayakumar
*/
public
void
sendErrorMail(final
StringBuilder errorContent) {
final
AlertDialog.Builder builder= new
AlertDialog.Builder(context);
new
Thread(){
@Override
public
void
run() {
Looper.prepare();
builder.setTitle("Sorry...!");
builder.create();
builder.setNegativeButton("Cancel",
new
DialogInterface.OnClickListener() {
@Override
public
void
onClick(DialogInterface dialog, int
which) {
System.exit(0);
}
});
builder.setPositiveButton("Report",
new
DialogInterface.OnClickListener() {
@Override
public
void
onClick(DialogInterface dialog, int
which) {
Intent sendIntent =
new
Intent(Intent.ACTION_SEND);
String subject =
"Your App crashed! Fix it!";
StringBuilder body
= new
StringBuilder("Yoddle");
body.append('\n').append('\n');
body.append(errorContent).append('\n').append('\n');
//
sendIntent.setType("text/plain");
sendIntent.setType("message/rfc822");
sendIntent.putExtra(Intent.EXTRA_EMAIL,
new
String[] { RECIPIENT
});
sendIntent.putExtra(Intent.EXTRA_TEXT,
body.toString());
sendIntent.putExtra(Intent.EXTRA_SUBJECT,
subject);
sendIntent.setType("message/rfc822");
//
context.startActivity(Intent.createChooser(sendIntent, "Error
Report"));
context1.startActivity(sendIntent);
System.exit(0);
}
});
builder.setMessage("Unfortunately,This
application has stopped");
builder.show();
Looper.loop();
}
}.start();
}
}
Download Source Code