package com.weikou.beibeivideo;
|
|
import android.app.Activity;
|
import android.app.ActivityManager;
|
import android.app.Application;
|
import android.content.BroadcastReceiver;
|
import android.content.ComponentName;
|
import android.content.Context;
|
import android.content.Intent;
|
import android.content.IntentFilter;
|
import android.content.SharedPreferences;
|
import android.os.Build;
|
import android.os.Bundle;
|
import android.os.Environment;
|
import android.os.Handler;
|
import android.os.Message;
|
import android.util.Log;
|
import android.webkit.WebView;
|
import android.widget.Toast;
|
|
import com.alibaba.baichuan.android.trade.AlibcTradeSDK;
|
import com.alibaba.baichuan.android.trade.callback.AlibcTradeInitCallback;
|
import com.apkfuns.log2file.LogFileEngineFactory;
|
import com.apkfuns.logutils.LogUtils;
|
import com.bytedance.sdk.djx.DJXSdk;
|
import com.bytedance.sdk.djx.DJXSdkConfig;
|
import com.bytedance.sdk.djx.IDJXPrivacyController;
|
import com.bytedance.sdk.djx.model.DJXError;
|
import com.bytedance.sdk.dp.DPSdk;
|
import com.bytedance.sdk.dp.DPSdkConfig;
|
import com.bytedance.sdk.dp.IDPPrivacyController;
|
import com.bytedance.sdk.openadsdk.TTAdSdk;
|
import com.funshion.playsdk.register.IAuthCodeGetter;
|
import com.huawei.hms.ads.HwAds;
|
import com.kwad.sdk.api.KsAdSDK;
|
import com.kwad.sdk.api.KsCustomController;
|
import com.kwad.sdk.api.SdkConfig;
|
import com.lcjian.library.util.common.AndroidManifestUtil;
|
import com.lcjian.library.util.common.DeviceUtil;
|
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
|
import com.nostra13.universalimageloader.core.ImageLoader;
|
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
|
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
|
import com.qq.e.comm.managers.GDTAdSdk;
|
import com.qq.e.comm.managers.setting.GlobalSetting;
|
import com.tencent.mm.opensdk.constants.ConstantsAPI;
|
import com.tencent.mm.opensdk.openapi.IWXAPI;
|
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
|
import com.tencent.smtt.sdk.QbSdk;
|
import com.umeng.analytics.MobclickAgent;
|
import com.umeng.commonsdk.UMConfigure;
|
import com.umeng.socialize.PlatformConfig;
|
import com.umeng.socialize.UMShareAPI;
|
import com.vivo.mobilead.manager.VInitCallback;
|
import com.vivo.mobilead.manager.VivoAdManager;
|
import com.vivo.mobilead.model.VAdConfig;
|
import com.vivo.mobilead.model.VCustomController;
|
import com.vivo.mobilead.model.VLocation;
|
import com.vivo.mobilead.unified.base.VivoAdError;
|
import com.weikou.beibeivideo.ui.SplashActivity;
|
import com.weikou.beibeivideo.ui.ad.SplashADFragment;
|
import com.weikou.beibeivideo.util.BeibeiConstant;
|
import com.weikou.beibeivideo.util.CrashHandler;
|
import com.weikou.beibeivideo.util.DebuggerUtils;
|
import com.weikou.beibeivideo.util.UserUtil;
|
import com.weikou.beibeivideo.util.ad.AdUtil;
|
import com.weikou.beibeivideo.util.ad.CSJConstant;
|
import com.weikou.beibeivideo.util.ad.TTAdManagerHolder;
|
import com.weikou.beibeivideo.util.downutil.StringUtils;
|
|
import org.apache.http.Header;
|
import org.json.JSONObject;
|
|
import java.io.PrintWriter;
|
import java.io.StringWriter;
|
import java.util.ArrayList;
|
import java.util.Collections;
|
import java.util.LinkedList;
|
import java.util.List;
|
|
import androidx.annotation.NonNull;
|
import androidx.annotation.Nullable;
|
|
|
public class BeibeiVideoApplication extends Application {
|
|
private final static String TAG = BeibeiVideoApplication.class.getSimpleName();
|
|
public static BeibeiVideoApplication application = null;
|
public static String deviceName = null;
|
public static String deviceNumber = null;
|
public static String MMNumber;
|
public static IWXAPI mWxApi = null;
|
|
private static int mStatusBarHeight;
|
|
private static BeibeiVideoApplication instance;
|
|
public static BeibeiVideoApplication getInstance() {
|
return instance;
|
}
|
|
private static boolean inited = false;
|
|
private static List<Activity> mActivitys = Collections.synchronizedList(new LinkedList<Activity>());
|
|
public static void pushActivity(Activity activity) {
|
mActivitys.add(activity);
|
}
|
|
public static void popActivity(Activity activity) {
|
mActivitys.remove(activity);
|
}
|
|
public static void finishAllActivity() {
|
if (mActivitys == null) {
|
return;
|
}
|
for (Activity activity : mActivitys) {
|
activity.finish();
|
}
|
mActivitys.clear();
|
}
|
|
|
//兼容4.4以下版本
|
protected void attachBaseContext(Context newBase) {
|
super.attachBaseContext(newBase);
|
}
|
|
private static Handler handler = new Handler() {
|
@Override
|
public void handleMessage(Message msg) {
|
super.handleMessage(msg);
|
switch (msg.what) {
|
case 0:
|
if (authCodeCallBack != null)
|
BeibeiVideoAPI.getFuntvAuthCode(application, new BasicTextHttpResponseHandler() {
|
|
@Override
|
public void onSuccessPerfect(int statusCode, Header[] headers, JSONObject jsonObject) throws Exception {
|
if (jsonObject.optBoolean("IsPost")) {
|
String authCode = jsonObject.optString("Data");
|
if (!StringUtils.isNullOrEmpty(authCode)) {
|
SharedPreferences.Editor editor = application.getSharedPreferences("funtv", Context.MODE_PRIVATE).edit();
|
editor.putString("authCode", authCode);
|
editor.commit();
|
}
|
authCodeCallBack.onSuccess(authCode);
|
} else {
|
SharedPreferences share = application.getSharedPreferences("funtv", Context.MODE_PRIVATE);
|
String authCode = share.getString("authCode", "");
|
if (!StringUtils.isNullOrEmpty(authCode)) {
|
authCodeCallBack.onSuccess(authCode);
|
}
|
}
|
}
|
|
@Override
|
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
|
super.onFailure(statusCode, headers, responseString, throwable);
|
SharedPreferences share = application.getSharedPreferences("funtv", Context.MODE_PRIVATE);
|
String authCode = share.getString("authCode", "");
|
if (!StringUtils.isNullOrEmpty(authCode)) {
|
authCodeCallBack.onSuccess(authCode);
|
}
|
}
|
}
|
);
|
|
break;
|
|
}
|
}
|
};
|
|
|
private static IAuthCodeGetter.AuthCodeCallBack authCodeCallBack;
|
|
@Override
|
public void onCreate() {
|
if (BeibeiConstant.DEBUG) {
|
CrashHandler crashHandler = CrashHandler.getInstance();
|
crashHandler.init(getApplicationContext());
|
}
|
|
application = this;
|
instance = this;
|
if (UserUtil.isAgreeUserProtocol(this) || BeibeiConstant.IS_TEST) {
|
//如果同意了用户协议
|
init(application, null);
|
}
|
}
|
|
|
public static boolean IsInited() {
|
return inited;
|
}
|
|
/**
|
* 静态初始化
|
*
|
* @param application
|
*/
|
public static void init(final Application application, InitListener initListener) {
|
Log.i(TAG, "系统初始化");
|
// 初始化广告位
|
if(AndroidManifestUtil.isOppoChannel(application)){
|
CSJConstant.SPLASH_AD = "889066047";
|
CSJConstant.RECOMMEND_BIG_IMG_AD = "956732346";
|
CSJConstant.APP_EXIT = "956732346";
|
CSJConstant.VIDEO_DETAIL_PLAYER_BOTTOM= "956732346";
|
CSJConstant.VIDEO_SEARCH= "956732346";
|
CSJConstant.HOME_INTERSTITIALAD = "956732361";
|
}
|
|
|
inited = true;
|
registerActivityListener(application);
|
//防止动态代码注入
|
DebuggerUtils.checkDebuggableInNotDebugModel(application);
|
try {
|
Build bd = new Build();
|
String model = bd.MODEL;
|
BeibeiVideoApplication.deviceName = model;
|
BeibeiVideoApplication.deviceNumber = DeviceUtil.getImeiCache(application);
|
} catch (Exception e) {
|
}
|
|
//解决错误:Using WebView from more than one process at once with the same data directory is not supported
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
String processName = getProcessName(application);
|
String packageName = application.getPackageName();
|
if (!packageName.equals(processName)) {
|
WebView.setDataDirectorySuffix(processName);
|
}
|
}
|
|
//友盟初始化
|
String channel = AndroidManifestUtil.getChannel(application);
|
try {
|
UMConfigure.setLogEnabled(false);
|
UMConfigure.submitPolicyGrantResult(application, false);
|
UMConfigure.init(application, application.getResources().getString(R.string.umeng_key), channel, UMConfigure.DEVICE_TYPE_PHONE, null);
|
// 选用AUTO页面采集模式
|
MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO);
|
|
UMConfigure.submitPolicyGrantResult(application, false);
|
} catch (Throwable e) {
|
|
}
|
|
UMShareAPI.get(application);
|
PlatformConfig.setWeixin(BeibeiConstant.WECHAT_ID, BeibeiConstant.WECHAT_KEY);
|
PlatformConfig.setQQZone(BeibeiConstant.QQ_ID, BeibeiConstant.QQ_KEY);
|
PlatformConfig.setSinaWeibo(BeibeiConstant.SINA_ID, BeibeiConstant.SINA_KEY, "http://sns.whalecloud.com/sina2/callback");
|
|
ImageLoader.getInstance().init(buildDefaultILC(application));
|
initCSJAd(application, initListener);
|
if(AndroidManifestUtil.isHuaWeiChannel(application)) {
|
initHWAdSDK(application);
|
}
|
if(AndroidManifestUtil.isVIVOChannel(application)){
|
initVIVOAdSDK(application);
|
}
|
|
initKSSDK(application);
|
try {
|
GlobalSetting.setEnableCollectAppInstallStatus(false);
|
GDTAdSdk.init(application, BeibeiConstant.GDT_ID);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
|
|
initWX(application);
|
initX5(application);
|
if(BeibeiConstant.IS_TEST) {
|
initLog(application);
|
}
|
}
|
|
/**
|
* 初始化日志,将未捕获的错误保存到日志中
|
* @param application
|
*/
|
private static void initLog(Application application){
|
LogUtils.getLogConfig()
|
.configAllowLog(true)
|
.configTagPrefix("taoke")
|
.configShowBorders(true)
|
.configFormatTag("%d{HH:mm:ss:SSS} %t %c{-5}");
|
|
LogUtils.getLog2FileConfig().configLog2FileEnable(true)
|
// targetSdkVersion >= 23 需要确保有写sdcard权限
|
.configLog2FilePath(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Download/" + application.getPackageName() + "/logs")
|
.configLog2FileNameFormat("%d{yyyyMMdd}.txt")
|
.configLogFileEngine(new LogFileEngineFactory(application));
|
|
Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(application));
|
|
}
|
|
private static String getProcessName(Context context) {
|
if (context == null) return null;
|
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
|
for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
|
if (processInfo.pid == android.os.Process.myPid()) {
|
return processInfo.processName;
|
}
|
}
|
return null;
|
}
|
|
|
private static void initWX(Context context) {
|
//AppConst.WEIXIN.APP_ID是指你应用在微信开放平台上的AppID,记得替换
|
mWxApi = WXAPIFactory.createWXAPI(context, BeibeiConstant.WECHAT_ID, true);
|
// 将该app注册到微信
|
mWxApi.registerApp(BeibeiConstant.WECHAT_ID);
|
context.registerReceiver(new BroadcastReceiver() {
|
@Override
|
public void onReceive(Context context, Intent intent) {
|
// 将该app注册到微信
|
mWxApi.registerApp(BeibeiConstant.WECHAT_ID);
|
}
|
}, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));
|
}
|
|
|
public static void initTaoKe(Application application, AlibcTradeInitCallback alibcTradeInitCallback) {
|
if (!AlibcTradeSDK.initState.isInitialized()) {
|
Toast.makeText(application, "初始化淘客", Toast.LENGTH_SHORT).show();
|
AlibcTradeSDK.asyncInit(application, alibcTradeInitCallback);
|
} else {
|
alibcTradeInitCallback.onSuccess();
|
}
|
}
|
|
|
private static ImageLoaderConfiguration buildDefaultILC(Context context) {
|
// This configuration tuning is custom. You can tune every option, you may tune some of them,
|
// or you can create default configuration by
|
// ImageLoaderConfiguration.createDefault(this); method.
|
ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context);
|
config.threadPriority(Thread.NORM_PRIORITY - 2);
|
config.denyCacheImageMultipleSizesInMemory();
|
config.diskCacheFileNameGenerator(new Md5FileNameGenerator());
|
config.diskCacheSize(50 * 1024 * 1024); // 50 MiB
|
config.tasksProcessingOrder(QueueProcessingType.LIFO);
|
config.writeDebugLogs(); // Remove for release app
|
|
return config.build();
|
}
|
|
private static void initX5(Application application) {
|
QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {
|
|
@Override
|
public void onViewInitFinished(boolean arg0) {
|
//x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。
|
Log.d(TAG, " onViewInitFinished is " + arg0);
|
}
|
|
@Override
|
public void onCoreInitFinished() {
|
// TODO Auto-generated method stub
|
}
|
};
|
//x5内核初始化接口
|
QbSdk.initX5Environment(application, cb);
|
}
|
|
|
/**
|
* 穿山甲广告初始化
|
*/
|
private static void initCSJAd(Application context, InitListener initListener) {
|
TTAdManagerHolder.init(context, new TTAdSdk.Callback() {
|
@Override
|
public void success() {
|
if (initListener != null)
|
initListener.onFinish();
|
initDPSDK(context);
|
initDJ(context);
|
}
|
|
@Override
|
public void fail(int i, String s) {
|
if (initListener != null)
|
initListener.onFinish();
|
}
|
});
|
}
|
|
public static void initHWAdSDK(Context appContext){
|
HwAds.init(appContext);
|
}
|
|
//快手初始化
|
public static void initKSSDK(Context appContext) {
|
if (!AdUtil.isCanInitCSJ()) {
|
return;
|
}
|
KsAdSDK.init(appContext, new SdkConfig.Builder()
|
.appId("801000001") // 测试aapId,请联系快⼿平台申请正式AppId,必填
|
.appName(appContext.getString(R.string.app_name)) // 测试appName,请填写您应⽤的名称,⾮必填
|
.showNotification(true) // 是否展示下载通知栏
|
.debug(false)
|
.customController(new KsCustomController() {
|
@Override
|
public boolean canReadLocation() {
|
return false;
|
}
|
|
@Override
|
public boolean canUsePhoneState() {
|
return false;
|
}
|
|
@Override
|
public boolean canUseOaid() {
|
return false;
|
}
|
|
@Override
|
public String getImei() {
|
return DeviceUtil.getImeiCache(appContext);
|
}
|
|
@Override
|
public boolean canUseMacAddress() {
|
return false;
|
}
|
|
@Override
|
public boolean canReadInstalledPackages() {
|
return false;
|
}
|
|
@Override
|
public List<String> getInstalledPackages() {
|
return new ArrayList<>(); //DeviceUtil.getInstalledPackageNamesCache(appContext);
|
}
|
})// 是否开启sdk 调试⽇志 可选
|
.build());
|
}
|
|
// VIVO广告初始化
|
public static void initVIVOAdSDK(Application application){
|
VAdConfig adConfig = new VAdConfig.Builder()
|
.setMediaId("90928ed246a845d9a889aae07a961d78")
|
//是否开启日志输出,请确保不要在正式环境开启
|
// .setDebug(BuildConfig.DEBUG)
|
//隐私数据获取配置,请根据 App 情况认真配置,避免产生收入问题或合规风险
|
.setCustomController(new VCustomController() {
|
@Override
|
public boolean isCanUseLocation() {//是否允许获取位置信息,默认允许
|
return true;
|
}
|
@Override
|
public VLocation getLocation() {
|
//若不允许获取位置信息,亦可主动传给 SDK 位置信息
|
return null;
|
}
|
@Override
|
public boolean isCanUsePhoneState() {//是否允许获取 imei 信息,默认允许
|
return true;
|
}
|
@Override
|
public String getImei() {//若不允许获取 imei 信息,亦可主动传给 SDK imei 信息
|
String imei = DeviceUtil.getImeiCache(application);
|
return imei;
|
}
|
@Override
|
public boolean isCanUseWriteExternal() {//是否允许使用公共存储空间,默认允许
|
return true;
|
}
|
@Override
|
public boolean isCanPersonalRecommend() { //是否允许推荐个性化广告,默认允许
|
return true;
|
}
|
@Override
|
public boolean isCanUseImsi() { //是否允许获取 imsi,默认不允许
|
return false;
|
}
|
@Override
|
public boolean isCanUseApplist() { //是否允许获取应用列表,默认允许
|
return false;
|
}
|
@Override
|
public boolean isCanUseAndroidId() {//是否允许获取 AndroidId,默认允许
|
return true;
|
}
|
@Override
|
public boolean isCanUseMac() {//是否允许获取 mac,默认不允许
|
return false;
|
}
|
@Override
|
public boolean isCanUseIp() {//是否允许获取 ip,默认允许
|
return true;
|
}
|
}).build();
|
|
VivoAdManager.getInstance().init(application, adConfig, new VInitCallback() {
|
@Override
|
public void suceess() {
|
Log.d("VIVO AD SDKInit", "suceess");
|
}
|
@Override
|
public void failed(@NonNull VivoAdError adError) {
|
//若是报超时错误,则检查是否正常出现广告,如无异常,则是正常的
|
Log.e("VIVO AD SDKInit", "failed: " + adError.toString());
|
}
|
});
|
}
|
|
private static boolean dpSDKIninted;
|
|
public static void initDPSDK(Application application) {
|
if (!AdUtil.isCanInitCSJ()) {
|
return;
|
}
|
if (!dpSDKIninted) {
|
DPSdkConfig.Builder configBuilder = new DPSdkConfig.Builder()
|
.debug(false)
|
.privacyController(new IDPPrivacyController() {
|
@Override
|
public boolean isCanUsePhoneState() {
|
return false;
|
}
|
|
@Override
|
public String getImei() {
|
return DeviceUtil.getImeiCache(application);
|
}
|
|
@Override
|
public String getImsi() {
|
return DeviceUtil.getImsiCache(application);
|
}
|
|
@Override
|
public boolean isCanUseAndroidId() {
|
return false;
|
}
|
|
@Override
|
public String getAndroidId() {
|
return super.getAndroidId();
|
}
|
});
|
// .initListener(new DPSdkConfig.InitListener() {
|
// @Override
|
// public void onInitComplete(boolean b, String s) {
|
// dpSDKIninted = b;
|
// }
|
// }) //接入了红包功能需要传入的参数,没有接入的话可以忽略该配置
|
// .luckConfig(new DPSdkConfig.LuckConfig().application(application).enableLuck(false))
|
// .liveConfig(new DPSdkConfig.LiveConfig())
|
|
//若您需要接入直播,参考「直播接入文档」;否则可忽略此参数。
|
try {
|
DPSdk.init(application, "SDK_Setting_5095354.json", configBuilder.build());
|
// DPSdk.start(new DPSdk.StartListener() {
|
// @Override
|
// public void onStartComplete(boolean b, String s) {
|
// dpSDKIninted = b;
|
// Log.i(TAG," DPSdk.start:"+b+", "+s);
|
// }
|
// });
|
} catch (Exception e) {
|
|
}
|
|
}
|
|
}
|
|
public static void initDJ(Application application){
|
try{
|
DJXSdk.init(application, "SDK_Setting_5095354.json", new DJXSdkConfig.Builder().privacyController(new IDJXPrivacyController() {
|
@Override
|
public boolean isOnlyICPNumber() {
|
return true;
|
}
|
}).debug(true).build());
|
DJXSdk.start(new DJXSdk.StartListener() {
|
@Override
|
public void onStartComplete(boolean b, String s, @Nullable DJXError djxError) {
|
Log.i(TAG, String.format("DJXSdk.init:%s,%s", b, s));
|
}
|
});
|
}catch(Exception e){
|
e.printStackTrace();
|
}
|
|
|
|
}
|
|
|
class MyActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks {
|
private int mFinalCount;
|
|
@Override
|
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
|
|
}
|
|
@Override
|
public void onActivityStarted(Activity activity) {
|
mFinalCount++;
|
//如果mFinalCount ==1,说明是从后台到前台
|
if (mFinalCount == 1) {
|
Log.e(TAG, "应用从后台切换到前台");
|
// 进入前台 改为热启动
|
//判断当前activity
|
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
|
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
|
if (!cn.getClassName().equalsIgnoreCase(SplashActivity.class.getName())) {
|
//小于30分钟不展示
|
// 测试
|
if (System.currentTimeMillis() - SplashADFragment.lastShowTime < 1000 * 60 * 30L)
|
return;
|
}
|
}
|
}
|
|
@Override
|
public void onActivityResumed(Activity activity) {
|
|
}
|
|
@Override
|
public void onActivityPaused(Activity activity) {
|
|
}
|
|
@Override
|
public void onActivityStopped(Activity activity) {
|
mFinalCount--;
|
//如果mFinalCount ==0,说明是前台到后台
|
if (mFinalCount == 0) {
|
Log.e(TAG, "应用从前台切换到后台");
|
}
|
|
}
|
|
@Override
|
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
|
|
}
|
|
@Override
|
public void onActivityDestroyed(Activity activity) {
|
|
}
|
}
|
|
public interface InitListener {
|
public void onFinish();
|
|
}
|
|
private static void registerActivityListener(Application application) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
|
application.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
|
@Override
|
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
|
/**
|
* 监听到 Activity创建事件 将该 Activity 加入list
|
*/
|
pushActivity(activity);
|
}
|
|
@Override
|
public void onActivityStarted(Activity activity) {
|
|
}
|
|
@Override
|
public void onActivityResumed(Activity activity) {
|
|
}
|
|
@Override
|
public void onActivityPaused(Activity activity) {
|
|
}
|
|
@Override
|
public void onActivityStopped(Activity activity) {
|
|
}
|
|
@Override
|
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
|
|
}
|
|
@Override
|
public void onActivityDestroyed(Activity activity) {
|
if (null==mActivitys||mActivitys.isEmpty()) {
|
return;
|
}
|
if (mActivitys.contains(activity)) {
|
/**
|
* 监听到 Activity销毁事件 将该Activity 从list中移除
|
*/
|
popActivity(activity);
|
}
|
}
|
});
|
}
|
}
|
|
}
|
|
|
class MyExceptionHandler implements Thread.UncaughtExceptionHandler {
|
private final String TAG ="MyExceptionHandler";
|
private final Context context;
|
|
public MyExceptionHandler(Context context) {
|
this.context = context;
|
}
|
|
@Override
|
public void uncaughtException(Thread t, Throwable e) {
|
try {
|
StringWriter sw = new StringWriter();
|
PrintWriter pw = new PrintWriter(sw);
|
e.printStackTrace(pw);
|
pw.flush();
|
sw.flush();
|
LogUtils.tag(TAG).e(sw.toString());
|
LogUtils.getLog2FileConfig().flushAsync();
|
}catch(Throwable ee){
|
|
}
|
}
|
}
|