# 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)

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”