Quellcode durchsuchen

1.android端增加异常处理
2.增加js调动方法

FailedToRead vor 2 Jahren
Ursprung
Commit
ad342ebac6

BIN
.idea/caches/build_file_checksums.ser


+ 1 - 0
app/build.gradle

@@ -244,6 +244,7 @@ android.applicationVariants.all { variant ->
 //  variant.mergeAssets.doLast {
     variant.mergeAssetsProvider.get().doLast {
         def sourceDir = "${buildDir}/../../../../.."
+//        def sourceDir = "${buildDir}/../../../build/jsb-link"
         copy {
             from "${sourceDir}/assets"
             into "${outputDir}/assets"

+ 8 - 0
src/org/cocos2dx/javascript/AppActivity.java

@@ -34,6 +34,7 @@ import android.view.View;
 import android.view.WindowManager;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
+import android.widget.TextView;
 
 import com.edufound.mobile.R;
 import com.google.gson.Gson;
@@ -82,6 +83,13 @@ public class AppActivity extends Cocos2dxActivity {
     public void showSplash() {
         mSplashImage = new ImageView(this);
         mSplashImage.setImageDrawable(getResources().getDrawable(R.drawable.openimg));
+        mSplashImage.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+//                TextView tv = null;
+//                tv.setText("123123123");
+            }
+        });
         mSplashImage.setScaleType(ImageView.ScaleType.FIT_XY);
         addContentView(mSplashImage,
                 new WindowManager.LayoutParams(

+ 2 - 0
src/org/cocos2dx/javascript/application/EApplication.java

@@ -11,6 +11,7 @@ import com.umeng.message.api.UPushRegisterCallback;
 import com.xiaomi.mipush.sdk.PushMessageHelper;
 
 import org.cocos2dx.javascript.util.Consts;
+import org.cocos2dx.javascript.util.CrashHandler;
 import org.cocos2dx.javascript.util.Logger;
 import org.cocos2dx.lib.MediaPlayerManager;
 
@@ -23,6 +24,7 @@ public class EApplication extends Application {
         UMConfigure.init(this, UMConfigure.DEVICE_TYPE_PHONE, "dfc59afd6dc6b1550ff1c2e0c7eb10fd");
         UMConfigure.setLogEnabled(true);
 //        MediaPlayerManager.getDefault().init(Consts.mApplicatonContext, getPackageName());
+        CrashHandler.getInstance().init(this);
         boolean isMainProcess = UMUtils.isMainProgress(this);
         if (isMainProcess) {
             //启动优化:建议在子线程中执行初始化

+ 13 - 0
src/org/cocos2dx/javascript/presenter/MainPresenter.java

@@ -24,6 +24,7 @@ import com.tencent.mm.opensdk.openapi.WXAPIFactory;
 import com.umeng.commonsdk.UMConfigure;
 
 import org.cocos2dx.javascript.AppActivity;
+import org.cocos2dx.javascript.SDKWrapper;
 import org.cocos2dx.javascript.bean.AliPayResult;
 import org.cocos2dx.javascript.util.Consts;
 import org.cocos2dx.javascript.util.DeviceUtil;
@@ -363,4 +364,16 @@ public class MainPresenter {
         }
         return mChannelCode;
     }
+
+
+    public static void pauseGame() {
+        mActivity.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                Logger.e("暂停应用");
+                SDKWrapper.getInstance().onPause();
+            }
+        });
+
+    }
 }

+ 237 - 0
src/org/cocos2dx/javascript/util/CrashHandler.java

@@ -0,0 +1,237 @@
+package org.cocos2dx.javascript.util;
+
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.lang.Thread.UncaughtExceptionHandler;
+import java.lang.reflect.Field;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.Build;
+import android.os.Environment;
+import android.os.Looper;
+import android.os.Process;
+import android.widget.Toast;
+
+
+/**
+ * UncaughtException处理类,当程序发生Uncaught异常的时候,有该类来接管程序,并记录发送错误报告.
+ *
+ * @author user
+ */
+public class CrashHandler implements UncaughtExceptionHandler {
+
+    // 系统默认的UncaughtException处理类
+    private Thread.UncaughtExceptionHandler mDefaultHandler;
+    // CrashHandler实例
+    private static CrashHandler INSTANCE = new CrashHandler();
+    // 程序的Context对象
+    private Context mContext;
+    // 用来存储设备信息和异常信息
+    private Map<String, String> infos = new HashMap<String, String>();
+
+    // 用于格式化日期,作为日志文件名的一部分
+    private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
+
+    private DateFormat formatterWeb = new SimpleDateFormat("yyyyMMdd");
+
+    private DateFormat newFormatter = new SimpleDateFormat("yyyyMMdd_HHmmss");
+
+
+    /**
+     * 保证只有一个CrashHandler实例
+     */
+    private CrashHandler() {
+    }
+
+    /**
+     * 获取CrashHandler实例 ,单例模式
+     */
+    public static CrashHandler getInstance() {
+        return INSTANCE;
+    }
+
+    /**
+     * 初始化
+     *
+     * @param context
+     */
+    public void init(Context context) {
+        mContext = context;
+        // 获取系统默认的UncaughtException处理器
+        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
+        // 设置该CrashHandler为程序的默认处理器
+        Thread.setDefaultUncaughtExceptionHandler(this);
+    }
+
+    /**
+     * 当UncaughtException发生时会转入该函数来处理
+     */
+    @Override
+    public void uncaughtException(Thread thread, Throwable ex) {
+        if (!handleException(ex) && mDefaultHandler != null) {
+            // 如果用户没有处理则让系统默认的异常处理器来处理
+            mDefaultHandler.uncaughtException(thread, ex);
+        } else {
+            try {
+                Thread.sleep(4000);
+            } catch (InterruptedException e) {
+                Logger.e("error : " + e);
+            }
+            // 退出程序
+//            android.os.Process.killProcess(android.os.Process.myPid());
+//            System.exit(1);
+        }
+    }
+
+    /**
+     * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
+     *
+     * @param ex
+     * @return true:如果处理了该异常信息;否则返回false.
+     */
+    private boolean handleException(Throwable ex) {
+        if (ex == null) {
+            return false;
+        }
+        // 收集设备参数信息
+        collectDeviceInfo(mContext);
+        // 保存日志文件
+        final String fileName = saveCrashInfo2File(ex);
+        String date = formatterWeb.format(new Date());
+//        //上传到服务器
+//        final String url = "/logs/android/";
+//        String stu = "";
+//        Logger.e("url:" + url);
+//        if (!EduFoundUtil.isEmpty(Consts.mUserData.userInfo.getStu_no())) {
+//            stu = Consts.mUserData.userInfo.getStu_no();
+//        } else {
+//            stu = newFormatter.format(new Date());
+//        }
+//        final String finalStu = date + "_" + Consts.APP_CODE + "_" + stu + ".log";
+//        new Thread() {
+//            @Override
+//            public void run() {
+//                FtpUtil.ftpUpload(url, finalStu, Consts.LOG_URL + fileName, new FtpUtil.upLoadListrner() {
+//                    @Override
+//                    public void onLoadOver() {
+//                        android.os.Process.killProcess(android.os.Process.myPid());
+//                        System.exit(1);
+//                    }
+//                });
+//            }
+//        }.start();
+//
+//        // 使用Toast来显示异常信息
+        new Thread() {
+            @Override
+            public void run() {
+                Looper.prepare();
+                Toast.makeText(mContext, "很抱歉,程序出现异常.", Toast.LENGTH_SHORT).show();
+                Looper.loop();
+                android.os.Process.killProcess(Process.myPid());
+                System.exit(1);
+            }
+        }.start();
+
+        return true;
+    }
+
+    /**
+     * 收集设备参数信息
+     *
+     * @param ctx
+     */
+    public void collectDeviceInfo(Context ctx) {
+//        try {
+//            PackageManager pm = ctx.getPackageManager();
+//            PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(), PackageManager.GET_ACTIVITIES);
+//            if (pi != null) {
+//                String versionName = pi.versionName == null ? "null" : pi.versionName;
+//                String versionCode = pi.versionCode + "";
+//                infos.put("versionName", versionName);
+//                infos.put("versionCode", versionCode);
+////                infos.put("APP_ID", Consts.APP_CODE);
+////                infos.put("STU_ID", Consts.mUserData.userInfo.getStu_no());
+////                infos.put("UUID", Consts.mUserData.userInfo.getUid());
+//
+//            }
+//        } catch (NameNotFoundException e) {
+//            Logger.e("an error occured when collect package info" + e);
+//        }
+//        Field[] fields = Build.class.getDeclaredFields();
+//        for (Field field : fields) {
+//            try {
+//                field.setAccessible(true);
+//                infos.put(field.getName(), field.get(null).toString());
+//                Logger.e(field.getName() + " : " + field.get(null));
+//            } catch (Exception e) {
+//                Logger.e("an error occured when collect crash info", e);
+//            }
+//        }
+    }
+
+    /**
+     * 保存错误信息到文件中
+     *
+     * @param ex
+     * @return 返回文件名称, 便于将文件传送到服务器
+     */
+    private String saveCrashInfo2File(Throwable ex) {
+//        File file = new File(Consts.LOG_URL);
+//        if (!file.exists()) {
+//            file.mkdirs();
+//        }
+//        StringBuffer sb = new StringBuffer();
+//        for (Map.Entry<String, String> entry : infos.entrySet()) {
+//            String key = entry.getKey();
+//            String value = entry.getValue();
+//            sb.append(key + "=" + value + "\n");
+//            sb.append("----------------------------------------" + "\n");
+//        }
+//
+//
+//        Writer writer = new StringWriter();
+//        PrintWriter printWriter = new PrintWriter(writer);
+//        ex.printStackTrace(printWriter);
+//        Throwable cause = ex.getCause();
+//        while (cause != null) {
+//            cause.printStackTrace(printWriter);
+//            cause = cause.getCause();
+//        }
+//        printWriter.close();
+//        String result = writer.toString();
+//        sb.append(result);
+//        try {
+//            long timestamp = System.currentTimeMillis();
+//            String mSaveDate = formatter.format(new Date());
+//            String stu = "";
+//            if (!EduFoundUtil.isEmpty(Consts.mUserData.userInfo.getStu_no())) {
+//                stu = Consts.mUserData.userInfo.getStu_no();
+//            }
+//            String fileName = stu + "" + mSaveDate + "--" + timestamp + ".log";
+//            if (Environment.getExternalStorageState().equals(
+//                    Environment.MEDIA_MOUNTED)) {
+//                FileOutputStream fos = new FileOutputStream(
+//                        Consts.LOG_URL + fileName);
+//                fos.write(sb.toString().getBytes());
+//                fos.close();
+//            }
+//            return fileName;
+//        } catch (Exception e) {
+//            Logger.e("an error occured while writing file...", e);
+//        }
+        return null;
+    }
+}