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 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
hi vijaykumar,
ReplyDeletei need help you and hope you will.
i want to send mail form android intent.
mail is sending very well . but turning point is ass CC with sender's default id.
for that i have use given like.
http://stackoverflow.com/questions/2112965/how-to-get-the-android-devices-primary-e-mail-address
but did not working.
in accounts[] i get []. null . no mail id are get in that array. so , where are that problem ? i did't get .
plz help me.
Hello Anonymous,
ReplyDeletePlease Check your permission details in Manifest.
hi i m chintan .i have add permission in manifest.
ReplyDeletei can send mail very well. but same mail should be send to sender's id. so i that. i have use account manager but didn't get output.
This is code for getting sender's id.
ReplyDeletePattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+
Account[] accounts = AccountManager.get(getApplicationContext()).getAccounts();
for (Account account : accounts)
{
if (emailPattern.matcher(account.name).matches())
{
possibleEmail = account.name;
}
}
Hi chintan,
ReplyDeleteI will check then i will let you know...
thinks vijaykumar .i will wait for positive reply. because had so much try but did not get output.
ReplyDeletethanks again
hi vijaykumar ,
ReplyDeletei have one new query regarding sending email.
i used html format in Email .its looks good in body area and sending successfully from Gmail accounts. but same code are not supported for any other mail clients . like yahoo , hotmail , etc .
so what should be that solution . This two things are very depress to me . i hope you will help me.
thanks in again.
hi vijaykumar. i get user's Email id form device only if user select Gmail . other wise not and same if i send mail from Gmail then it shows my html format nicely. so , is that any rule that user can't access email client properties. ?
ReplyDeletehi vijaykumar . i am chintan. i got the result of above mail query. problem was that i am jst checking in emulator. its work beautifully in device.i got the result in next days and forget to remand you.sorry for late .By the way thanks because you was only person who help me at that time. thank you AGAIN.
ReplyDeleteThank you! Very useful!
ReplyDeleteGood POST.
ReplyDeleteOnly several of such organizations help in getting you an car finance even if
ReplyDeleteyou might have a bad credit score score or no credit ranking short term loans as annoying because your monthly premiums
are, student loan debt isn't all that bad.
Thank you, your code is working!
ReplyDeleteHi,
ReplyDeleteI used this source code but when i click the Report button it is not going for sending email instead it again prints the exception details in logcat. If I click cancel it does not get finished instead it again prints exception details in logcat and again displays the dialog box.
Can you please give me solution for this?
Thanks.