You're welcome. One thing I should have mentioned. As you see I pass this thing called EntryManager into the constructor. I meanwhile learned the lesson that there can be a bug in the EntryManager creation too, which then cannot be reported using the error reporter.
So next time I am working on it I will get the EntryManager lazily. I would recommend the same to you, that is check everything for null or other possible failures to prevent the error reporting causing an error ;-) On Sat, Apr 11, 2009 at 5:55 PM, Mattaku Betsujin < [email protected]> wrote: > Wow, Mariano, this is great! Thanks a lot :-) > > > > > On Sat, Apr 11, 2009 at 8:52 AM, Mariano Kamp <[email protected]>wrote: > >> 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 -~----------~----~----~----~------~----~------~--~---
