package com.aoleyun.sn.base; import android.annotation.SuppressLint; import android.content.Context; import android.os.Handler; import android.os.Looper; import android.os.Process; import android.text.TextUtils; import android.util.Log; import androidx.multidex.MultiDexApplication; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.aoleyun.sn.BuildConfig; import com.aoleyun.sn.bean.BaseResponse; import com.aoleyun.sn.manager.AmapManager; import com.aoleyun.sn.manager.ConnectManager; import com.aoleyun.sn.manager.FileManager; import com.aoleyun.sn.network.NetInterfaceManager; import com.aoleyun.sn.network.UrlAddress; import com.aoleyun.sn.rlog.LogDBManager; import com.aoleyun.sn.statistics.AppInformation; import com.aoleyun.sn.statistics.StatisticsInfo; import com.aoleyun.sn.utils.ApkUtils; import com.aoleyun.sn.utils.JGYUtils; import com.aoleyun.sn.utils.SystemUtils; import com.aoleyun.sn.utils.ToastUtil; import com.aoleyun.sn.utils.Utils; import com.aoleyun.sn.utils.WiFiUtils; import com.aoleyun.sn.utils.XAPKUtils; import com.arialyy.aria.core.Aria; import com.arialyy.aria.core.download.DownloadEntity; import com.tencent.android.tpush.XGIOperateCallback; import com.tencent.android.tpush.XGPushConfig; import com.tencent.android.tpush.XGPushManager; import com.tencent.mmkv.MMKV; import org.jetbrains.annotations.NotNull; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.core.ObservableEmitter; import io.reactivex.rxjava3.core.ObservableOnSubscribe; import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.schedulers.Schedulers; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class BaseApplication extends MultiDexApplication { private static final String TAG = BaseApplication.class.getSimpleName(); @SuppressLint("StaticFieldLeak") public static Context context; public static Context getAppContext() { return context; } @Override public void onCreate() { super.onCreate(); context = this; if (SystemUtils.isMainProcessName(this, Process.myPid())) { //非主进程不初始化 init(); } } private void init() { String rootDir = MMKV.initialize(this); Log.e(TAG, "mmkv root: " + rootDir); tPushInit(); ToastUtil.init(this); NetInterfaceManager.init(this); JGYUtils.init(this); WiFiUtils.init(this); XAPKUtils.init(this); LogDBManager.init(this); FileManager.init(this); ConnectManager.init(this); AmapManager.init(this); AmapManager.getInstance().initAmap(); JGYUtils.getInstance().hookWebView(); // 设置开启日志,发布时请关闭日志 // JPushInterface.setDebugMode(true); // JPushInterface.requestPermission(this); //解锁设备不需要初始化 // 初始化 JPush //JPushInterface.init(this); Aria.init(this); Aria.get(this).getDownloadConfig().setMaxTaskNum(1); Aria.get(this).getDownloadConfig().setConvertSpeed(true); if (!BuildConfig.DEBUG) { catchException(); } // Configuration config = getResources().getConfiguration(); // int smallestScreenWidthDp = config.smallestScreenWidthDp; // Log.e("init", "smallestScreenWidthDp=" + smallestScreenWidthDp); // CalligraphyConfig.initDefault(new CalligraphyConfig.Builder() // .setDefaultFontPath("fonts/1234.ttf") // .setDefaultFontPath("fonts/Roboto-RobotoRegular.ttf") // .setFontAttrId(R.attr.fontPath) // .build() // ); initAliasObservable(); initTagObservable(); } private void catchException() { Thread.setDefaultUncaughtExceptionHandler( new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { Log.e("捕获异常子线程:", Thread.currentThread().getName() + "在:" + e.getStackTrace()[0].getClassName()); } } ); //下面是新增方法! new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { while (true) { try { Looper.loop(); //会先执行这个方法,然后在执行下面的异常捕获方法! } catch (Exception e) { Log.e("捕获异常主线程:", Thread.currentThread().getName() + "在:" + e.getStackTrace()[0].getClassName()); e.printStackTrace(); } } } }); } private void tPushInit() { XGPushConfig.enableDebug(this, true); XGPushManager.registerPush(this, new XGIOperateCallback() { @Override public void onSuccess(Object data, int flag) { //token在设备卸载重装的时候有可能会变 Log.e("TPush", "注册成功,设备token为:" + data); MMKV.defaultMMKV().encode("XGPushtoken", data.toString()); List accountInfoList = new ArrayList<>(); accountInfoList.add(new XGPushManager.AccountInfo(XGPushManager.AccountType.CUSTOM.getValue(), Utils.getSerial(getApplicationContext()))); if (Utils.NOSN.equalsIgnoreCase(Utils.getSerial())) { accountInfoList.add(new XGPushManager.AccountInfo(XGPushManager.AccountType.CUSTOM.getValue(), Utils.getIMEI(getAppContext(), 0))); accountInfoList.add(new XGPushManager.AccountInfo(XGPushManager.AccountType.CUSTOM.getValue(), Utils.getIMEI(getAppContext(), 1))); } XGPushManager.upsertAccounts(getAppContext(), accountInfoList, new XGIOperateCallback() { @Override public void onSuccess(Object data, int flag) { Log.e("TPush", "onSuccess, data:" + data + ", flag:" + flag); } @Override public void onFail(Object data, int errCode, String msg) { Log.e("TPush", "onFail, data:" + data + ", code:" + errCode + ", msg:" + msg); } }); } @Override public void onFail(Object data, int errCode, String msg) { Log.e("TPush", "注册失败,错误码:" + errCode + ",错误信息:" + msg); } }); } private static void initAliasObservable() { Log.e(TAG, "initAliasObservable: "); Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter emitter) throws Exception { onAliasResult = new OnAliasResult() { @Override public void onResult(int code) { Log.e("initAliasObservable", "onResult: " + code); emitter.onNext(code); } }; } }).throttleLast(1, TimeUnit.HOURS) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(Integer integer) { Log.e("initAliasObservable", "onNext: " + integer); String s = "alias:\t"; switch (integer) { case 0: Log.e("jiguangInterface", s + "Alias绑定成功"); break; case 6001: Log.e("jiguangInterface", s + "无效的设置"); break; case 6011: Log.e("jiguangInterface", s + "短时间内操作过于频繁"); break; case 6013: Log.e("jiguangInterface", s + "用户设备时间轴异常"); ToastUtil.show("用户设备时间轴异常,修改后重新登陆\t" + s + "code:6013"); break; case 6022: Log.e("jiguangInterface", s + "alias 操作正在进行中"); break; //需要重新设置 case 6002: Log.e("jiguangInterface", s + "设置超时,请重试"); setJpushAlias(); break; case 6014: Log.e("jiguangInterface", s + "服务器繁忙,建议重试"); setJpushAlias(); break; case 6020: Log.e("jiguangInterface", s + "建议过一段时间再设置"); setJpushAlias(); break; case 6024: Log.e("jiguangInterface", s + "服务器内部错误"); setJpushAlias(); break; case 6017: case 6027: Log.e("jiguangInterface", s + "别名绑定的设备数超过限制"); // cleanJpushAlias(); setJpushAlias(); break; default: break; } } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } // public void onAliasOperatorResult(JPushMessage jPushMessage) { // if (jPushMessage == null) { // return; // } // int errorCode = jPushMessage.getErrorCode(); // onAliasResult.onResult(errorCode); // } public static void setJpushAlias() { Log.e("jiguangInterface", "30s后重新设置alias"); // JPushInterface.setAlias(context, TagAliasOperatorHelper.sequence++, Utils.getSerial()); } private static void initTagObservable() { Log.e(TAG, "initTagObservable: "); Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter emitter) { onTagResult = new OnTagResult() { @Override public void onResult(int code) { Log.e("initTagObservable", "onResult: " + code); emitter.onNext(code); } }; } }).throttleLast(1, TimeUnit.HOURS) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(Integer integer) { Log.e("initTagObservable", "onNext: " + integer); String s = "tags:\t"; switch (integer) { case 0: Log.e("jiguangInterface", s + "Tag绑定成功"); break; case 6001: Log.e("jiguangInterface", s + "无效的设置"); break; case 6005: Log.e("jiguangInterface", s + "某一个 tag 字符串不合法"); ToastUtil.show("设备标签不合法,联系管理员修改\t" + "code:6005"); break; case 6006: Log.e("jiguangInterface", s + "某一个 tag 超长"); ToastUtil.show("设备标签过长,联系管理员修改\t" + "code:6006"); break; case 6007: Log.e("jiguangInterface", s + "tags 数量超出限制"); ToastUtil.show("设备标签数量超出限制,联系管理员修改\t" + "code:6007"); break; case 6008: Log.e("jiguangInterface", s + "tag 超出总长度限制"); ToastUtil.show("设备标签超出总长度限制,联系管理员修改\t" + "code:6008"); break; case 6011: Log.e("jiguangInterface", s + "短时间内操作过于频繁"); break; case 6013: Log.e("jiguangInterface", s + "用户设备时间轴异常"); ToastUtil.show("用户设备时间轴异常,修改后重新登陆\t" + "code:6013"); break; case 6018: Log.e("jiguangInterface", s + "Tags 过多"); // cleanJpushTag(); ToastUtil.show("设备标签数量超出限制,联系管理员修改\t" + "code:6018"); break; case 6021: Log.e("jiguangInterface", s + "tags 操作正在进行中"); break; //需要重新设置 case 6002: Log.e("jiguangInterface", s + "设置超时,请重试"); setJpushTags(); break; case 6014: Log.e("jiguangInterface", s + "服务器繁忙,建议重试"); setJpushTags(); break; case 6020: Log.e("jiguangInterface", s + "建议过一段时间再设置"); setJpushTags(); break; case 6024: Log.e("jiguangInterface", s + "服务器内部错误"); setJpushTags(); break; default: break; } } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } public static void setJpushTags() { Log.e(TAG, "30s后重新设置tags"); } private static OnAliasResult onAliasResult; interface OnAliasResult { void onResult(int code); } private static OnTagResult onTagResult; interface OnTagResult { void onResult(int code); } synchronized public static void cleanJpushAlias() { //alias的绑定的设备超过10个,但是alias应该是一个设备对应一个,在重置设备后jpush的regid会变动,所以需要清除 //https://docs.jiguang.cn/jpush/server/push/rest_api_v3_device/#_5 OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(UrlAddress.DELETE_JPUSH_ALIAS + Utils.getSerial(getAppContext())) .header("Authorization", JGYUtils.getAuthorization()) .delete() .build(); Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(@NotNull Call call, @NotNull IOException e) { Log.e("cleanJpushAlias", "onFailure: " + e.getMessage()); } @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { Log.e("cleanJpushAlias", "onResponse: " + response.toString()); Log.e(TAG, "onResponse: " + "清除Alias成功"); } }); } synchronized public static void cleanJpushTag() { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(UrlAddress.DELETE_JPUSH_TAG + Utils.getSerial(getAppContext())) .header("Authorization", JGYUtils.getAuthorization()) .delete() .build(); Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(@NotNull Call call, @NotNull IOException e) { Log.e("cleanJpushTag", "onFailure: " + e.getMessage()); } @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { Log.e("cleanJpushTag", "onResponse: " + response.toString()); Log.e(TAG, "onResponse: " + "清除Tag成功"); } }); } public static void sendAppUsedTime(String random, String type) { StatisticsInfo statisticsInfo = null; if (type.equals("0")) { statisticsInfo = new StatisticsInfo(getAppContext()); } else if (type.equals("1")) { statisticsInfo = new StatisticsInfo(getAppContext(), StatisticsInfo.WEEK); } List list = null; List localAppList = new ArrayList<>(); if (statisticsInfo != null) { list = statisticsInfo.getShowList(); if (list != null && list.size() > 0) { for (AppInformation appInformation : list) { if (!ApkUtils.isSystemApp(getAppContext(), appInformation.getPackageName())) { localAppList.add(appInformation); } } } else { Log.e("fht", "今日没有打开的应用"); } } else { Log.e("fht", "获取信息失败"); } JSONObject data = new JSONObject(); JSONArray appinfo = new JSONArray(); try { if (localAppList.size() > 0) { for (int i = 0; i < 5; i++) { AppInformation information = localAppList.get(i); JSONObject jsonObject = new JSONObject(); jsonObject.put("package", information.getPackageName()); jsonObject.put("use_time", (int) information.getUsedTimebyDay() / 1000); appinfo.add(jsonObject); } data.put("data", appinfo); } } catch (Exception e) { Log.e("sendAppUsedTime", e.getMessage()); } NetInterfaceManager.getInstance() .getAppLogApi() .getAppLog(Utils.getSerial(getAppContext()), random, data.toJSONString()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { Log.e("sendAppUsedTime", "onSubscribe: "); } @Override public void onNext(BaseResponse baseResponse) { Log.e("sendAppUsedTime", "onNext: "); int code = baseResponse.code; String msg = baseResponse.msg; Log.e("sendAppUsedTime", "onSubscribe:" + msg); } @Override public void onError(Throwable e) { Log.e("sendAppUsedTime", "onError: " + e.getMessage()); } @Override public void onComplete() { Log.e("sendAppUsedTime", "onComplete: "); } }); } private static long totalTime; private static int totalTimes; synchronized public static void setAPPUsage() { StatisticsInfo statisticsInfo = new StatisticsInfo(getAppContext()); totalTime = statisticsInfo.getTotalTime();//全部时间 totalTimes = statisticsInfo.getTotalTimes();//全部次数 } synchronized public static void setAPPUsage(List lists) { StatisticsInfo statisticsInfo = new StatisticsInfo(getAppContext()); List list = null; List localAppList = new ArrayList<>(); totalTime = statisticsInfo.getTotalTime();//全部时间 totalTimes = statisticsInfo.getTotalTimes();//全部次数 list = statisticsInfo.getShowList(); if (list != null && list.size() > 0) { for (AppInformation appInformation : list) { if (lists.indexOf(appInformation.getPackageName()) != -1) { localAppList.add(appInformation); } } } else { } } }