Here is mine - no cleanup / enhancements, right from my repository. Really
basic stuff. And it doesn't work in the emulator as there is no email
activity.
package com.newsrob;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.Thread.UncaughtExceptionHandler;
import java.util.regex.Pattern;
import android.app.Application;
import android.content.Intent;
import android.os.Build;
import android.util.Log;
public class NewsRob extends Application {
private static final String TAG = NewsRob.class.getSimpleName();
public static final boolean DEBUG = false;
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "NewsRob.onCreate()");
new NewsRobDefaultExceptionHandler(EntryManager.getInstance(NewsRob.this));
}
@Override
public void onTerminate() {
Log.d(TAG, "NewsRob.onTerminate()");
super.onTerminate();
}
}
class NewsRobDefaultExceptionHandler implementsThread.UncaughtExceptionHandler {
private EntryManager entryManager;
private UncaughtExceptionHandler oldDefaultExceptionHandler;
private static final String TAG = NewsRobDefaultExceptionHandler.class
.getSimpleName();
NewsRobDefaultExceptionHandler(EntryManager entryManager) {
this.entryManager = entryManager;
Log.d(TAG, "Default Exception Handler=" +
Thread.getDefaultUncaughtExceptionHandler());
oldDefaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
}
public void uncaughtException(Thread t, Throwable e) {
Log.e("NewsRob", "Caught the following exception: ", e);
StringBuilder message = new StringBuilder(
"Sorry!\n\nNewsRob hit a wall. Please send this mail, so that the developer
can analyze/fix the issue.\nIf it is not too much to ask, please add to this
mail what you just did:\n\n");
message.append(String.format("-- NewsRob Version: %s/%s\n", entryManager
.getMyVersionName(),
entryManager.getMyVersionCode()));
message.append(String.format("-- Android Version: sdk=%s, release=%s,
inc=%s\n", Build.VERSION.SDK,
Build.VERSION.RELEASE, Build.VERSION.INCREMENTAL));
message.append(String.format("-- Thread State: %s\n", t.getState()));
Job j = entryManager.getCurrentRunningJob();
if (j != null)
message.append(String.format("-- Job: %s\n", j.getJobDescription()));
if (entryManager.runningThread != null)
message.append(String.format("-- Running Thread: %s\n", entryManager.
runningThread));
// Add stacktrace
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
pw.close();
message.append("-- Stacktrace:\n");
message.append(sw.getBuffer());
String messageBody = message.toString();
// ignore certain exceptions
if (Pattern.compile("CacheManager.java:391").matcher(messageBody).find())
return;
// Prepare Mail
final Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
sendIntent.setType("message/rfc822");
sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { "
[email protected]" });
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "BugReport: " +
e.getClass().getSimpleName() + ": "
+ e.getMessage());
sendIntent.putExtra(Intent.EXTRA_TEXT, messageBody);
Log.e(TAG, "Exception handled. Email activity should be initiated now.");
// Send Mail
new Thread(new Runnable() {
public void run() {
entryManager.getContext().startActivity(sendIntent);
}
}).start();
Log.e(TAG, "Exception handled. Email should be sent by now.");
// Use default exception mechanism
if (oldDefaultExceptionHandler != null)
oldDefaultExceptionHandler.uncaughtException(t, e);
}
}
On Sat, Apr 11, 2009 at 5:30 PM, Mattaku Betsujin <
[email protected]> wrote:
> Hello Mike,
>
> Could you share how you implemented the bug report mechanism? How can you
> get a stack trace when the app crashes inside the UI thread?
>
> Thanks
>
>
> On Sat, Apr 11, 2009 at 6:51 AM, Mike Hearn <[email protected]>wrote:
>
>>
>> I really question what developers are doing to get so many F/C
>> comments (and I see them on other apps all the time).
>>
>> I have a crash/bug reporter integrated into my app. It's not a very
>> good one - it just uploads exception stacktraces and some data to my
>> server when the core logic code crashes, so it doesn't even cover UI
>> bugs.
>>
>> I have hundreds of reports from the wild (about 25k downloads). So
>> obviously my app does fail. Yet, the comments on the app are all
>> glowing, and people are remarkably willing to give 4 or 5 stars even
>> when it didn't do quite what they wanted. I really wonder about the
>> buggyness of apps that get significant numbers of F/C comments.
>>
>> It must be frustrating to see comments about bugs that you can't
>> reproduce, but at the same time, I think some people here believe
>> writing software is easy. It's hard. I did all kinds of testing with
>> my app, including disrupting its network connection at various points
>> as it runs, repeatedly sliding the screen to force activity
>> reconstruction etc. Some bugs still slipped through, fortunately the
>> crash reports identify them quite well as most people with problems
>> will never even leave a comment, let alone email you to help you
>> figure out the problem.
>>
>>
>>
>>
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Android Discuss" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-discuss?hl=en
-~----------~----~----~----~------~----~------~--~---