提供6种广告:横幅广告、视频广告、开屏广告、插屏广告、模板插屏广告、原生广告
注:具体广告效果参照广告sdk的Demo程序运行效果。
针对广告SDK版本升级,参照以下步骤:
1. 从官网下载最新版本(https://www.yousuode.cn/download/sdk) 解压获取aar包(在 ngad-sdk-all-*.zip\04-依赖库\aar接入方式\ngad-sdk-release-*.aar 里),对比版本号,如果已经是最新版本则无需替换;如果不是最新版本则需要替换更新aar包。
2. Android Studio工程,比较简单。删除本地工程的旧版aar包,替换最新版本;
3. Eclipse 工程,解压aar包分别拷贝到旧版内容的目录包括:assets、res、libs、libs/armeabi,覆盖替换相关的文件,
注意:旧版本sdk的多余资源文件需要删除。
版本号 | 接入变更 |
---|---|
v2.2.90 | 1、添加检测工具(05-检测工具) |
v2.2.60 | 1、新增了原生广告接口 |
v2.2.50 | 1、AndroidManifest.xml的权限和组件声明 2、Proguard文件 3、libs目录引用的AAR或JAR文件版本号及数量 4、res目录文件 5、新增targetVersion>=24时,FileProvider路径配置 |
v2.2.30 | 1、AndroidManifest.xml的权限和组件声明 2、Proguard文件 3、libs目录引用的AAR或JAR文件版本号及数量 4、res目录文件 5、添加广告加载异常处理说明:单次启动应用,如果连续5次加载广告失败,不再发起请求。 |
解压开ngad-sdk-all-*.zip文件,在04-依赖库目录下可以看到NGASDK提供的两种接入方式的依赖库。
【Android Studio工程引入】(推荐)
//指定本地aar文件的存放目录,libs为build.gradle的相对地址
repositories {
flatDir {
dirs'libs'
}
}
dependencies {
//集成工程中libs目录下的jar文件(alisdk-utdid-20160516.jar)
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:support-v4:23.1.1'
//•集成工程中libs目录下的aar文件(gamesdk-framework-shellbase-*.aar、ngad-sdk-release-*.aar)
fileTree(dir: 'libs', include: ['*.aar']).each { file ->
compile(name: file.name.lastIndexOf('.').with {
it != -1 ? file.name[0..<it] : file.name
}, ext: 'aar')
}
}
红框部分为可能冲突部分。
- 解决alisdk-utdid-20160516.jar的冲突
a) 如果检查libs目录下存在和utdid相关的包名,则不需要添加alisdk-utdid-20160516.jar
b) 如果编译期出现UTDID相关类名冲突,则不需要添加alisdk-utdid-20160516.jar- 解决gamesdk-framework-shellbase-*.aar的冲突
a)如果已经集成了阿里游戏的游戏SDK7.x版本,则不需要添加gamesdk-framework-shellbase-*.aar; b)如果已经集成阿里游戏的游戏SDK8.x版本,则降级为7.x版本,目前广告SDK不支持与8.x版本的游戏SDK同时集成;
c)如果编译期出现UCGameSdk相关类名冲,则不需要添加gamesdk-framework-shellbase-*.aar- 其他冲突解决方案就联系技术支撑人员
【Eclipse工程引入】(不推荐)
红框部分为可能冲突部分。
- 解决alisdk-utdid-20160516.jar的冲突
a) 如果检查libs目录下存在和utdid相关的包名,则不需要添加alisdk-utdid-20160516.jar
b) 如果编译期出现UTDID相关类名冲突,则不需要添加alisdk-utdid-20160516.jar- 解决gamesdk-framework-shellbase-*.aar的冲突
a)如果已经集成了阿里游戏的游戏SDK7.x版本,则不需要添加gamesdk-framework-shellbase-*.jar、广告SDK提供的assets/ucgamesdk目录下的so资源;
b)如果已经集成阿里游戏的游戏SDK8.x版本,则降级为7.x版本,目前广告SDK不支持与8.x版本的游戏SDK同时集成;
c)如果编译期出现UCGameSdk相关类名冲,则不需要添加gamesdk-framework-shellbase-*.jar- 通常通过jar包方式接入的厂商,经常会漏添加或更新res、assets目录下的资源、混淆规则,所以在尽可能保持
- 其他冲突解决方案就联系技术支撑人员
添加权限声明:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
如果您打包App时的targetSdkVersion >= 23:请在先获取到SDK要求的所有权限,然后再调用SDK的广告接口。否则SDK将无法工作,我们建议您在App启动时就去获取SDK需要的权限,Demo工程中也提供了基本的权限处理示例代码供开发者参考。
如果您打包App时的targetSdkVersion >= 24:除了需要处理好权限申请以外,还需要处理好文件访问的兼容性。
添加SDK组件声明
<!-- NGASDK START -->
<!-- targetSDKVersion >= 24时才需要添加这个provider。provider的authorities属性的值为${applicationId}.fileprovider,请开发者根据自己的${applicationId}来设置这个值 -->
<!--目前 targetSDKVersion统一为23,所以不需要provider配置-->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/adp_file_path" />
</provider>
<provider
android:name="com.lm.listener.FileProvider"
android:authorities="${applicationId}_lm.fileprovider"
android:grantUriPermissions="true"
android:exported="false"/>
<!-- 请开发者注意,如果已经集成游戏SDK,请以游戏SDK的属性为主->
<activity
android:nam•e="cn.uc.gamesdk.activity.ProxyActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="cn.uc.gamesdk.sdkweb" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<service
android:name="com.qq.e.comm.DownloadService"
android:exported="false" />
<!-- 请开发者注意字母的大小写,ADActivity,而不是AdActivity -->
<activity
android:name="com.qq.e.ads.ADActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize" />
<service android:name="com.mobvista.msdk.shell.MVService">
<intent-filter>
<action android:name="com.mobvista.msdk.download.action" />
</intent-filter>
</service>
<activity
android:name="com.mobvista.msdk.activity.MVCommonActivity"
android:configChanges="keyboard|orientation"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar" />
<activity
android:name="com.mobvista.msdk.reward.player.MVRewardVideoActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
<activity
android:name="com.mobvista.msdk.interstitial.view.MVInterstitialActivity"
android:screenOrientation="portrait" />
<activity android:name="com.mobvista.msdk.out.LoadingActivity" />
<receiver
android:name="com.alphab.receiver.AlphabReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
<receiver android:name="com.mobvista.msdk.click.AppReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
<activity
android:name="com.lm.activity.StimulateVideoProxyActivity"
android:theme="@android:style/Theme.Translucent" />
<activity
android:name="com.lm.activity.InterstitialVideoProxyActivity"
android:theme="@android:style/Theme.Translucent" />
<activity
android:name="com.lm.activity.DialogProxyActivity"
android:launchMode="singleTask"
android:theme="@android:style/Theme.Dialog" />
<service
android:name="com.lm.service.LogicService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.adroid.SERVICE" />
</intent-filter>
</service>
<activity
android:name="com.uniplay.adsdk.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize" />
<activity
android:name="com.uniplay.adsdk.InterstitialAdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:theme="@android:style/Theme.Translucent" />
<receiver android:name="com.uniplay.adsdk.PackageReceiver">
<intent-filter android:priority="2147483647">
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.intent.action.USER_PRESENT" />
</intent-filter>
<intent-filter android:priority="2147483647">
<action android:name="android.intent.action.PACKAGE_ADDED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
<service android:name="com.uniplay.adsdk.DownloadService" />
<!-- NGASDK END -->
注意:这里的 ${applicationId} 不是广告的appId,而是Android工程(接入游戏包名)applicationId,比如 com.brianbaek.popstar
在项目结构下的res
目录下添加一个xml
文件夹,拷贝adp_file_path.xml
文件到xml文件夹中,文件内容如下:
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 这个下载路径不可以修改,必须是GDTDOWNLOAD -->
<external-path name="gdt_sdk_download_path" path="GDTDOWNLOAD" />
<root-path name="download" path="" />
</paths>
在LauncherActivity/WelcomeActivity/SplashActivity 中进行SDK的初始化。
NGASDK初始化是使用SDK所提供功能可以执行的前提,否则会导致广告加载失败。游戏在应用启动时LauncherActivity的onCreate方法中插入广告SDK初始化逻辑。
public void onCreate() {
super.onCreate();
initSdk(this, new NGASDK.InitCallback() {
@Override
public void success() {
showAd(WelcomeActivity.this);
}
@Override
public void fail(Throwable throwable) {
throwable.printStackTrace();
}
});
}
private static void initSdk(Activity activity, final NGASDK.InitCallback initCallback) {
// 重新初始化sdk
Log.d(TAG, AdConfig.toStringFormat());
NGASDK ngasdk = NGASDKFactory.getNGASDK();
Map<String, Object> args = new HashMap<>();
args.put(NGASDK.APP_ID, AdConfig.appId);
//打Release包的时候,需要把DebugMode设置为false
args.put(NGASDK.DEBUG_MODE, BuildConfig.DEBUG);
ngasdk.init(activity, args, initCallback);
}
NGASDK主要API
public class NGASDKFactory
限定符和类型 | 方法和说明 |
---|---|
static NGASDK | getNGASDK() |
public interface NGASDK
限定符和类型 | 方法和说明 |
---|---|
<T extends NGAProperties> | loadAd() 加载广告请求 注意:为了提高广告的填充率以及曝光量,建议重新加载广告时候重新调用此方法,重新请求新的广告内容。 |
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ad_control);
}
private NGABannerController mController;
private NGABannerProperties mProperties;
private ViewManager mWindowManager;
private RelativeLayout mBannerView;
//注意:请在Activity成员变量保存,使用匿名内部类可能导致回收
NGABannerListener mAdListener = new NGABannerListener() {
@Override
public void onRequestAd() {
ToastUtil.show(TAG, "onRequestAd");
}
@Override
public <T extends NGAdController> void onReadyAd(T controller) {
mController = (NGABannerController) controller;
ToastUtil.show(TAG, "onReadyAd");
}
@Override
public void onShowAd() {
ToastUtil.show(TAG, "onShowAd");
}
@Override
public void onCloseAd() {
//广告关闭之后mController置null,鼓励加载广告重新调用loadAd,提高广告填充率
mController = null;
ToastUtil.show(TAG, "onCloseAd");
mBannerView.setVisibility(View.GONE);
}
@Override
public void onErrorAd(int code, String message) {
ToastUtil.show(TAG, "onErrorAd errorCode:" + code + ", message:" + message);
}
@Override
public void onClickAd() {
ToastUtil.show(TAG, "onClickAd");
}
};
//为了提高广告的填充率以及曝光量,建议重新加载广告时候重新调用此方法,重新请求新的广告内容
private void loadAd(Activity activity) {
if (mBannerView != null && mBannerView.getParent() != null) {
mWindowManager.removeView(mBannerView);
}
mBannerView = new RelativeLayout(activity);
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.width = ViewGroup.LayoutParams.WRAP_CONTENT;
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
params.gravity = Gravity.BOTTOM | Gravity.CENTER;
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
mWindowManager = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
mWindowManager.addView(mBannerView, params);
mProperties = new NGABannerProperties(activity, AdConfig.appId, AdConfig.bannerPosId, mBannerView);
mProperties.setListener(mAdListener);
NGASDK ngasdk = NGASDKFactory.getNGASDK();
ngasdk.loadAd(mProperties);
// 若需要默认横幅广告不展示
mBannerView.setVisibility(View.GONE);
}
private void destroyAd(Activity activity) {
if (mWindowManager != null) {
mWindowManager.removeView(mBannerView);
mWindowManager = null;
}
if (mController != null) {
mController.closeAd();
mController = null;
}
}
private void showAd(Activity activity) {
if (mController != null) {
mController.showAd();
mBannerView.setVisibility(View.VISIBLE);
}
}
private void closeAd(Activity activity) {
if (mController != null) {
mBannerView.setVisibility(View.GONE);
mController.closeAd();
}
}
注:更多详细代码示例,请参考Demo工程代码:cn.sirius.adsdkdemo.BannerActivity
注意:设置的广告回调对象应该是成员对象,不应该是new 的临时对象。因为广告sdk内部对回调对象做了一次软引用WeakReference包装,临时对象没有被其他逻辑引用可能会回收释放,最终会导致调用方收不到回调事件。
public class NGABannerProperties extends NGAProperties<NGABannerController,NGABannerListener>
限定符和类型 | 方法和说明 |
---|---|
NGABannerListener | getListener() 获取广告的监听(回调)对象 |
void | setListener() 设置广告的监听(回调)对象,设置时机是在发起广告请求之前。 |
public abstract class NGAProperties
限定符和类型 | 方法和说明 |
---|---|
Activity | getActivity() 返回广告显示的Activity对象 |
java.lang.String | getAppId() 返回App ID |
ViewGroup | getContainer() 返回广告显示的容器 |
java.lang.Object | getExtraData() 返回扩展属性(内部属性) |
abstract Listener | getListener() 获取广告的监听(回调)对象 |
java.lang.String | getPositionId() 返回广告位ID |
void | setExtraData(java.lang.Object data) 设置扩展属性(内部属性) |
abstract void | setListener 设置广告的监听(回调)对象,设置时机是在发起广告请求之前。 |
public interface NGABannerListener extends NGAdListener
public interface NGAdListener
限定符和类型 | 方法和说明 |
---|---|
void | onClickAd() 点击广告 |
void | onCloseAd() 关闭广告 |
void | onErrorAd(int code, java.lang.String message) 广告过程发生错误 |
<T extends NGAdController> | onReady(T controller) 广告已准备好,通知广告逻辑生成并获取得到控制对象 |
void | onRequestAd() 通知广告请求 |
void | onShowAd() 显示广告 |
public interface NGABannerController extends NGAdController
public interface NGAdController
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ad_control);
}
private NGAInsertProperties mProperties;
private NGAInsertController mController;
//注意:请在Activity成员变量保存,使用匿名内部类可能导致回收
NGAInsertListener mAdListener = new NGAInsertListener() {
@Override
public void onShowAd() {
ToastUtil.show(TAG, "onShowAd");
}
@Override
public void onRequestAd() {
ToastUtil.show(TAG, "onRequestAd");
}
@Override
public <T extends NGAdController> void onReadyAd(T controller) {
mController = (NGAInsertController) controller;
ToastUtil.show(TAG, "onReadyAd");
}
@Override
public void onCloseAd() {
mController = null;
ToastUtil.show(TAG, "onCloseAd");
}
@Override
public void onClickAd() {
ToastUtil.show(TAG, "onClickAd");
}
@Override
public void onErrorAd(int code, String message) {
ToastUtil.show(TAG, "onErrorAd errorCode:" + code + ", message:" + message);
}
};
//为了提高广告的填充率以及曝光量,建议重新加载广告时候重新调用此方法,重新请求新的广告内容
private void loadAd(Activity activity) {
mProperties = new NGAInsertProperties(activity, AdConfig.appId, AdConfig.insertPosId, null);
mProperties.setListener(mAdListener);
NGASDK ngasdk = NGASDKFactory.getNGASDK();
ngasdk.loadAd(mProperties);
}
public void destroyAd(Activity activity) {
if (mController != null) {
mController.cancelAd();
mController.closeAd();
mController = null;
}
}
private void showAd(Activity activity) {
if (mController != null) {
mController.showAd();
}
}
private void closeAd(Activity activity) {
if (mController != null) {
//mController.show(false);
mController.cancelAd();
mController.closeAd();
}
}
注:更多详细代码示例,请参考Demo工程代码:cn.sirius.adsdkdemo.InsertActivity
public class NGAInsertProperties extends NGAProperties>
限定符和类型 | 方法和说明 |
---|---|
NGAInsertListener | getListener() 获取广告的监听(回调)对象 |
void | setListener (NGAInsertListener listener) 设置广告的监听(回调)对象,设置时机是在发起广告请求之前。 |
public interface NGAInsertListener extends NGAdListener
public interface NGAInsertController extends NGAdController
限定符和类型 | 方法和说明 |
---|---|
void | cancelAd() 取消广告请求 |
public class VideoActivity extends BaseActivity {
private static final String TAG = "VideoActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_ad_control);
}
private NGAVideoController mController;
NGAVideoListener mAdListener = new NGAVideoListener() {
@Override
public void onShowAd() {
ToastUtil.show(TAG, "onShowAd");
}
@Override
public void onClickAd() {
ToastUtil.show(TAG, "onClickAd");
}
@Override
public void onCloseAd() {
mController = null;
ToastUtil.show(TAG, "onCloseAd");
}
@Override
public void onErrorAd(final int code, final String message) {
ToastUtil.show(TAG, "onErrorAd code=" + code);
}
@Override
public void onRequestAd() {
ToastUtil.show(TAG, "onRequestAd");
}
@Override
public <T extends NGAdController> void onReadyAd(T controller) {
mController = (NGAVideoController) controller;
ToastUtil.show(TAG, "onReadyAd");
}
@Override
public void onCompletedAd() {
ToastUtil.show(TAG, "onCompletedAd");
}
};
//为了提高广告的填充率以及曝光量,建议重新加载广告时候重新调用此方法,重新请求新的广告内容
public void loadAd(Activity activity) {
final NGAVideoProperties properties = new NGAVideoProperties(activity, AdConfig.appId, AdConfig.videoPosId);
properties.setListener(mAdListener);
NGASDK ngasdk = NGASDKFactory.getNGASDK();
ngasdk.loadAd(properties);
}
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_video_ad_init:
loadAd(this);
break;
case R.id.btn_video_ad_uninit:
if (mController != null) {
mController.destroyAd();
}
break;
case R.id.btn_video_ad_has_cache:
if (mController != null) {
boolean hasCacheAd = mController.hasCacheAd();
ToastUtil.show(TAG, "hasCacheAd=" + hasCacheAd);
}
break;
case R.id.btn_video_ad_show:
if (mController != null) {
mController.showAd();
}
break;
}
}
}
注:更多详细代码示例,请参考Demo工程代码:cn.sirius.adsdkdemo.VideoActivity
public class NGAVideoProperties extends NGAProperties>
限定符和类型 | 方法和说明 |
---|---|
NGAVideoListener | getListener() 获取广告的监听(回调)对象 |
void | setListener (NGAVideoListener listener) 设置广告的监听(回调)对象,设置时机是在发起广告请求之前。 |
public interface NGAVideoListener extends NGAdListener
限定符和类型 | 方法和说明 |
---|---|
void | onCompletedAd() 视频广告播放完成 |
public interface NGAVideoController extends NGAdController
限定符和类型 | 方法和说明 |
---|---|
void | destroyAd() 销毁广告 |
boolean | hasCacheAd() 查询是否有缓存广告 |
注意: loadAd加载视频广告,如果有 onReady 回调,表明有新广告返回,调用showAd播放新的视频广告,而不是缓存的广告,
如果没有 onReady 回调,接入逻辑使用旧的mController 对象调用showAd 就会播放缓存的广告。
通常开屏广告会前嵌入在LauncherActivity/WelcomeActivity/SplashActivity里面,们在“NGASDK初始化”的success回调中插入请求加载开屏逻辑
public class WelcomeActivity extends Activity {
private static final String TAG = "WelcomeActivity";
private ViewGroup container;
// [非必须]根据场景需求决定是否需要自定义的跳过按钮
//private TextView skipView;
private ImageView splashHolder;
private static final String SKIP_TEXT = "点击跳过 %d";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
container = (ViewGroup) this.findViewById(R.id.splash_container);
//skipView = (TextView) findViewById(R.id.skip_view);
//skipView.setVisibility(View.VISIBLE);
splashHolder = (ImageView) findViewById(R.id.splash_holder);
initSdk(this, new NGASDK.InitCallback() {
@Override
public void success() {
//NGASDK初始化成功后,开始加载开屏广告
showAd(WelcomeActivity.this);
}
@Override
public void fail(Throwable throwable) {
throwable.printStackTrace();
}
});
splashHolder.postDelayed(new Runnable() {
@Override
public void run() {
if (splashHolder.getVisibility() == View.VISIBLE) {
// 超时3s开屏广告还没加载出来则关闭广告
closeAd();
}
}
}, 3000);
}
private NGAWelcomeProperties properties;
private boolean canCloseAd = false;
//注意:请在Activity成员变量保存,使用匿名内部类可能导致回收
NGAWelcomeListener mAdListener = new NGAWelcomeListener() {
@Override
public void onClickAd() {
ToastUtil.show(TAG, "onClickAd");
}
@Override
public void onErrorAd(int code, String message) {
ToastUtil.show(TAG, "onErrorAd errorCode:" + code + ", message:" + message);
closeAd();
}
@Override
public void onShowAd() {
splashHolder.setVisibility(View.INVISIBLE); // 广告展示后一定要把预设的开屏图片隐藏起来
ToastUtil.show(TAG, "onShowAd");
}
@Override
public void onCloseAd() {
//无论成功展示成功或失败都回调用该接口,所以开屏结束后的操作在该回调中实现
ToastUtil.show(TAG, "onCloseAd");
canCloseAd = true;
}
@Override
public <T extends NGAdController> void onReadyAd(T controller) {
// 开屏广告是闪屏过程自动显示不需要NGAdController对象,所以返回controller为null;
ToastUtil.show(TAG, "onReadyAd");
}
@Override
public void onRequestAd() {
ToastUtil.show(TAG, "onRequestAd");
}
/**
* 倒计时回调,返回广告还将被展示的剩余时间。
* 通过这个接口,开发者可以自行决定是否显示倒计时提示,或者还剩几秒的时候显示倒计时
*
* @param millisUntilFinished 剩余毫秒数
*/
@Override
public void onTimeTickAd(long millisUntilFinished) {
//skipView.setText(String.format(SKIP_TEXT, Math.round(millisUntilFinished / 1000f)));
}
};
/**
* 开始广告,建议:闪屏Activity显示后延迟再加载广告
* @param activity
*/
public void showAd(Activity activity) {
properties = new NGAWelcomeProperties(activity, AdConfig.appId, AdConfig.welcomeId, container);
// 支持开发者自定义的跳过按钮。SDK要求skipContainer一定在传入后要处于VISIBLE状态,且其宽高都不得小于3x3dp。
// 如果需要使用SDK默认的跳过按钮,可以选择上面两个构造方法。
//properties.setSkipView(skipView);
properties.setListener(mAdListener);
NGASDK ngasdk = NGASDKFactory.getNGASDK();
ngasdk.loadAd(properties);
}
/**
* 关闭广告,当通知广告失败{@link NGAWelcomeListener#onErrorAd} 或关闭事件时候调用 {@link NGAWelcomeListener#onCloseAd}
*/
private void closeAd() {
// 如果是因为点击广告而关闭广告,则不能finish Activity
if (canCloseAd) {
this.startActivity(new Intent(this, MainActivity.class));
this.finish();
} else {
canCloseAd = true;
}
}
@Override
protected void onPause() {
super.onPause();
canCloseAd = false;
}
@Override
protected void onResume() {
super.onResume();
// 如果是因为点击广告而返回,则finish Activity
if (canCloseAd) {
this.startActivity(new Intent(this, MainActivity.class));
this.finish();
}
canCloseAd = true;
}
/** 开屏页一定要禁止用户对返回按钮的控制,否则将可能导致用户手动退出了App而广告无法正常曝光和计费 */
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_HOME) {
return true;
}
return super.onKeyDown(keyCode, event);
}
}
注:更多详细代码示例,请参考Demo工程代码: cn.sirius.adsdkdemo.WelcomeActivity
开屏广告主要API
public class NGAWelcomeProperties extends NGAProperties>
限定符和类型 | 方法和说明 |
---|---|
NGAWelcomeListener | getListener() 获取广告的监听(回调)对象 |
View | getSkipView() 获取自定义的跳过按钮 |
void | setListener (NGAWelcomeListener listener) 设置广告的监听(回调)对象,设置时机是在发起广告请求之前。 |
void | setSkipView(View skipView) 可以通过传入传入skipContainer参数,支持开发者自定义的跳过按钮。 |
public interface NGAWelcomeListener extends NGAdListener
限定符和类型 | 方法和说明 |
---|---|
void | onTimeTickAd(long millisUntilFinished) 倒计时回调,返回广告还将被展示的剩余时间。 |
public interface NGAWelcomeController extends NGAdController
模板插屏广告与插屏广告有展示方式类似,再普通插屏广告的基础上,提供了UI的模板,具有一定的自定义属性,使得模板插屏有更好的融入性,同时也能提升广告收益
public class TemplateActivity extends BaseActivity {
private static final String TAG = "TemplateActivity";
Map<String, String> mShowParam = new HashMap<>();
RadioGroup mTemplateSelector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_template);
mTemplateSelector = (RadioGroup)findViewById(R.id.template_choice);
//UI参数准备,具体参数名称请查阅文档
mShowParam = new HashMap<>();
//bgRes:弹窗背景框图片资源(模板1、模板2支持)
mShowParam.put("bgRes", "drawable/bg");
//dialogTextColor:弹窗文案文字颜色(仅模板2支持)
mShowParam.put("dialogTextColor", "#edeef2");
//front:弹窗文字字体资源(仅模板2支持,仅支持assets资源)
mShowParam.put("front", "assets/heiti.ttf");
//btnText:弹窗操作按钮文案(仅模板2支持)
mShowParam.put("btnText", "点击领取");
//btnTextColor:弹窗操作按钮文案文字颜色(仅模板2支持)
mShowParam.put("btnTextColor", "#36561f");
//btnRes:弹窗操作按钮背景图片(仅模板2支持)
mShowParam.put("btnRes", "drawable/button_bg");
}
private NGAGeneralProperties mProperties;
private NGAGeneralController mController;
//注意:请在Activity成员变量保存,使用匿名内部类可能导致回收
NGAGeneralListener mAdListener = new NGAGeneralListener() {
@Override
public void onEvent(NGAdEvent event) {
//具体eventId代表含义请查阅文档
if (event.eventId == 1) {
ToastUtil.show(TAG, "onGameBtnClick");
//再次调用showAd(Map<String,String> param),可以动态更换素材参数
mShowParam.put("dialogText", "点击领取");
mController.showAd(mShowParam);
}
}
@Override
public void onShowAd() {
ToastUtil.show(TAG, "onShowAd");
}
@Override
public void onRequestAd() {
ToastUtil.show(TAG, "onRequestAd");
}
@Override
public <T extends NGAdController> void onReadyAd(T controller) {
mController = (NGAGeneralController) controller;
ToastUtil.show(TAG, "onReadyAd");
}
@Override
public void onCloseAd() {
ToastUtil.show(TAG, "onCloseAd");
mController = null;
}
@Override
public void onClickAd() {
ToastUtil.show(TAG, "onClickAd");
}
@Override
public void onErrorAd(int code, String message) {
ToastUtil.show(TAG, "onErrorAd errorCode:" + code + ", message:" + message);
}
};
//为了提高广告的填充率以及曝光量,建议重新加载广告时候重新调用此方法,重新请求新的广告内容
private void loadAd(Activity activity) {
Map<String, Object> param = new HashMap<>();
param.put(NGAGeneralProperties.APP_ID, AdConfig.appId);
//不同广告位可以配置不同的模板效果,可以与我们联系进行选择
param.put(NGAGeneralProperties.POSITION_ID, getSelectedPosId());
param.put(NGAGeneralProperties.AD_TYPE, 20);
mProperties = new NGAGeneralProperties(activity, null, param);
mProperties.setListener(mAdListener);
NGASDK ngasdk = NGASDKFactory.getNGASDK();
ngasdk.loadAd(mProperties);
}
public void destroyAd(Activity activity) {
if (mController != null) {
mController.closeAd();
mController = null;
}
}
private void showAd(Activity activity) {
if (mController != null) {
mShowParam.put("dialogText", "小小礼物请领取");
mController.showAd(mShowParam);
}
}
private void closeAd(Activity activity) {
if (mController != null) {
//mController.show(false);
mController.closeAd();
}
}
public void onClick(View view) {
if (view.getId() == R.id.btn_banner_create) {
loadAd(this);
} else if (view.getId() == R.id.btn_banner_destroy) {
destroyAd(this);
} else if (view.getId() == R.id.btn_banner_show) {
showAd(this);
} else if (view.getId() == R.id.btn_banner_close) {
closeAd(this);
}
}
private String getSelectedPosId() {
switch (mTemplateSelector.getCheckedRadioButtonId()) {
case R.id.rb_temp_1st:
return AdConfig.templateId;
case R.id.rb_temp_2nd:
return AdConfig.templateId_2;
default:
return "";
}
}
}
注:更多详细代码示例,请参考Demo工程代码: cn.sirius.adsdkdemo.TemplateActivity
public class NGAGeneralProperties extends NGAProperties<NGAGeneralController, NGAGeneralListener>
限定符和类型 | 方法和说明 |
---|---|
NGAGeneralListener | getListener() 获取广告的监听(回调)对象 |
void | setListener(NGAGeneralListener listener) 设置广告的监听(回调)对象,设置时机是在发起广告请求之前。 |
public interface NGAGeneralListener extends NGAdListener
public interface NGAWelcomeController extends NGAdController
模板传入参数详细
在请求到广告,获得controller后,可以调用showAd(Map<String,String> param)方法来传入自定义参数,来调整模板的样式,具体参数描述如下:
参数key | 参数意义 | 参数格式 | 使用示例 | 备注 | 使用范围 |
---|---|---|---|---|---|
bgRes | 弹窗背景图资源 | String | mShowParam.put("bgRes", "drawable/bg"); | 获取drawable文件夹下的资源,支持drawable、mipmap | 1号模板、2号模板 |
dialogText | 弹窗游戏文案 | String | mShowParam.put("dialogText", "点击领取"); | 直接传入文字内容传参 | 2号模板 |
dialogTextColor | 弹窗游戏文案颜色 | String | mShowParam.put("dialogTextColor", "#edeef2"); | 使用色码来表示颜色,需要“#”开头 | 2号模板 |
btnText | 操作按钮文案 | String | mShowParam.put("btnText", "点击领取"); | 直接传入文字内容传参 | 2号模板 |
btnTextColor | 操作按钮文案颜色 | String | mShowParam.put("btnTextColor", "#36561f"); | 使用色码来表示颜色,需要“#”开头 | 2号模板 |
btnRes | 操作按钮图资源 | String | mShowParam.put("btnRes", "drawable/button_bg"); | 获取drawable文件夹下的资源,支持drawable、mipmap,支持png、xml格式 | 2号模板 |
front | 字体文件 | String | mShowParam.put("btnRes", "assets/heiti.ttf"); | 获取assets文件夹下的资源,获得字体资源文件 | 2号模板 |
showAd(Map<String,String> param)可以重复调用,动态改变弹窗样式,但曝光仅计算一次
如果上述参数不填写,则由sdk补充默认参数
模板事件回调id
当模板上触发特殊事件时,sdk会回调onEvent(NGAdEvent event),接入方可根据event.eventId判断回调事件类型,具体参数如下:
eventId | 参数意义 |
---|---|
1 | 操作按钮被点击(首次) |
2 | 操作按钮被点击(第二次或者以上) |
原生广告提供了高度自定义的广告类型,使得广告能与app高度融合,给开发者提供了高自由度的开发接口
public class NativeAdActivity extends BaseActivity {
private static final String TAG = "NativeAdActivity";
private NGANativeProperties mProperties;
private NGANativeController mController;
private NGANativeAdData mAdDataItem;
private LinearLayout mMainContainer;
private RelativeLayout mAdContainer;
private ImageView mIvAppIcon;
private TextView mTvAppTitle;
private TextView mTvAppDesc;
private TextView mTvAppScore;
private ImageView mIvAppImg;
private TextView mBtnClick;
private ImageView mIvAdLogo;
//注意:请在Activity成员变量保存,使用匿名内部类可能导致回收
NGANativeListener mAdListener = new NGANativeListener() {
@Override
public void onAdStatusChanged(NGANativeAdData ngaNativeAd, int i, Map<String, String> map) {
Log.i(TAG, "onAdStatusChanged " + i);
}
@Override
public void onShowAd() {
ToastUtil.show(TAG, "onShowAd");
}
@Override
public void onRequestAd() {
ToastUtil.show(TAG, "onRequestAd");
}
@Override
public <T extends NGAdController> void onReadyAd(T controller) {
mController = (NGANativeController) controller;
ToastUtil.show(TAG, "onReadyAd");
}
@Override
public void onCloseAd() {
ToastUtil.show(TAG, "onCloseAd");
mController = null;
}
@Override
public void onClickAd() {
ToastUtil.show(TAG, "onClickAd");
}
@Override
public void onErrorAd(int code, String message) {
ToastUtil.show(TAG, "onErrorAd errorCode:" + code + ", message:" + message);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ad_native);
mMainContainer = (LinearLayout) findViewById(R.id.rl_control_container);
}
private void refreshAdContainer() {
if (mAdContainer != null) {
mMainContainer.removeView(mAdContainer);
}
mAdContainer = (RelativeLayout) LayoutInflater.from(this).inflate(R.layout.native_ad_contaner, null, false);
mIvAppIcon = (ImageView) mAdContainer.findViewById(R.id.iv_app_icon);
mTvAppTitle = (TextView) mAdContainer.findViewById(R.id.tv_app_title);
mTvAppDesc = (TextView) mAdContainer.findViewById(R.id.tv_app_desc);
mTvAppScore = (TextView) mAdContainer.findViewById(R.id.tv_app_score);
mIvAppImg = (ImageView) mAdContainer.findViewById(R.id.iv_app_img);
mBtnClick = (TextView) mAdContainer.findViewById(R.id.btn_app_click);
mIvAdLogo = (ImageView) mAdContainer.findViewById(R.id.iv_ad_logo);
mMainContainer.addView(mAdContainer);
}
private void loadAd(Activity activity) {
//如果使用原有的容器再次请求广告,必须关闭原有的广告
closeAd(activity);
//每次加载广告必须使用新的广告容器view
refreshAdContainer();
Map<String, Object> param = new HashMap<>();
//一次加载所提供的广告数量。不一定能够给到传入的数量,请以最终返回的广告数量为准
param.put(NGANativeProperties.KEY_AD_COUNT, 1);
param.put(NGANativeProperties.APP_ID, AdConfig.appId);
param.put(NGANativeProperties.POSITION_ID, AdConfig.nativeId);
mProperties = new NGANativeProperties(activity, param);
mProperties.setListener(mAdListener);
NGASDK ngasdk = NGASDKFactory.getNGASDK();
ngasdk.loadAd(mProperties);
}
public void destroyAd(Activity activity) {
if (mController != null) {
mController.closeAd();
mController = null;
}
}
private void showAd(Activity activity) {
if (mController != null) {
mAdDataItem = mController.getAdList().get(0);
new LoadImageUtil(mAdDataItem.getIconUrl()){
@Override
public void onReceived(Drawable result) {
mIvAppIcon.setImageDrawable(result);
//广告曝光后,一定一定要调用该方法,否则无法计算曝光数量
mAdDataItem.exposure(mAdContainer);
}
}.execute();
new LoadImageUtil(mAdDataItem.getImgList().get(0)){
@Override
public void onReceived(Drawable result) {
mIvAppImg.setImageDrawable(result);
}
}.execute();
//根据相关规定,广告必须要有广告标识,请将该广告logo放置在广告右下角
new LoadImageUtil(mAdDataItem.getAdLogo()) {
@Override
public void onReceived(Drawable result) {
mIvAdLogo.setImageDrawable(result);
}
}.execute();
mTvAppTitle.setText(mAdDataItem.getTitle());
mTvAppDesc.setText(mAdDataItem.getDesc());
if (mAdDataItem.getRating() > 0) {
mTvAppScore.setText("评分:" + mAdDataItem.getRating());
} else {
mTvAppScore.setText("暂无评分");
}
mBtnClick.setText(mAdDataItem.getButtonText());
mBtnClick.setBackgroundColor(Color.GRAY);
}
}
private void closeAd(Activity activity) {
if (mController != null) {
mController.closeAd();
mController = null;
}
}
@Override
protected void onDestroy() {
//原生广告必须调用关闭,否则影响广告计费
closeAd(this);
super.onDestroy();
}
public void onClick(View view) {
if (view.getId() == R.id.btn_native_create) {
loadAd(this);
} else if (view.getId() == R.id.btn_native_destroy) {
destroyAd(this);
} else if (view.getId() == R.id.btn_native_show) {
showAd(this);
} else if (view.getId() == R.id.btn_native_close) {
closeAd(this);
}
}
}
注:更多详细代码示例,请参考Demo工程代码: cn.sirius.adsdkdemo.NativeAdActivity
public class NGANativeProperties extends NGAProperties<NGANativeController,NGANativeListener>
限定符和类型 | 方法和说明 |
---|---|
NGANativeListener | getListener() 获取广告的监听(回调)对象 |
void | setListener(NGANativeListener listener) 设置广告的监听(回调)对象,设置时机是在发起广告请求之前。 |
public interface NGANativeListener extends NGAdListener
public interface NGANativeController extends NGAdController
限定符和类型 | 方法和说明 |
---|---|
List<NGANativeAdData> | getAdList() 获取广告对象列表 |
void | closeAd()标记广告关闭,务必调用,否则影响计量 |
public interface NGANativeAdData
限定符和类型 | 方法和说明 |
---|---|
String | getTitle(); 获得广告标题文字 |
String | getDesc(); 获得广告详细描述文字 |
String | getIconUrl(); 获得广告图标url |
List | getImgList(); 获得广告图片url集合 |
double | getRating(); 获得广告评分 |
boolean | isApp(); 广告是否app类型 |
String | getButtonText(); 广告按钮文案 |
String | getAdLogo(); 获得广告logo图标url,根据相关规定,请将该logo放在广告右下角 |
void | exposure(View container); 标记广告曝光,并启动监听点击功能,曝光后务必调用,否则影响计量 |
google对于Android 6.0以上的版本,要求添加运行时权限,否则SDK可能由于无权限而导致播放视频失败。
建议在第三方apk初始化时主动请求获取这些权限,权限请求越早越好。
如第三方接入已经有运行时权限检查的功能,请将1.2步骤AndroidManifest.xml中SDK运行需要的权限自行添加。
如第三方接入未添加运行时权限检查功能,根据实际业务情况,参考如下步骤添加,兼容Android 6.0以上的版本。
private static boolean hasGetPermission = false;
private final static int MY_PERMISSIONS_REQUEST = 1;
final String[] mOptionalPermission = new String[]{
// 位置权限不是必须的,加上能保证匹配到最好的广告
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ToastUtil.init(getApplicationContext());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermission();
} else {
hasGetPermission = true;
onRequestPermissionSuccess();
}
}
/**
* 权限请求成功的回调函数
*/
protected void onRequestPermissionSuccess() {
}
protected void setTitle(String title){
((TextView)findViewById(R.id.title)).setText(title);
}
public void backPressed(View v){
onBackPressed();
}
public void switchOrientation(View v) {
if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
/**
* 请求Permission的调用接口
*/
public void requestPermission() {
final String[] permissions = new String[]{
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.ACCESS_WIFI_STATE,
// 位置权限不是必须的,加上能保证匹配到最好的广告
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
};
checkPermission(this, permissions, MY_PERMISSIONS_REQUEST);
}
/**
* 执行Permission的运行时权限判断
*/
private void checkPermission(Activity activity, String permissions[], int permissionCode) {
Context context = activity.getApplicationContext();
StringBuilder sb = new StringBuilder();
for (String item : permissions) {
if (ContextCompat.checkSelfPermission(context,
item)
!= PackageManager.PERMISSION_GRANTED) {
sb.append(item).append('`');
break;
}
}
if (sb.length() > 0) {
ActivityCompat.requestPermissions(activity,
sb.toString().split("`"),
permissionCode);
} else {
hasGetPermission = true;
onRequestPermissionSuccess();
}
}
/**
* 权限请求的回调函数
*/
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED || isOptionalPermissions(permissions)) {
hasGetPermission = true;
onRequestPermissionSuccess();
} else {
hasGetPermission = false;
}
}
}
}
private boolean isOptionalPermissions(String permissions[]) {
boolean matched = true;
for (String permission : permissions) {
if (Arrays.binarySearch(mOptionalPermission, permission) < 0) {
matched = false;
break;
}
}
return matched;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ... 你的初始化代码 ...
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermission();
} else {
hasGetPermission = true;
}
}
targetSDKVersion >= 24
,为了让SDK能够正常下载、安装App类广告,必须按照下面的三个步骤做兼容性处理。注意:如果您的targetSDKVersion < 24
,不需要做这个兼容处理。
(1)在AndroidManifest.xml
中的Application
标签中添加provider
标签,接入代码如下所示:<application
... ...
<!-- targetSDKVersion >= 24时才需要添加这个provider。provider的authorities属性的值为${applicationId}.fileprovider,请开发者根据自己的${applicationId}来设置这个值 -->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/adp_file_path" />
</provider>
<provider
android:name="com.lm.listener.FileProvider"
android:authorities="${applicationId}_lm.fileprovider"
android:grantUriPermissions="true"
android:exported="false"/>
... ...
</application>
需要注意的是provider的authorities值为{applicationId}在代码中和Context.getPackageName()
值相等,是应用的唯一id。例如demo示例工程中的applicationId为"com.qq.e.union.demo"。
(2)在项目结构下的res
目录下添加一个xml
文件夹,再新建一个adp_file_path.xml
的文件,文件内容如下:
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 这个下载路径不可以修改,必须是GDTDOWNLOAD -->
<external-path name="gdt_sdk_download_path" path="GDTDOWNLOAD" />
</paths>
如果您的发布包(release包)需要使用proguard混淆代码,需确保不要混淆SDK的代码。请在proguard.cfg文件(或其他混淆文件)尾部添加如下配置:
-keepattributes SourceFile,LineNumberTable
-keepattributes Signature
-keepattributes *Annotation*
## common
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep class android.app.**{*;}
-dontwarn android.app.**
-keep class android.support.v7.media.*{public *;}
-keep class android.support.v4.** { *; }
-dontwarn android.support.**
## network libs
-keep class android.net.http.** { *; }
-dontwarn android.net.**
-dontnote android.net.http.*
-keep class org.apache.http.** { *; }
-dontwarn org.apache.**
-dontnote org.apache.commons.codec.**
-dontnote org.apache.http.**
# Keep native methods
-keepclasseswithmembers class * {
native <methods>;
}
### utdid
-keep class com.ta.utdid2.**{*;}
-keep class com.ut.device.**{*;}
-dontwarn com.ta.utdid2.**
-dontwarn com.ut.device.**
# Keep ngad-sdk classes
-keep class cn.sirius.nga.** {*; }
-dontwarn cn.sirius.nga.**
-keep class cn.ninegame.library.** {*; }
-dontwarn cn.ninegame.library.**
-keep class com.qq.e.** {*; }
-dontwarn com.qq.e.**
-keep class com.taobao.** {*; }
-dontwarn com.taobao.**
-keep class android.taobao.** {*; }
-dontwarn android.taobao.**
-keep class com.UCMobile.Apollo.**{*;}
-dontwarn com.mobvista.**
-keep class com.mobvista.** {*; }
-keep interface com.mobvista.** {*; }
-keep class **.R$* { public static final int mobvista*; }
-keep class com.alphab.** {*; }
-keep interface com.alphab.** {*; }
-dontwarn com.lm.**
-keep class com.lm.** { *; }
-dontwarn com.uniplay.**
-keep class com.uniplay.** { *; }
错误码 | 错误描述 |
---|---|
10001,ON_ERROR_AD_CODE_INIT_SDK_FAILED | "Init SDK Failed", 初始化sdk失败 |
10002, ON_ERROR_AD_CODE_RECEIVE_AD_FAILED | "Receive Ad Failed",广告显示失败 |
10003, ON_ERROR_AD_CODE_LOAD_AD_FAILED | "Load Ad Failed",加载广告失败 "load ad over time",加载广告超时 |
10004, ON_ERROR_AD_CODE_PARAMETER_ERROR | "parameter error",参数错误,请检查! |
10005,ON_ERROR_AD_CODE_LOAD_TOO_FREQUENTLY | "load too frequently",请求广告过于频繁,请稍后再试 |
13001, ON_ERROR_AD_CODE_VIDEO_NO_DATA | "No Video Ad Data",没有视频广告 |
13002, ON_ERROR_AD_CODE_VIDEO_NO_WIFI | "No WIFI, Video Ad Error",非WiFi网络播放视频失败 |
3XX | 初始化错误 |
403 | HHTP状态码错误:建议检查网络状态 |
404 | 网络超时:建议检查网络状态 |
405 | 加载资源出错:建议网络状态 |
406 | 图片加载出错:建议检查网络状态 |
4XX | 网络错误 |
500 | 广告位错误:建议检查广告位是否正确 |
501 | 无广告返回:建议重新请求广告 |
5XX | 广告错误 |
600 | 广告容器不可见错误:建议检查代码逻辑,保证广告容器可见 |
601 | 网络类型错误。例:开屏广告仅在wifi下展示 |
602 | Android权限错误:建议检查AndroidManifest是否声明了所需权限 |
606 | 开屏广告高度不足400dp:建议检查layout布局中传给开屏广告的容器高度 |
607 | 原生广告未先调用曝光接口,就调用了点击接口 |
608 | 开屏广告自定义跳过按钮不符合要求,例如尺寸小于3x3dp,或者在屏幕中不可见 |
6XX | 其他错误 |
700 | 视频素材下载错误 |
701 | 视频素材播放错误 |
109506 | 广告请求频次过高 |
问题:广告无法加载出来的场景问题
原因分析,可能有以下情况导致:
没有调用sdk初始化:init ,建议在Application OnCreate做广告sdk初始化;
Eclipse工程引入sdk情况下,缺失jar、so文件;
Eclipse工程引入sdk情况下,没有引入support包;
网络不通(有WiFi但无法联网),导致广告请求连接失败;
或者:
release包混淆配置没有添加广告sdk过滤配置,参考接入说明文档。
问题:设置了广告回调 (NGAdListener子类对象),但是没有收到回调通知。
原因分析:设置的广告回调对象是new 的临时对象,不是成员对象,没有被其他逻辑引用可能会回收释放,
因为广告sdk内部对回调对象做了一次软引用WeakReference包装。
问题:获取到广告控制器(NGAdController对象)之后,能不能重复调用展示/关闭广告操作(showAd/closeAd)?
答:横幅、普通插屏、开屏、视频广告不可以, 调用closeAd关闭广告之后,再调用showAd,很可能无法正常显示广告。只有模板广告允许多次调用,以供微调自定义界面。重新加载广告需要重新调用NGASDK#loadAd方法,等待onReadyAd事件回调获取广告控制器重新加载新的广告(showAd),此操作同时提高广告的填充率以及曝光量。
问题:如何处理广告加载失败情况?
答:根据具体错误码处理。特别地,单次启动应用,如果连续5次加载广告失败,切莫再发起请求。