فهرست منبع

1.修改RA Image Android增加程序异常捕获。

Pen Li 8 سال پیش
والد
کامیت
580350acc3

+ 7 - 7
RA Image/app/app.iml

@@ -62,13 +62,6 @@
       <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
       <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
       <sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
@@ -76,6 +69,13 @@
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/builds" />

+ 114 - 0
RA Image/app/src/main/java/com/usai/redant/raimage/CrashHandler.java

@@ -0,0 +1,114 @@
+package com.usai.redant.raimage;
+
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Build;
+
+import java.io.IOException;
+import java.io.LineNumberReader;
+import java.io.PrintWriter;
+import java.io.StringReader;
+import java.io.StringWriter;
+
+
+public class CrashHandler implements Thread.UncaughtExceptionHandler{
+
+    public interface InfoPreserver {
+        public void saveUserInformation();
+        public void handleCrashInfo(String deviceInfo, String exception);
+    }
+    // 当前应用上下文
+    private Context ctx;
+
+    // 系统默认UncaughtException处理类
+    private Thread.UncaughtExceptionHandler mDefaultHandler;
+
+    private static CrashHandler sharedInstance;
+    public InfoPreserver preserver;
+
+    private CrashHandler() {
+
+    }
+
+    public static synchronized CrashHandler getSharedInstance() {
+        if (sharedInstance == null) {
+            sharedInstance = new CrashHandler();
+        }
+        return sharedInstance;
+    }
+
+    public void init(Context ctx) {
+        this.ctx = ctx;
+        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
+        Thread.setDefaultUncaughtExceptionHandler(this);
+    }
+
+
+    @Override
+    public void uncaughtException(Thread t, Throwable e) {
+        // 如果不能处理异常,并且系统处理器不为空,则交给系统处理
+        if (!handleException(e) && mDefaultHandler != null) {
+            mDefaultHandler.uncaughtException(t,e);
+        } else {
+            android.os.Process.killProcess(android.os.Process.myPid());
+            System.exit(1);
+        }
+    }
+
+    private boolean handleException(Throwable e) {
+
+        if (e == null) {
+            return false;
+        }
+
+        if (preserver != null) {
+            preserver.saveUserInformation();
+            preserver.handleCrashInfo(getDeviceInfo(),getThrowableStackString(e));
+        }
+
+
+        return true;
+    }
+
+    private String getDeviceInfo() {
+        try {
+            PackageManager pm = ctx.getPackageManager();
+            PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(),PackageManager.GET_ACTIVITIES);
+            String appVer = "App Version: " + pi.versionName + "_" + pi.versionCode + "\n";
+            String osVer = "OS Version: " + Build.VERSION.RELEASE + "_" + Build.VERSION.SDK_INT + "\n";
+            String manufacture = "Manufacturer: " + Build.MANUFACTURER + "\n";
+            String model = "Model: " + Build.MODEL;
+            return appVer + osVer + manufacture + model;
+        } catch (PackageManager.NameNotFoundException e) {
+            e.printStackTrace();
+            return null;
+        }
+
+    }
+
+    private String getThrowableStackString(Throwable throwable) {
+        if (throwable == null) {
+            return null;
+        }
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter(sw);
+        throwable.printStackTrace(pw);
+        pw.flush();
+        LineNumberReader reader = new LineNumberReader(new StringReader(sw.toString()));
+        StringBuffer lines = new StringBuffer();
+        try {
+            String line = reader.readLine();
+            while (line != null) {
+                lines.append(line + "\n");
+                line = reader.readLine();
+            }
+        } catch (IOException ex) {
+            lines.append(ex.toString() + "\n");
+        }
+
+        return lines.toString();
+    }
+
+
+}

+ 15 - 1
RA Image/app/src/main/java/com/usai/redant/raimage/RedAntApplication.java

@@ -7,6 +7,7 @@ import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.os.SystemClock;
+import android.preference.PreferenceManager;
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.Log;
@@ -33,7 +34,6 @@ public class RedAntApplication extends Application
     public static RedAntApplication getInstance() {  
         return instance;  
     }  
-    
 	public static void startalarm()
 	{
 
@@ -76,6 +76,20 @@ public class RedAntApplication extends Application
 		super.onCreate();
         instance = this;
 
+		// 初始化异常捕获器
+		CrashHandler.getSharedInstance().init(getApplicationContext());
+		CrashHandler.getSharedInstance().preserver = new CrashHandler.InfoPreserver() {
+			@Override
+			public void saveUserInformation() {
+				
+			}
+
+			@Override
+			public void handleCrashInfo(String deviceInfo, String exception) {
+				Log.d("Crash", "Device Info: " + deviceInfo);
+				Log.d("Crash", "Crash Info: " + exception);
+			}
+		};
 
 
 //		TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);