BuWanVideo/AndroidManifest.xml
@@ -53,6 +53,7 @@ <uses-permission android:name="com.ddysvideo.mozillaonline.permission.ACCESS_DOWNLOAD_MANAGER_ADVANCED" /> <uses-permission android:name="com.ddysvideo.mozillaonline.permission.SEND_DOWNLOAD_COMPLETED_INTENTS" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/> <!-- 快手 --> <permission android:name="${applicationId}.permission.KW_SDK_BROADCAST" @@ -336,7 +337,7 @@ android:value="570f28a578d6e12cba6f7f200b8d1c83"></meta-data> <meta-data android:name="UMENG_CHANNEL" android:value="huawei"></meta-data> android:value="vivo"></meta-data> <provider BuWanVideo/build.gradle
@@ -59,6 +59,8 @@ implementation files('libs/AlibcTradeBiz-4.0.0.27.aar') implementation files('libs/AlibcTradeCommon-4.0.0.27.aar') implementation files('libs/nb_trade-4.0.0.27.aar') implementation files('libs/nb_trade-4.0.0.27.aar') implementation files('libs/open_ad_6.1.7.2_841bfa881_2394g.aar') implementation 'androidx.cardview:cardview:1.0.0' @@ -106,7 +108,9 @@ implementation("com.pangle.cn:pangrowth-dpsdk:5.1.1.0") { exclude group: 'com.pangle.cn', module: 'adclog' } implementation 'com.pangle.cn:pangrowth-djx-sdk:1.1.8.0' implementation 'com.pangle.cn:pangrowth-base:2.1.0.0' implementation 'com.pangle.cn:pangrowth-djx-sdk:2.1.0.0' implementation 'com.pangle.cn:pangrowth-nov-sdk:2.1.0.0' implementation 'com.bytedance.applog:RangersAppLog-Lite-cn:6.15.3' @@ -159,17 +163,17 @@ defaultConfig { applicationId "com.doudou.ysvideo" versionCode 148 versionName "3.10.30" versionCode 149 versionName "3.10.31" multiDexEnabled = true minSdkVersion 21 targetSdkVersion 30 ndk { // 32与64 // abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' //64的 abiFilters 'arm64-v8a', 'x86_64' // abiFilters 'arm64-v8a', 'x86_64' //兼容64位与32位系统 // abiFilters 'armeabi-v7a', 'arm64-v8a' BuWanVideo/libs/open_ad_6.1.7.2_841bfa881_2394g.aarBinary files differ
BuWanVideo/libs/open_ad_sdk_5.4.3.5.aarBinary files differ
BuWanVideo/res/values/strings.xml
@@ -1,5 +1,5 @@ <resources> <string name="app_name">影视大全布丸</string> <string name="app_name">影视大全</string> <string name="recommend">视频</string> <string name="category">分类</string> <string name="discover">发现</string> BuWanVideo/src/com/weikou/beibeivideo/BeibeiVideoApplication.java
@@ -50,6 +50,12 @@ 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; @@ -71,6 +77,7 @@ import java.util.LinkedList; import java.util.List; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -249,9 +256,13 @@ ImageLoader.getInstance().init(buildDefaultILC(application)); initCSJAd(application, initListener); if("huawei".equalsIgnoreCase(channel)) { if(AndroidManifestUtil.isHuaWeiChannel(application)) { initHWAdSDK(application); } if(AndroidManifestUtil.isVIVOChannel(application)){ initVIVOAdSDK(application); } initKSSDK(application); try { GlobalSetting.setEnableCollectAppInstallStatus(false); @@ -433,6 +444,76 @@ })// 是否开启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 true; } @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) { BuWanVideo/src/com/weikou/beibeivideo/ui/login/LoginActivity.java
@@ -1,11 +1,13 @@ package com.weikou.beibeivideo.ui.login; import android.Manifest; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -21,6 +23,8 @@ import android.widget.Toast; import com.lcjian.library.dialog.DialogUtil; import com.lcjian.library.permission.PermissionHelper; import com.lcjian.library.permission.PermissionInterface; import com.lcjian.library.util.SingleToast; import com.lcjian.library.util.common.DeviceUtil; import com.lcjian.library.util.common.StringUtils; @@ -45,7 +49,9 @@ import java.util.List; import java.util.Map; public class LoginActivity extends BaseActivity implements OnClickListener { import androidx.annotation.NonNull; public class LoginActivity extends BaseActivity implements OnClickListener, PermissionInterface { public static final int RESULT_LOGIN = 10; private LinearLayout ll_login_qq, ll_login_wx; private boolean isTouchLogin;// 用户是否点击登录 @@ -60,13 +66,14 @@ private TextView tv_forget_pwd; private TextView tv_register; private TextView tv_login, tv_other_login, tv_title; private PermissionHelper mPermissionsChecker; // 权限检测器 检测是否有储存卡写入读取权限 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //防止截屏攻击风险 if(!BeibeiConstant.IS_TEST) { if (!BeibeiConstant.IS_TEST) { getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); } setContentView(R.layout.act_login); @@ -103,6 +110,8 @@ findViewById(R.id.tv_privacy_policy).setOnClickListener(this); setLoginType(false); mPermissionsChecker = new PermissionHelper(this, this);//权限 } private void setLoginType(boolean email) { @@ -142,6 +151,13 @@ SingleToast.showToast(LoginActivity.this, "选择同意用户协议后方可登录"); break; } if (Build.VERSION.SDK_INT < 30) { //Android 11以下的要请求安装应用列表 if (mPermissionsChecker.lacksPermissions(getPermissions())) {//检测是否有写入的权限 mPermissionsChecker.showNormalDialog("设备应用列表权限说明", "判断设备是否安装QQ/微信,用于三方登录"); return; } } if (isQQClientAvailable(getApplicationContext())) { loginType = "1"; // qq登录逻辑处理 点击登录后需要暂时锁定返回键和返回功能 不然会报错 @@ -156,6 +172,14 @@ if (!cb_user_agreement.isChecked()) { SingleToast.showToast(LoginActivity.this, "选择同意用户协议后方可登录"); break; } if (Build.VERSION.SDK_INT < 30) { //Android 11以下的要请求安装应用列表 if (mPermissionsChecker.lacksPermissions(getPermissions())) {//检测是否有写入的权限 mPermissionsChecker.showNormalDialog("设备应用列表权限说明", "判断设备是否安装QQ/微信,用于三方登录"); return; } } if (isWXClientAvailable(getApplicationContext())) { loginType = "2"; @@ -197,29 +221,27 @@ * 判断qq是否可用 */ public static boolean isQQClientAvailable(Context context) { List<PackageInfo> pinfo = DeviceUtil.getInstalledPackagesCache(context); if (pinfo != null) { for (int i = 0; i < pinfo.size(); i++) { String pn = pinfo.get(i).packageName; if (pn.equals("com.tencent.mobileqq")) { return true; } } PackageManager packageManager = context.getPackageManager(); try { // 尝试获取应用信息 packageManager.getPackageInfo("com.tencent.mobileqq", PackageManager.GET_ACTIVITIES); return true; } catch (PackageManager.NameNotFoundException e) { // 应用未找到,返回 false return false; } return false; } public static boolean isWXClientAvailable(Context context) { List<PackageInfo> pinfo = DeviceUtil.getInstalledPackagesCache(context); if (pinfo != null) { for (int i = 0; i < pinfo.size(); i++) { String pn = pinfo.get(i).packageName; if (pn.equals("com.tencent.mm")) { return true; } } PackageManager packageManager = context.getPackageManager(); try { // 尝试获取应用信息 packageManager.getPackageInfo("com.tencent.mm", PackageManager.GET_ACTIVITIES); return true; } catch (PackageManager.NameNotFoundException e) { // 应用未找到,返回 false return false; } return false; } UMAuthListener authListener = new UMAuthListener() { @@ -465,4 +487,34 @@ finish(); } } @Override public int getPermissionsRequestCode() { return 20001; } @Override public String[] getPermissions() { return new String[]{Manifest.permission.INSTALL_PACKAGES}; } @Override public void requestPermissionsSuccess() { DeviceUtil.getInstalledPackages(this); } @Override public void requestPermissionsFail() { } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (mPermissionsChecker.requestPermissionsResult(requestCode, permissions, grantResults)) { //权限请求结果,并已经处理了该回调 return; } super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } BuWanVideo/src/com/weikou/beibeivideo/ui/main/DYNewsFragment.java
@@ -8,23 +8,15 @@ import com.bytedance.sdk.dp.DPWidgetNewsParams; import com.bytedance.sdk.dp.IDPNewsListener; import com.bytedance.sdk.dp.IDPWidget; import com.kwad.sdk.api.KsAdSDK; import com.kwad.sdk.api.KsContentPage; import com.kwad.sdk.api.KsFeedPage; import com.kwad.sdk.api.KsScene; import com.weikou.beibeivideo.R; import com.weikou.beibeivideo.ui.MyRetainViewFragment; import com.weikou.beibeivideo.util.ad.KSConstant; import com.weikou.beibeivideo.util.video.DPEventCollectUtil; import com.weikou.beibeivideo.widget.MySwipeRefreshLayout; import java.util.List; import java.util.Map; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; /** * 主页面--快手视频 BuWanVideo/src/com/weikou/beibeivideo/ui/main/DYNovelFragment.java
New file @@ -0,0 +1,109 @@ package com.weikou.beibeivideo.ui.main; import android.os.Bundle; import android.util.Log; import android.view.View; import com.bytedance.sdk.djx.IDJXWidget; import com.bytedance.sdk.dp.DPSdk; import com.bytedance.sdk.dp.DPWidgetNewsParams; import com.bytedance.sdk.dp.IDPNewsListener; import com.bytedance.sdk.dp.IDPWidget; import com.bytedance.sdk.nov.api.INovWidgetFactory; import com.bytedance.sdk.nov.api.NovSdk; import com.bytedance.sdk.nov.api.params.NovReaderConfig; import com.bytedance.sdk.nov.api.params.NovWidgetHomeParams; import com.weikou.beibeivideo.R; import com.weikou.beibeivideo.ui.MyRetainViewFragment; import com.weikou.beibeivideo.util.video.DPEventCollectUtil; import com.weikou.beibeivideo.widget.MySwipeRefreshLayout; import java.util.Map; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; /** * 抖音短故事 */ public class DYNovelFragment extends MyRetainViewFragment { private static final String TAG = "DYNovelFragment"; private FragmentManager fragmentManager; private IDJXWidget mIDPWidget; private MySwipeRefreshLayout swipeRefreshLayout; public DYNovelFragment() { super(); } public DYNovelFragment(FragmentManager fragmentManager) { super(); this.fragmentManager = fragmentManager; //fragmentManager; setName(DYNovelFragment.class.getName()); } private Fragment fragment; @Override public int getContentResource() { return R.layout.fragment_ks_video; } @Override public void onResume() { super.onResume(); if (mIDPWidget != null && mIDPWidget.getFragment() != null) { mIDPWidget.getFragment().onResume(); } } @Override public void onPause() { super.onPause(); if (mIDPWidget != null && mIDPWidget.getFragment() != null) { mIDPWidget.getFragment().onPause(); } } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (mIDPWidget != null && mIDPWidget.getFragment() != null) { mIDPWidget.getFragment().setUserVisibleHint(isVisibleToUser); } } @Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if (mIDPWidget != null && mIDPWidget.getFragment() != null) { mIDPWidget.getFragment().onHiddenChanged(hidden); } } @Override public void onCreateView(View contentView, Bundle savedInstanceState) { Log.i(TAG, "onCreateView"); swipeRefreshLayout = contentView.findViewById(R.id.srl_ks); swipeRefreshLayout.setEnabled(false); initNewsWidget(); } private void initNewsWidget() { NovReaderConfig config=new NovReaderConfig(); NovWidgetHomeParams params = new NovWidgetHomeParams(config); mIDPWidget = NovSdk.factory().createStoryHome(params); Fragment fragment = mIDPWidget.getFragment(); if (fragment != null && getChildFragmentManager() != null) { getChildFragmentManager().beginTransaction().replace(R.id.fl_content, fragment).commitAllowingStateLoss(); } } private static void log(String msg) { Log.d(TAG, String.valueOf(msg)); } } BuWanVideo/src/com/weikou/beibeivideo/ui/main/MainActivity.java
@@ -1,5 +1,6 @@ package com.weikou.beibeivideo.ui.main; import android.Manifest; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; @@ -7,6 +8,7 @@ import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.database.Cursor; import android.graphics.Color; import android.graphics.ColorMatrix; @@ -88,6 +90,7 @@ import java.util.Random; import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; import androidx.fragment.app.Fragment; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; @@ -132,8 +135,8 @@ return new Fragment[]{ new HomeFragment(), new DrawVideoFragment(getSupportFragmentManager()), new DYNovelFragment(getSupportFragmentManager()), new DYNewsFragment(getSupportFragmentManager()), new DYDramaVideoFragment(getSupportFragmentManager()), new MineFragment() }; } @@ -148,6 +151,11 @@ case R.id.rb_nav_draw_video: { mFragmentSwitchHelper .changeFragment(DrawVideoFragment.class); } break; case R.id.rb_nav_novel: { mFragmentSwitchHelper .changeFragment(DYNovelFragment.class); } break; case R.id.rb_nav_short_tv: { @@ -283,6 +291,13 @@ public void onStartComplete(boolean b, String s) { } }); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { String[] permissions={ Manifest.permission.READ_PHONE_STATE }; ActivityCompat.requestPermissions(MainActivity.this, permissions, 10010); } } /** @@ -461,11 +476,12 @@ AdUtil.setAdHuaWeiShown(getApplicationContext(), AdPositionEnum.homeInterstitial); } InterstitialAdUtil.showAd(MainActivity.this, type, HuaWeiAdConstant.HW_AD_HOME_INTERSTITIAL); } else { }else if (type == AdUtil.AD_TYPE.vivo) { InterstitialAdUtil.showAd(MainActivity.this, type, "33fcac40272e43e1b52d18e9988afeef"); } else { InterstitialAdUtil.showAd(MainActivity.this, type, GDTConstant.HOME_INTERSTITIAL); } } }; //延迟三秒显示 BuWanVideo/src/com/weikou/beibeivideo/ui/media/VideoDetailActivity2.java
@@ -86,6 +86,7 @@ import com.weikou.beibeivideo.util.ad.AdUtil; import com.weikou.beibeivideo.util.ad.CSJConstant; import com.weikou.beibeivideo.util.ad.FullVideoAdManager; import com.weikou.beibeivideo.util.ad.GDTConstant; import com.weikou.beibeivideo.util.ad.HuaWeiAdConstant; import com.weikou.beibeivideo.util.ad.InterstitialAdUtil; import com.weikou.beibeivideo.util.goldcorn.GoldCornUtil; @@ -310,30 +311,33 @@ return; //如果是全局广告配置不允许展示则不展示 if (AdUtil.getAdType(getApplicationContext(), AdPositionEnum.videoDetailFullVideo)==null){ AdUtil.AD_TYPE adType = AdUtil.getAdType(getApplicationContext(), AdPositionEnum.videoDetailFullVideo); if(adType==null){ return; } //加载广告 if (BeibeiConstant.AD_TYPE.isVideoDetailSplashAd()) { //如果是华为渠道,固定为广点通插屏 if(AndroidManifestUtil.isHuaWeiChannel(getApplicationContext())){ if(adType == AdUtil.AD_TYPE.hw){ if(!AdUtil.canShowAdHuaWei(getApplicationContext(),AdPositionEnum.videoDetailFullVideo)){ return; } AdUtil.setAdHuaWeiShown(getApplicationContext(),AdPositionEnum.videoDetailFullVideo); //采用广点通插屏 //采用华为插屏 InterstitialAdUtil.showAd(this, AdUtil.AD_TYPE.hw, HuaWeiAdConstant.HW_AD_VIDEO_DETAIL_INTERSTITIAL); return; }else if(adType == AdUtil.AD_TYPE.vivo){ InterstitialAdUtil.showAd(this, AdUtil.AD_TYPE.vivo, "5300a2b3d8054b1780d44fc0fcee67c9"); return; } //判断加载广告的类型 if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) { int fullvideo = adInfo.getFullVideoWeight(); int interstitial = adInfo.getInterstitialWeight(); int random = (int) ((fullvideo + interstitial) * Math.random()); if (random <= fullvideo) { int fullvideo = adInfo.getFullVideoWeight(); int interstitial = adInfo.getInterstitialWeight(); int random = (int) ((fullvideo + interstitial) * Math.random()); if (random <= fullvideo) { // 全屏广告 if(adType == AdUtil.AD_TYPE.gdt||Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT_WATCH){ FullVideoAdManager.getInstance().loadGDT(VideoDetailActivity2.this, null); }else{ if (FullVideoAdManager.getInstance().isCacahed()) { FullVideoAdManager.getInstance().showAd(this); } else { @@ -344,11 +348,15 @@ } }); } } else { } }else{ // 插屏广告 if(adType == AdUtil.AD_TYPE.gdt||Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT_WATCH){ // 广点通 InterstitialAdUtil.showAd(this, AdUtil.AD_TYPE.gdt, GDTConstant.PID_2_VIDEO_DETAIL_INTERSTITIAL); }else{ showInterstitialAd(); } } else { FullVideoAdManager.getInstance().loadGDT(VideoDetailActivity2.this, null); } } } BuWanVideo/src/com/weikou/beibeivideo/util/ad/AdUtil.java
@@ -19,7 +19,7 @@ public class AdUtil { public enum AD_TYPE { gdt("广点通"), csj("穿山甲"), gdt2("广点通2.0"), hw("华为"); gdt("广点通"), csj("穿山甲"), gdt2("广点通2.0"), hw("华为"), vivo("vivo"); private String name; BuWanVideo/src/com/weikou/beibeivideo/util/ad/FullVideoAdManager.java
@@ -51,11 +51,10 @@ private void loadCSJ(final Context context, final IFullVideoAdListener adListener) { int w = DimenUtils.getScreenWidth(context); int h = DimenUtils.getScreenHeight(context); String channel = AndroidManifestUtil.getChannel(context); String pid =AndroidManifestUtil.isVIVOChannel(context)?CSJConstant.VIDEO_DETAIL_INTERSTITIALAD_VIVO : CSJConstant.VIDEO_DETAIL_INTERSTITIALAD; if ("huawei".equalsIgnoreCase(channel)) { pid = "948943768"; } String pid =CSJConstant.VIDEO_DETAIL_INTERSTITIALAD; // if ("huawei".equalsIgnoreCase(channel)) { // pid = "948943768"; // } AdSlot adSlot = new AdSlot.Builder() BuWanVideo/src/com/weikou/beibeivideo/util/ad/InterstitialAdUtil.java
@@ -16,6 +16,15 @@ import com.qq.e.ads.interstitial2.UnifiedInterstitialAD; import com.qq.e.ads.interstitial2.UnifiedInterstitialADListener; import com.qq.e.comm.util.AdError; import com.vivo.mobilead.unified.base.AdParams; import com.vivo.mobilead.unified.base.VivoAdError; import com.vivo.mobilead.unified.base.callback.MediaListener; import com.vivo.mobilead.unified.interstitial.UnifiedVivoInterstitialAd; import com.vivo.mobilead.unified.interstitial.UnifiedVivoInterstitialAdListener; import java.util.HashMap; import java.util.Map; import java.util.Objects; public class InterstitialAdUtil { @@ -33,6 +42,8 @@ showGDT(context, pid); }else if (adType == AdUtil.AD_TYPE.hw) { loadHW(context, pid); }else if (adType == AdUtil.AD_TYPE.vivo) { loadVIVO(context, pid); } } @@ -93,6 +104,74 @@ interstitialAd.loadAd(adParam); } private static Map<String, UnifiedVivoInterstitialAd> vivoInterstitialAdMap=new HashMap<>(); private static void loadVIVO(Activity context, String adId) { AdParams adParam = new AdParams.Builder(adId).build(); UnifiedVivoInterstitialAd vivoInterstitialAd = new UnifiedVivoInterstitialAd(context, adParam, new UnifiedVivoInterstitialAdListener() { @Override public void onAdReady() { Log.i(TAG,"onAdReady"); if(vivoInterstitialAdMap.get(adId)!=null) { Objects.requireNonNull(vivoInterstitialAdMap.get(adId)).showAd(); } } @Override public void onAdFailed(VivoAdError vivoAdError) { Log.i(TAG,"VivoAdError:"+vivoAdError.getMsg()); } @Override public void onAdClick() { } @Override public void onAdShow() { } @Override public void onAdClose() { vivoInterstitialAdMap.remove(adId); } }); vivoInterstitialAdMap.put(adId, vivoInterstitialAd); vivoInterstitialAd.setMediaListener(new MediaListener() { @Override public void onVideoStart() { } @Override public void onVideoPause() { } @Override public void onVideoPlay() { } @Override public void onVideoError(VivoAdError vivoAdError) { Log.i(TAG,"VivoAdError"); } @Override public void onVideoCompletion() { Log.i(TAG,"onVideoCompletion"); } @Override public void onVideoCached() { Log.i(TAG,"onVideoCached"); } }); vivoInterstitialAd.loadVideoAd(); } private static UnifiedInterstitialAD iad = null; library-common/AndroidManifest.xml
@@ -4,6 +4,8 @@ android:versionName="1.0" > <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <application android:allowBackup="true" android:label="@string/app_name" library-common/src/com/lcjian/library/util/common/DeviceUtil.java
@@ -1,14 +1,18 @@ package com.lcjian.library.util.common; import android.Manifest; import android.app.Application; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Build; import android.provider.Settings; import android.telephony.TelephonyManager; import java.util.ArrayList; import java.util.List; import androidx.core.app.ActivityCompat; import static android.content.Context.TELEPHONY_SERVICE; @@ -30,6 +34,13 @@ return installedPackages; } public static synchronized List<PackageInfo> getInstalledPackages(Context context) { PackageManager pManager = context.getPackageManager(); //获取手机内所有应用 installedPackages = pManager.getInstalledPackages(0); return installedPackages; } public static synchronized List<String> getInstalledPackageNamesCache(Context context) { List<PackageInfo> list = getInstalledPackagesCache(context); @@ -41,27 +52,34 @@ } public static synchronized String getImeiCache(Context context) { if(imei!=null){ if (imei != null) { return imei; } TelephonyManager manager = (TelephonyManager) context.getSystemService(TELEPHONY_SERVICE); try { imei = manager.getDeviceId(); }catch(Exception e){ if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { return null; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { imei = manager.getImei(); }else{ imei = manager.getDeviceId(); } } catch (Exception e) { e.printStackTrace(); } imei = imei == null ? "" : imei; return imei; } public static synchronized String getAndroidIdCache(Context context){ if(android_id!=null){ public static synchronized String getAndroidIdCache(Context context) { if (android_id != null) { return android_id; } try { android_id = Settings.System.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); }catch(Exception e){ } catch (Exception e) { } android_id = android_id == null ? "" : android_id; @@ -69,15 +87,15 @@ } public static synchronized String getImsiCache(Context context){ if(imsi!=null){ public static synchronized String getImsiCache(Context context) { if (imsi != null) { return imsi; } TelephonyManager mTelephonyMgr = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); try { imsi = mTelephonyMgr.getSubscriberId(); }catch(Exception e){ } catch (Exception e) { } imsi = imsi == null ? "" : imsi;