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 mActivitys = Collections.synchronizedList(new LinkedList()); 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 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){ } } }