# AdMoreSDK-android **Repository Path**: juquanyou/ad-more-sdk-android ## Basic Information - **Project Name**: AdMoreSDK-android - **Description**: AdMoreSDK-android - **Primary Language**: Java - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-09-27 - **Last Updated**: 2024-04-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AdMoreSdk - Android接入文档 [TOC] ## 1.SDK接入 ### 1.1引入方式 #### 1.1.1 以module方式引入(推荐) 新建module 删除res下的文件(重要!! 避免一些AAPT错误) 新module中导入aar以及gradle配置 //aar导入如图(参考项目中imgs下aarlibs.png) ![aar引入](imgs/aarlibs.png) gradle配置如图 ``` //主App的gradle配置 android{ repositories { flatDir { dirs 'libs' dirs project(':libAdmore').file('libs') } } } dependencies{ //替换为您项目导入的module名称,此处引用的是lib implementation project(':libAdmore') } //lib module的gradle配置 android{ repositories { flatDir { dirs 'libs' } } } dependencies{ ... implementation project(':libAdmore') } ``` 注:如遇aapt打包问题可删除新建module下的res文件夹 #### 1.1.2直接主Module导入SDK依赖的aar包以(gradle配置) 参考demo中的配置 ```gradle dependencies{ //admore-sdk api(name: 'AdMoreSdkLib-V2.0.1.release', ext: 'aar') implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs/admore') } ``` ### 1.2 必要权限以及menifest配置 ###### 权限相关 为了适配下载和安装相关功能,在工程中引用的包 `com.android.support:support-v4:24.2.0` 使用24.2.0以及以上版本。 #### 运行环境配置 本SDK可运行于Android4.1 (API Level 19) 及以上版本。 #### OAID 接入 **接入sigmob的广告后**,建议开发者优先集成OAID。Android 10 无法通过常规方式获取IMEI,影响广告测试及正式广告的填充。MSA联盟官网地址: http://www.msa-alliance.cn/col.jsp?id=120建议接入 MSA 1.0.22 版本(demo中接入的版本就是1.0.22) 1. 把 msa_mdid_x.x.x.aar 或者 oaid_sdk_x.x.x.aar 拷贝到项的 libs 目录,并设置依赖,其中 x.x.x 代表版本号。 2. 将 supplierconfig.json 拷贝到项目 assets 目录下,并修改里边对应内容,特别是需要设置 appid 的部分。需要设置 appid 的部分需要去对应厂商的应用商店里注册自己的app。 3. 混淆设置。 #oaid 不同的版本混淆代码不太一致,你注意你接入的oaid版本 -dontwarn com.bun.** -keep class com.bun.** {*;} -keep class a.**{*;} -keep class XI.CA.XI.**{*;} -keep class XI.K0.XI.**{*;} -keep class XI.XI.K0.**{*;} -keep class XI.vs.K0.**{*;} -keep class XI.xo.XI.XI.**{*;} -keep class com.asus.msa.SupplementaryDID.**{*;} -keep class com.asus.msa.sdid.**{*;} -keep class com.huawei.hms.ads.identifier.**{*;} -keep class com.samsung.android.deviceidservice.**{*;} -keep class com.zui.opendeviceidlibrary.**{*;} -keep class org.json.**{*;} -keep public class com.netease.nis.sdkwrapper.Utils {public ;} 4. 设置 gradle 编译选项,这块可以根据自己对平台的选择进里合里配置 ,也可以不配置 ndk { abiFilters 'armeabi-v7a','arm64-v8a' } packagingOptions { doNotStrip "*/armeabi-v7a/*.so" doNotStrip "*/arm64-v8a/*.so" } #### 代码混淆 ```混淆相关 ## admore -keep class com.admore.sdk.** {*;} ## admore csj -keepclassmembers class * { *** getContext(...); *** getActivity(...); *** getResources(...); *** startActivity(...); *** startActivityForResult(...); *** registerReceiver(...); *** unregisterReceiver(...); *** query(...); *** getType(...); *** insert(...); *** delete(...); *** update(...); *** call(...); *** setResult(...); *** startService(...); *** stopService(...); *** bindService(...); *** unbindService(...); *** requestPermissions(...); *** getIdentifier(...); } -keep class com.bytedance.pangle.** {*;} -keep class com.bytedance.sdk.openadsdk.** { *; } -keep class com.bytedance.frameworks.** { *; } -keep class ms.bd.c.Pgl.**{*;} -keep class com.bytedance.mobsec.metasec.ml.**{*;} -keep class com.ss.android.**{*;} -keep class com.bytedance.embedapplog.** {*;} -keep class com.bytedance.embed_dr.** {*;} -keep class com.bykv.vk.** {*;} // admore 聚合混淆 -keep class bykvm*.** -keep class com.bytedance.msdk.adapter.**{ public *; } -keep class com.bytedance.msdk.api.** { public *; } -keep class com.bytedance.msdk.base.TTBaseAd{*;} -keep class com.bytedance.msdk.adapter.TTAbsAdLoaderAdapter{ public *; protected ; } baidu sdk 不接入baidu sdk可以不引入 -ignorewarnings -dontwarn com.baidu.mobads.sdk.api.** -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class com.baidu.mobads.** { *; } -keep class com.style.widget.** {*;} -keep class com.component.** {*;} -keep class com.baidu.ad.magic.flute.** {*;} -keep class com.baidu.mobstat.forbes.** {*;} # admore ks 不接入ks sdk可以不引入 -keep class org.chromium.** {*;} -keep class org.chromium.** { *; } -keep class aegon.chrome.** { *; } -keep class com.kwai.**{ *; } -dontwarn com.kwai.** -dontwarn com.kwad.** -dontwarn com.ksad.** -dontwarn aegon.chrome.** # admore Admob 不接入admob sdk可以不引入 -keep class com.google.android.gms.ads.MobileAds { public *; } #sigmob 不接入sigmob sdk可以不引入 -dontwarn android.support.v4.** -keep class android.support.v4.** { *; } -keep interface android.support.v4.** { *; } -keep public class * extends android.support.v4.** -keep class sun.misc.Unsafe { *; } -dontwarn com.sigmob.** -keep class com.sigmob.**.**{*;} # admore oaid 不同的版本混淆代码不太一致,你注意你接入的oaid版本 ,不接入oaid可以不添加 -dontwarn com.bun.** -keep class com.bun.** {*;} -keep class a.**{*;} -keep class XI.CA.XI.**{*;} -keep class XI.K0.XI.**{*;} -keep class XI.XI.K0.**{*;} -keep class XI.vs.K0.**{*;} -keep class XI.xo.XI.XI.**{*;} -keep class com.asus.msa.SupplementaryDID.**{*;} -keep class com.asus.msa.sdid.**{*;} -keep class com.huawei.hms.ads.identifier.**{*;} -keep class com.samsung.android.deviceidservice.**{*;} -keep class com.zui.opendeviceidlibrary.**{*;} -keep class org.json.**{*;} -keep public class com.netease.nis.sdkwrapper.Utils {public ;} # admore klevin 游可赢 -keep class com.tencent.tgpa.**{*;} -keep class com.tencent.klevin.**{*;} # admore Mintegral 不接入Mintegral sdk,可以不引入 -keepattributes Signature -keepattributes *Annotation* -keep class com.mbridge.** {*; } -keep interface com.mbridge.** {*; } -keep class android.support.v4.** { *; } -dontwarn com.mbridge.** -keep class **.R$* { public static final int mbridge*; } ``` #### #### 资源混淆 如果您的应用启用了资源混淆或资源缩减,您需要保留SDK的资源,SDK的资源名都是以tt_mediation_开头的。 您可以在资源混淆配置文件添加如下配置: ## 2.AdMoreSdk初始化 ### 2.1 AdMoreSdk初始化 建议在application的onCreate中进行初始化操作 @Override public void onCreate() { super.onCreate(); //由于初始化在子线程,请确保初始化以后再进行下一步操作 SdMoreManager.init(this,"AppName","AppId"); //或者 SdMoreManager.init(this, "AppName", "AppId", new AdMoreSdk.InitCallBack() { @Override public void success() { adInit = true; } @Override public void fail(int i, String s) { adInit = false; Log.d("App", "adInitFailed" + s); } }); } SdMoreManager代码如下 public class SdMoreManager { public static void init(Context context, String appName, String appId, boolean debug, AdMoreSdk.InitCallBack initCallBack) { AdMoreSdk.initialize(context, buildV2Config(context, appName, appId, debug), initCallBack); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { // String processName = UIUtils.getCurrProcessName(context); // if (!"com.header.app.untext".equals(processName)) { // WebView.setDataDirectorySuffix(processName); // } } } /**初始化配置类 */ public static IAdMoreConfig buildV2Config(String name, String appId) { return buildV2Config(name, appId, BuildConfig.DEBUG); } public static IAdMoreConfig buildV2Config(Context context, String name, String appId, boolean debug) { return new AdMoreConfig.Builder() /** * 注:需要替换成在媒体平台申请的appID ,切勿直接复制 */ .setAppId(appId) .setAppName(name) /** * 上线前需要关闭debug开关,否则会影响性能 */ .setDebug(debug) .build(context); } } } ### 2.2 AdMoreSdk主要广告说明 ###### 广告流程说明 每个广告使用方法类似,通过AdMoreSdk.getAdMoreSdkManager().create创建不同类型的广告,请参考demo中的实现方式 HashMap options = new HashMap<>(); options.put(AD_WIDTH, UIUtils.getScreenWidth(getApplicationContext())); options.put(AD_HEIGHT, UIUtils.getScreenHeight(getApplicationContext())); adMoreBannerAd = AdMoreSdk.getAdMoreSdkManager().createBanner(this, App.AD_MORE_BANNER_ID, options); adMoreBannerAd.loadAd(); 广告播放onAdShow回调中,通过ad.getAdMoreInfo().getECPM()来获取ecpm信息 #### 2.2.1Banner广告(AdMoreBannerAd) ##### 介绍 横幅⼴告,⼜名Banner⼴告,固定于app顶部、中部、底部、或其他位置,横向贯穿整个app⻚⾯;当⽤户与app互动时,Banner⼴告会停留在屏幕上,并可在⼀段时间后⾃动刷新。 ###### 加载方法说明 adMoreBannerAd = AdMoreSdk.getAdMoreSdkManager().createBanner(this, App.AD_MORE_BANNER_ID, options); adMoreBannerAd.setLoadListener(new AdMoreLoadListener() { @Override public void onAdLoadSuccess(String msg) { Log.d(TAG, "onAdLoadSuccess "); showBanner(); } @Override public void onAdLoadError(Throwable throwable) { Log.d(TAG, "onAdLoadError " + throwable); } }); adMoreBannerAd.loadAd(); ###### 展示说明 BannerAd bannerAd = adMoreBannerAd.getBannerAdList().remove(0); bannerAd.setMediaListener(new AdMoreMediaListener() { @Override public void onAdClosed() { Log.d(TAG, "onAdClosed"); } @Override public void onAdShow() { Log.d(TAG, "onAdShow ecpm:" + bannerAd.getAdMoreInfo().getECPM()); } }); bannerAd.setAdMoreDislikeListener(new AdMoreDislikeListener() { @Override public void onSelected(boolean closeFlag) { Log.d(TAG, "onSelected " + closeFlag); } @Override public void onCancel() { Log.d(TAG, "onCancel "); } }); bannerAd.render(this, adMain); 使用参考AdMoreDemo的 BannerActivity类 #### 2.2.2沉浸式视频信息流广告(AdMoreDrawAd) ###### 介绍 与抖⾳竖版视频流⼀样的全屏视频信息流⼴告。 ###### 加载方法说明 HashMap options = new HashMap<>(); options.put(AD_WIDTH, UIUtils.getScreenWidth(getApplicationContext())); options.put(AD_HEIGHT, UIUtils.getScreenHeight(getApplicationContext())); adMoreDrawAd = AdMoreSdk.getAdMoreSdkManager().createDraw(this, App.AD_MORE_DRAW_ID, options); adMoreDrawAd.setLoadListener(new AdMoreLoadListener() { @Override public void onAdLoadSuccess(String msg) { Log.d(TAG, "onAdLoadSuccess"); showDrawAd(); } @Override public void onAdLoadError(Throwable throwable) { Log.d(TAG, "onAdLoadError " + throwable); } }); adMoreDrawAd.loadAd(); 展示说明 DrawAd drawAd = adMoreDrawAd.getDrawAds().remove(0); AdMoreInfo adMoreInfo = drawAd.getAdMoreInfo(); drawAd.setAdMoreRenderListener(new AdMoreRenderListener() { @Override public void onRenderSuccess() { Log.d(TAG, "onRenderSuccess"); } @Override public void onError(Throwable throwable) { Log.d(TAG, "onRenderError " + throwable); } }); drawAd.setMediaListener(new AdMoreMediaListener() { @Override public void onAdClosed() { Log.d(TAG, "onAdClosed"); } @Override public void onAdShow() { Log.d(TAG, "onAdShow ecpm:" + drawAd.getAdMoreInfo().getECPM() + " adName:" + drawAd.getAdMoreInfo().getSdkName()); } }); drawAd.render(this, adMain); 使用参考AdMoreDemo的 AdMoreDrawActivity类 #### 2.2.3插全屏⼴告(AdMoreInterstitialAd) ###### 介绍 插全屏⼴告是将原有的插屏⼴告(AdMoreInterstitialAd)和全屏视频⼴告(AdMoreFullscreenVideoAd)结合,在同⼀个⼴告类型下⽀持混出的⼴告类型 ###### 加载方法说明 HashMap options = new HashMap<>(); options.put(AdMoreConstants.AD_WIDTH, UIUtils.getScreenWidth(getApplicationContext())); // options.put(AdMoreConstants.AD_HEIGHT, UIUtils.getScreenHeight(getApplicationContext())); adMoreNativeAd = AdMoreSdk.getAdMoreSdkManager().createNative(this, App.AD_MORE_NATIVE_ID, options); adMoreNativeAd.setLoadListener(new AdMoreLoadListener() { @Override public void onAdLoadSuccess(String msg) { Log.d(TAG, "onAdLoadSuccess"); showAd(); } @Override public void onAdLoadError(Throwable throwable) { Log.d(TAG, "onError " + throwable); } }); adMoreNativeAd.loadAd(); ###### 展示说明 if (adMoreNativeAd.getNativeAds() != null && adMoreNativeAd.getNativeAds().size() > 0) { final NativeAd nativeAd = adMoreNativeAd.getNativeAds().remove(0); nativeAd.setMediaListener(new AdMoreMediaListener() { @Override public void onAdClosed() { Log.d(TAG, "onAdClosed"); } }); nativeAd.setAdMoreRenderListener(new com.admore.sdk.callback.AdMoreRenderListener() { @Override public void onRenderSuccess() { Log.d(TAG, "onRenderSuccess"); } @Override public void onError(Throwable throwable) { Log.d(TAG, "onRenderError " + throwable); } }); nativeAd.setMediaListener(new AdMoreMediaListener() { @Override public void onAdClosed() { Log.d(TAG, "onAdClosed"); } @Override public void onAdShow() { Log.d(TAG, "onAdShow ecpm:" + nativeAd.getAdMoreInfo().getECPM() + " adName:" + nativeAd.getAdMoreInfo().getSdkName()); } }); nativeAd.render(this, adMain); } 使用参考AdMoreDemo的FullScreenActivity类 #### 2.2.4原⽣信息流⼴告(AdMoreNativeAd) ###### 介绍 原⽣信息流⼴告是由SDK提供渲染完成的view组件,可适⽤于多个场景。原⽣信息流⼴告是由SDK提供渲染完成的view组件,可适⽤于多个场景。 ###### 加载方法说明 HashMap options = new HashMap<>(); options.put(AD_WIDTH, UIUtils.getScreenWidth(getApplicationContext())); options.put(AD_HEIGHT, UIUtils.getScreenHeight(getApplicationContext())); interstitialAd = AdMoreSdk.getAdMoreSdkManager().createInterstitialAd(this, App.AD_MORE_INTERSTITIAL_ID, options); interstitialAd.setLoadListener(new AdMoreLoadListener() { @Override public void onAdLoadSuccess(String msg) { Log.d(TAG, "onAdLoadSuccess"); showAd(); } @Override public void onAdLoadError(Throwable throwable) { Log.d(TAG, "onAdLoadError " + throwable); } }); interstitialAd.loadAd(); ###### 展示说明 if (interstitialAd.isReady()) { interstitialAd.setMediaListener(new AdMoreMediaListener() { @Override public void onAdClosed() { Log.d(TAG, "onAdClosed"); } @Override public void onAdShow() { Log.d(TAG, "onAdShow ecpm:" + interstitialAd); } }); interstitialAd.show(this, null); } else { Toast.makeText(getApplicationContext(), "请先加在广告", Toast.LENGTH_SHORT).show(); } 使用参考AdMoreDemo的 FeedNativeActivity类 ### 2.2.5视频激励⼴告(AdMoreRewardAd) ###### 介绍 原⽣信息流⼴告是由SDK提供渲染完成的view组件,可适⽤于多个场景。原⽣信息流⼴告是由SDK提供渲染完成的view组件,可适⽤于多个场景。 ###### 加载方法说明 if (!AdMoreSdk.init) { return; } HashMap options = new HashMap<>(); options.put(AD_WIDTH, adMain.getWidth()); options.put(AD_HEIGHT, adMain.getHeight()); options.put(AD_COUNT, 1); rewardAd = AdMoreSdk.getAdMoreSdkManager().createReward(this, App.AD_MORE_REWARD_ID, options); rewardAd.setLoadListener(new AdMoreLoadListener() { @Override public void onAdLoadSuccess(String msg) { Log.d(TAG, "onAdLoadSuccess"); showAd(); } @Override public void onAdLoadError(Throwable throwable) { Log.d(TAG, "onAdLoadError" + throwable); } }); rewardAd.loadAd(); ###### 展示说明 if (rewardAd.isReady()) { rewardAd.setMediaListener(new AdMoreMediaListener() { @Override public void onAdClosed() { Log.d(TAG, "onAdClosed"); } @Override public void onAdShow() { Log.d(TAG, "onAdShow ecpm:" + rewardAd.getAdMoreInfo().getECPM() + " name:" + rewardAd.getAdMoreInfo().getSdkName()); } @Override public void onAdPlayEnd() { Log.d(TAG, "onAdPlayEnd"); } @Override public void onRewardArrived(boolean isRewardValid, int i, Bundle extraInfo) { Log.d(TAG, "onRewardArrived isRewardV:" + isRewardValid + " i:" + i); boolean isServerSideVerify = extraInfo.getBoolean(AdMoreConstants.KEY_IS_ADMORE_SERVER_SIDE_VERIFY); if (isServerSideVerify) { // 开启了服务端激励验证,这里可以获取服务端激励验证信息 boolean isVerify = isRewardValid; // 如果isVerify=false,则可以根据下面的错误码来判断为什么是false, // 1、如果errorCode为40001/40002/50001/50002,则是因为请求异常导致,媒体可以根据自己的判断决定是否发放奖励。 // 2、否则,就是媒体服务端回传的验证结果是false,此时应该不发放奖励。 Integer reason = (Integer) extraInfo.getInt(AdMoreConstants.KEY_REASON); if (reason != null) { Log.d(TAG, "onRewardArrived,开发者服务器回传的reason,开发者不传时为空"); } Integer errorCode = (Integer) extraInfo.get(AdMoreConstants.KEY_ERROR_CODE); if (errorCode != null) { String errorMsg = (String) extraInfo.get(AdMoreConstants.KEY_ERROR_MSG); Log.d(TAG, "onRewardArrived,服务端验证异常时的错误信息,未发生异常时为0或20000:errorCode:" + errorCode + ", errMsg: " + errorMsg); } String adExtra = (String) extraInfo.get(AdMoreConstants.KEY_ADMORE_EXTRA); Log.d(TAG, "rewardItem, 开发者通过AdSlot传入的extra信息,会透传给媒体的服务器。开发者不传时为空,extra:" + adExtra); String transId = (String) extraInfo.get(AdMoreConstants.KEY_TRANS_ID); Log.d(TAG, "rewardItem, 服务端验证产生的transId,一次广告播放会产生的唯一的transid: " + transId); } } }); rewardAd.show(this, null); } else { Toast.makeText(getApplicationContext(), "请先加载广告", Toast.LENGTH_SHORT).show(); } 使用参考AdMoreDemo的 RewardActivity类 ### 2.2.6开屏⼴告(AdMoreSplashAd) ###### 介绍 开屏⼴告主要是 APP 启动时展示的全屏⼴告视图,展示完毕后⾃动关闭并进⼊应⽤的主界⾯。 ###### 加载方法说明 HashMap options = new HashMap<>(); options.put(AD_WIDTH, UIUtils.getScreenWidth(getApplicationContext())); options.put(AD_HEIGHT, UIUtils.getScreenHeight(getApplicationContext())); options.put(AD_SPLASH_ADN_ID, App.AD_MORE_SPLASH_ADN_ID); options.put(AD_APP_ID, App.AD_MORE_APP_ID); splashAd = AdMoreSdk.getAdMoreSdkManager().createSplash(this, App.AD_MORE_SPLASH_ID, options); splashAd.setLoadListener(new AdMoreLoadListener() { @Override public void onAdLoadSuccess(String s) { Log.d(TAG, "onSplashAdLoad "); showSplash(); } @Override public void onAdLoadError(Throwable throwable) { Log.d(TAG, "onAdLoadError " + throwable); Toast.makeText(getApplicationContext(), "广告加载失败!" + throwable.getMessage(), Toast.LENGTH_SHORT).show(); } }); //timeOut splashAd.loadAd(3000); ###### 展示说明 ```splash splashAd.setMediaListener(new AdMoreMediaListener() { @Override public void onAdClosed() { Log.d(TAG, "onAdClosed"); gotoMain(); } @Override public void onAdShow() { Log.d(TAG, "onAdShow ecpm:" + splashAd.getAdMoreInfo().getECPM() + " adName:" + splashAd.getAdMoreInfo().getSdkName()); } }); splashAd.show(true, adMore); ``` ### 2.2.7 使用repload预加载广告 ###### 介绍 预加载广告建议在初始化完成后立马预加载。 ###### 预加载方法说明 分类说明 广告id:slotId 开屏广告Type : interstitialAd 激励广告Type : rewardVideoAd DrawType : drawAd Banner广告Type : bannerAd Feed流广告Type : nativeAd if (AdMoreSdk.init) { List adTypes = new ArrayList<>(); AdType adType = new AdType(); adType.setType("interstitialAd"); adType.setSlotId("102380843"); adTypes.add(adType); adType = new AdType(); adType.setType("rewardVideoAd"); adType.setSlotId("102381282"); adTypes.add(adType); adType = new AdType(); adType.setType("nativeAd"); adType.setSlotId("102383509"); adTypes.add(adType); adType = new AdType(); adType.setType("drawAd"); adType.setSlotId("102382334"); adTypes.add(adType); adType = new AdType(); adType.setType("bannerAd"); adType.setSlotId("102361698"); adTypes.add(adType); Log.d("MainActivity", "preload ad start -============================"); AdMoreSdk.getAdMoreSdkManager().preload(MainActivity.this, adTypes); } ### 2.2.8 配置configJson文件 ###### 介绍 AdmoreSdk自行加载,请将配置文件放在assets根目录下。并命名为“admore_andorid_config.json”