Back to project page Resonos-Android-Framework.
The source code is released under:
Apache License
If you think the Android project Resonos-Android-Framework listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
package com.resonos.apps.library.util; // www .j a va 2 s . com import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; import java.lang.Thread.UncaughtExceptionHandler; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.message.BasicNameValuePair; import org.apache.http.protocol.HTTP; import com.resonos.apps.library.App; /** * Class used to catch uncaught exceptions and submit them to a server. * @author Chris */ public class ErrorReporter { // constants public static final String ACTION_UNCAUGHT = "uncaught"; // vars private String _lastAction, _lastText; private final String mAppName, mVersionID, mErrorURL; private UncaughtExceptionHandler mUEH = null; // static objects private static UncaughtExceptionHandler sDefaultUEH = null; private static ErrorReporter sInstance = null; /** * Get the static ErrorReporter instance. * This will be null until an ErrorReporter has been intialized by an app. * So avoid using this in calls that might occur before createApp() * @return the ErrorReporter instance */ public static synchronized ErrorReporter getInstance() { return sInstance; } /** * This class catches all exceptions and submits information about them, * as well as some system information to a specified URL. * Custom errors can be submitted as well. * @param app */ public ErrorReporter(App app) { this.mAppName = app.getAppName(); this.mVersionID = app.getVersionID(); this.mErrorURL = app.mAppInfo.errorURL; _lastAction = ""; _lastText = ""; if (sDefaultUEH == null) sDefaultUEH = Thread.getDefaultUncaughtExceptionHandler(); if (mUEH == null) mUEH = new UncaughtExceptionHandler() { public void uncaughtException(Thread t, Throwable e) { final Writer result = new StringWriter(); final PrintWriter printWriter = new PrintWriter(result); e.printStackTrace(printWriter); String stacktrace = result.toString(); printWriter.close(); report(ACTION_UNCAUGHT, e.toString(), stacktrace); sDefaultUEH.uncaughtException(t, e); } }; Thread.setDefaultUncaughtExceptionHandler(mUEH); synchronized (this.getClass()) { sInstance = this; } } public UncaughtExceptionHandler getDefaultExceptionHandler() { return sDefaultUEH; } public UncaughtExceptionHandler getExceptionHandler() { return mUEH; } /** * Report an error with one parameter * @param action, the error name * @param text, the error description */ public void report(String action, String text) { report(action, text, ""); } /** * Report an error with two parameters * @param action, the error name * @param text, the error description * @param e, more detailed or technical error information */ public void report(final String action, final String text, String e) { // avoid repeated submission of the same error if (action.equals(_lastAction) && text.equals(_lastText)) return; _lastAction = action; _lastText = text; final String extra = (e == null) ? "" : e; new Thread() { @Override public void run() { HttpClient httpClient = NetworkClient.getHttpClient(); HttpPost httpPost = new HttpPost(mErrorURL); List<NameValuePair> nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("app", mAppName)); nvps.add(new BasicNameValuePair("version", mVersionID)); nvps.add(new BasicNameValuePair("text", url_utf8_encode(text))); nvps.add(new BasicNameValuePair("extra", url_utf8_encode(extra))); nvps.add(new BasicNameValuePair("info", url_utf8_encode(ErrorReporter.getInfo()))); nvps.add(new BasicNameValuePair("action", action)); try { httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); httpClient.execute(httpPost); } catch (IOException ex) { // } } }.start(); } /** * Report an error using an exception * @param action, the error name * @param error, the exception thrown */ public void report(String action, Throwable error) { report(action, getStackTrace(error), error.getMessage()); } /** * Report an error using an exception and another parameter * @param action, the error name * @param error, the exception thrown * @param extra, more detailed or technical error information */ public void report(String action, Throwable error, String extra) { String e = error.getMessage(); final String arg = (e == null) ? extra : (e + "\n" + extra); report(action, getStackTrace(error), arg); } /** * Get the stacktrace in string form from a throwable * @param the exception or error * @return the stacktrace as a String */ public static String getStackTrace(Throwable aThrowable) { final Writer result = new StringWriter(); final PrintWriter printWriter = new PrintWriter(result); aThrowable.printStackTrace(printWriter); return result.toString(); } /** * Get the stacktrace in string form from a throwable in long form * @param the exception or error * @return the stacktrace as a String */ public static String getLongStackTrace(Throwable aThrowable) { // add the class name and any message passed to constructor final StringBuilder result = new StringBuilder( "Exception: " ); result.append(aThrowable.toString()); final String NEW_LINE = System.getProperty("line.separator"); result.append(NEW_LINE); //add each element of the stack trace for (StackTraceElement element : aThrowable.getStackTrace() ){ result.append( element ); result.append( NEW_LINE ); } return result.toString(); } /** * @return a string full of all BUILD information and the Android VERSIONID */ @SuppressWarnings("rawtypes") public static String getInfo() { StringBuilder bldr = new StringBuilder(); Class build = android.os.Build.class; try { for(Field curr: build.getFields()) { if(curr.getType().equals(String.class)) { try { bldr.append("Build->" + curr.getName() + ":").append("" + curr.get(build)).append("\n"); } catch (Exception e) { // pass } } } } catch (Exception ex) { bldr.append("getInfo() error"); } Class bv = android.os.Build.VERSION.class; try { // TODO all version info for(Field curr: bv.getFields()) { if(curr.getType().equals(String.class)) { try { bldr.append("Version->" + curr.getName() + ":").append("" + curr.get(bv)).append("\n"); } catch (Exception e) { // pass } } } bldr.append("VERSIONID:").append(android.os.Build.VERSION.SDK_INT).append("\n"); } catch (Exception ex) { bldr.append("VERSIONID:error"); } return bldr.toString(); } /** * Someone else's UTF8 URL encode function, I do not remember where this is from * @param String to encode * @return URL encoded String */ public static String url_utf8_encode(String s) { StringBuffer sbuf = new StringBuffer(); int len = s.length(); for (int i = 0; i < len; i++) { int ch = s.charAt(i); if ('A' <= ch && ch <= 'Z') { // 'A'..'Z' sbuf.append((char) ch); } else if ('a' <= ch && ch <= 'z') { // 'a'..'z' sbuf.append((char) ch); } else if ('0' <= ch && ch <= '9') { // '0'..'9' sbuf.append((char) ch); } else if (ch == ' ') { // space sbuf.append('+'); } else if (ch == '_' // unreserved || ch == '.' || ch == '!' || ch == '~' || ch == '*' || ch == '\'' || ch == '(' || ch == ')') { sbuf.append((char) ch); } else if (ch == '-') { sbuf.append(hex[ch]); } else if (ch <= 0x007f) { // other ASCII sbuf.append(hex[ch]); } else if (ch <= 0x07FF) { // non-ASCII <= 0x7FF sbuf.append(hex[0xc0 | (ch >> 6)]); sbuf.append(hex[0x80 | (ch & 0x3F)]); } else { // 0x7FF < ch <= 0xFFFF sbuf.append(hex[0xe0 | (ch >> 12)]); sbuf.append(hex[0x80 | ((ch >> 6) & 0x3F)]); sbuf.append(hex[0x80 | (ch & 0x3F)]); } } return sbuf.toString(); } final static String[] hex = { "%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07", "%08", "%09", "%0a", "%0b", "%0c", "%0d", "%0e", "%0f", "%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17", "%18", "%19", "%1a", "%1b", "%1c", "%1d", "%1e", "%1f", "%20", "%21", "%22", "%23", "%24", "%25", "%26", "%27", "%28", "%29", "%2a", "%2b", "%2c", "%2d", "%2e", "%2f", "%30", "%31", "%32", "%33", "%34", "%35", "%36", "%37", "%38", "%39", "%3a", "%3b", "%3c", "%3d", "%3e", "%3f", "%40", "%41", "%42", "%43", "%44", "%45", "%46", "%47", "%48", "%49", "%4a", "%4b", "%4c", "%4d", "%4e", "%4f", "%50", "%51", "%52", "%53", "%54", "%55", "%56", "%57", "%58", "%59", "%5a", "%5b", "%5c", "%5d", "%5e", "%5f", "%60", "%61", "%62", "%63", "%64", "%65", "%66", "%67", "%68", "%69", "%6a", "%6b", "%6c", "%6d", "%6e", "%6f", "%70", "%71", "%72", "%73", "%74", "%75", "%76", "%77", "%78", "%79", "%7a", "%7b", "%7c", "%7d", "%7e", "%7f", "%80", "%81", "%82", "%83", "%84", "%85", "%86", "%87", "%88", "%89", "%8a", "%8b", "%8c", "%8d", "%8e", "%8f", "%90", "%91", "%92", "%93", "%94", "%95", "%96", "%97", "%98", "%99", "%9a", "%9b", "%9c", "%9d", "%9e", "%9f", "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%a6", "%a7", "%a8", "%a9", "%aa", "%ab", "%ac", "%ad", "%ae", "%af", "%b0", "%b1", "%b2", "%b3", "%b4", "%b5", "%b6", "%b7", "%b8", "%b9", "%ba", "%bb", "%bc", "%bd", "%be", "%bf", "%c0", "%c1", "%c2", "%c3", "%c4", "%c5", "%c6", "%c7", "%c8", "%c9", "%ca", "%cb", "%cc", "%cd", "%ce", "%cf", "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7", "%d8", "%d9", "%da", "%db", "%dc", "%dd", "%de", "%df", "%e0", "%e1", "%e2", "%e3", "%e4", "%e5", "%e6", "%e7", "%e8", "%e9", "%ea", "%eb", "%ec", "%ed", "%ee", "%ef", "%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7", "%f8", "%f9", "%fa", "%fb", "%fc", "%fd", "%fe", "%ff" }; }