Wednesday, December 5, 2012

Android Send Application Crash Report to Developer

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


Android Animated GIF Image Example

Android Animated GIF Image Example
Below i added code for How To display animated GIF image in Layout. display animated GIF image in your application splash page or else any where.
Xml Code 

-->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="#ACC437"
android:textStyle="bold"
android:text="WelCome To This Blog"
android:textAppearance="?android:attr/textAppearanceLarge" />
<com.androidqa.AnimationView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
Screen Shot 

Activity Code  
-->


/**

* @author vijayakumar

*/
-->
import android.app.Activity;
import android.os.Bundle;
public class AndroidQAActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}

View Class
-->
/**

* @author vijayakumar

*/
-->

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Movie;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
public class AnimationView extends View {
private Movie mMovie;
private long mMovieStart;
private static final boolean DECODE_STREAM = true;
private static byte[] streamToBytes(InputStream is) {
ByteArrayOutputStream os = new ByteArrayOutputStream(1024);
byte[] buffer = new byte[1024];
int len;
try {
while ((len = is.read(buffer)) >= 0) {
os.write(buffer, 0, len);
}
} catch (java.io.IOException e) {
}
return os.toByteArray();
}
public AnimationView(Context context,AttributeSet attrs) {
super(context,attrs);
setFocusable(true);
java.io.InputStream is;
// YOUR GIF IMAGE Here
is = context.getResources().openRawResource(R.drawable.th_welcome); 
if (DECODE_STREAM) {
mMovie = Movie.decodeStream(is);
} else {
byte[] array = streamToBytes(is);
mMovie = Movie.decodeByteArray(array, 0, array.length);
}
}
@Override
public void onDraw(Canvas canvas) {
long now = android.os.SystemClock.uptimeMillis();
if (mMovieStart == 0) { // first time
mMovieStart = now;
}
if (mMovie != null) {
int dur = mMovie.duration();
if (dur == 0) {
dur = 3000;
}
int relTime = (int) ((now - mMovieStart) % dur);
Log.d("", "real time :: " +relTime);
mMovie.setTime(relTime);
mMovie.draw(canvas, getWidth() - 200, getHeight()-200);
invalidate();
}
}
}
Please Leave the FeedBack

Check out this may be help you

Related Posts Plugin for WordPress, Blogger...