集成说明
<p>[TOC]</p>
<h2>1.奇点简介</h2>
<p>广告聚合SDK,一次集成,多平台广告联盟自动填充。</p>
<h2>2.SDK集成说明</h2>
<p>参见Demo地址:联系商务苏经理(电话:13911636831 微信:Darren162814 邮箱:sulei@qdjubian.com)获取Demo。</p>
<h3>AndroidManifest.xml文件需配置以下信息</h3>
<p><strong>权限声明:</strong></p>
<pre><code class="language-xml"><!-- 必要权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WAKE_LOCK" /></code></pre>
<p><strong>穿山甲配置:</strong></p>
<pre><code class="language-xml"> <!-- 穿山甲 -->
<provider
android:name="com.bytedance.sdk.openadsdk.TTFileProvider"
android:authorities="${applicationId}.TTFileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<provider
android:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider"
android:authorities="${applicationId}.TTMultiProvider"
android:exported="false" /></code></pre>
<p><strong>广点通配置:</strong></p>
<pre><code class="language-xml"><!-- gdt -->
<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/gdt_file_path" />
</provider> <!-- 声明SDK所需要的组件 -->
<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" />
<activity
android:name="com.qq.e.ads.PortraitADActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait" />
<activity
android:name="com.qq.e.ads.LandscapeADActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:screenOrientation="landscape" /></code></pre>
<p><strong>百度联盟配置:</strong></p>
<pre><code class="language-xml"><activity
android:name="com.baidu.mobads.AppActivity"
android:configChanges="screenSize|keyboard|keyboardHidden|orientation"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<provider
android:name="com.baidu.mobads.openad.BdFileProvider"
android:authorities="${packageName}.bd.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/bd_file_path" />
</provider></code></pre>
<p><strong>SDK导入</strong>
将Demo libs目录下的所有SDK导入工程项目的libs目录下,并在build.gradle中声明</p>
<pre><code class="language-xml"> implementation files('libs/fusion-adapter-v<最新版>.aar')
implementation files('libs/fusion-sdk-baidu-v<最新版>.aar')
implementation files('libs/fusion-core-v<最新版>.aar')
implementation files('libs/fusion-sdk-gdt-v<最新版>.aar')
implementation files('libs/fusion-sdk-openad-v<最新版>.aar')
implementation files('libs/fusion-sdk-kuaishou-v<最新版>.aar')
implementation files('libs/fusion-ad-util-v<最新版>.aar')
implementation files('libs/common-v<最新版>.aar')
implementation files('libs/open_ad_sdk.aar')
implementation files('libs/GDTSDK.unionNoPlugin<版本号>.aar')
implementation files('libs/Baidu_MobAds_SDK-release.aar')
implementation files('libs/ks_adsdk-ad-<版本号>-publishRelease.aar')</code></pre>
<h2>3.SDK初始化说明</h2>
<p>在Application中调用以下初始化方法:</p>
<pre><code class="language-java"> // 联盟SDK相关配置
AiAdConfig aiAdConfig = new AiAdConfig.Builder()
.setOpenAdAppId("5101295") //设置穿山甲AppId
.setGdtAppId("1110911996") //设置广点通AppId
.setBaiduAppId("cf690f12") //设置百度联盟AppId
.setKsAppId("90009")//设置快手联盟AppId
.setCacheAdPositionInfo(true) // 当AI变现助手服务暂不可用时是否使用之前的缓存排序数据,默认false
.setUseTextureView(false) // 是否使用TextureView控件播放视频,默认为SurfaceView true: 使用TextureView; false: 使用SurfaceView,默认为false
.build();
// 初始化SDK
FusionAi.getInstance(this, "<Dashboard分配的AppKey>", aiAdConfig);
// 是否打印日志
FusionAi.getInstance().setDebug();</code></pre>
<h2>4.激励视频广告</h2>
<p><strong>初始化广告位</strong></p>
<pre><code class="language-java">AiRewardVideoAd aiRewardVideoAd = new AiRewardVideoAd(this, "100016");</code></pre>
<p><strong>设置广告监听</strong></p>
<pre><code class="language-java">aiRewardVideoAd.setOnAiRewardVideoListener(new AiRewardVideoListener() {
@Override
public void onLoad(AiAdInfo aiAdInfo) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(AdRewardVideoActivity.this.getApplicationContext(), "有广告可展示", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onCached(AiAdInfo aiAdInfo) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(AdRewardVideoActivity.this.getApplicationContext(), "视频资源已缓存", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onFail(CommonError error) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(AdRewardVideoActivity.this.getApplicationContext(), "无广告展示", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onShow(AiAdInfo aiAdInfo) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(AdRewardVideoActivity.this.getApplicationContext(), "广告展示", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onClick(AiAdInfo aiAdInfo) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(AdRewardVideoActivity.this.getApplicationContext(), "广告点击", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onVideoComplete(AiAdInfo aiAdInfo) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(AdRewardVideoActivity.this.getApplicationContext(), "视频播放完成", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onVideoError(AiAdInfo aiAdInfo) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(AdRewardVideoActivity.this.getApplicationContext(), "视频播放错误", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onRewardVerify(AiAdInfo aiAdInfo, boolean rewardVerify) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(AdRewardVideoActivity.this.getApplicationContext(), "激励视频激励回调", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onSkippedVideo(AiAdInfo aiAdInfo, float progress) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(AdRewardVideoActivity.this.getApplicationContext(), "视频被用户跳过", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onClose(AiAdInfo aiAdInfo) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(AdRewardVideoActivity.this.getApplicationContext(), "视频广告关闭", Toast.LENGTH_SHORT).show();
}
});
}
});</code></pre>
<p><strong>加载广告</strong>
初始化广告位后调用load方法开始加载广告</p>
<pre><code class="language-java">aiRewardVideoAd.load();</code></pre>
<p><strong>展示广告</strong>
在有可展示的广告回调后,调用show方法来展示广告</p>
<pre><code class="language-java">aiRewardVideoAd.show();</code></pre>
<p><strong>释放广告</strong>
在退出页面后,调用destroy方法来释放联盟广告资源</p>
<pre><code class="language-java">aiRewardVideoAd.destroy();</code></pre>
<h2>5.原生广告</h2>
<p><strong>初始化广告位</strong></p>
<pre><code class="language-java"> AiExpressAdConfig.Builder aiExpressAdConfigBuilder = new AiExpressAdConfig.Builder();
aiExpressAdConfigBuilder.setAdCount(2).setAdWidth(1080).setAdHeight(0);
AiNativeExpressAd aiNativeExpressAd = new AiNativeExpressAd(this, "123", aiExpressAdConfigBuilder.build());</code></pre>
<p><strong>设置广告监听</strong></p>
<pre><code class="language-java">aiNativeExpressAd.setOnAiNativeListener(aiNativeListener);
private AiNativeListener aiNativeListener = new AiNativeListener() {
@Override
public void onLoad(AiAdInfo aiAdInfo, List<AiNativeExpress> aiNativeExpressList) {
if (mListView != null) {
mListView.setLoadingFinish();
}
if (aiNativeExpressList == null || aiNativeExpressList.isEmpty()) {
Toast.makeText(NativeExpressActivity.this, "on FeedAdLoaded: ad is null!", Toast.LENGTH_SHORT).show();
return;
}
for (int i = 0; i < LIST_ITEM_COUNT; i++) {
mData.add(null);
}
bindAdListener(aiNativeExpressList);
}
@Override
public void onFail(CommonError aiAdError) {
if (mListView != null) {
mListView.setLoadingFinish();
}
Toast.makeText(NativeExpressActivity.this, "无广告", Toast.LENGTH_SHORT).show();
}
@Override
public void onClose(AiAdInfo aiAdInfo) {
}
};</code></pre>
<p><strong>设置广告监听</strong></p>
<pre><code class="language-java">adTmp.setExpressAdInteractionListener(new AiNativeExpress.ExpressAdInteractionListener() {
@Override
public void onAdClicked(AiAdInfo aiAdInfo) {
Toast.makeText(NativeExpressActivity.this, "广告被点击", Toast.LENGTH_SHORT).show();
}
@Override
public void onAdShow(AiAdInfo aiAdInfo) {
Toast.makeText(NativeExpressActivity.this, "广告展示", Toast.LENGTH_SHORT).show();
}
@Override
public void onRenderFail(AiAdError aiAdError) {
Toast.makeText(NativeExpressActivity.this, aiAdError.toString(), Toast.LENGTH_SHORT).show();
}
@Override
public void onRenderSuccess(AiAdInfo aiAdInfo) {
//返回view的宽高 单位 dp
Toast.makeText(NativeExpressActivity.this, "渲染成功", Toast.LENGTH_SHORT).show();
myAdapter.notifyDataSetChanged();
}
});</code></pre>
<p><strong>加载广告</strong>
初始化广告位后调用load方法开始加载广告</p>
<pre><code class="language-java">aiNativeExpressAd.load();</code></pre>
<p><strong>释放广告</strong>
在退出页面后,调用destroy方法来释放联盟广告资源</p>
<pre><code class="language-java">aiNativeExpressAd.destroy();</code></pre>
<h2>6.插屏广告</h2>
<p><strong>初始化广告位</strong></p>
<pre><code class="language-java">AiInterstitial aiInterstitial = new AiInterstitial(this, "100013");</code></pre>
<p><strong>设置广告监听</strong></p>
<pre><code class="language-java">aiInterstitial.setOnAiInteractionListener(new AiInteractionListener() {
@Override
public void onLoad(AiAdInfo aiAdInfo) {
Toast.makeText(InterstitialActivity.this, "有广告可展示", Toast.LENGTH_SHORT).show();
}
@Override
public void onFail(CommonError error) {
Toast.makeText(InterstitialActivity.this, "无广告展示", Toast.LENGTH_SHORT).show();
}
@Override
public void onReady() {
Toast.makeText(InterstitialActivity.this, "渲染成功,可以展示", Toast.LENGTH_SHORT).show();
}
@Override
public void onShow(AiAdInfo aiAdInfo) {
Toast.makeText(InterstitialActivity.this, "广告展示", Toast.LENGTH_SHORT).show();
}
@Override
public void onClick(AiAdInfo aiAdInfo) {
Toast.makeText(InterstitialActivity.this, "广告点击", Toast.LENGTH_SHORT).show();
}
@Override
public void onClose(AiAdInfo aiAdInfo) {
Toast.makeText(InterstitialActivity.this, "广告关闭", Toast.LENGTH_SHORT).show();
}
});</code></pre>
<p><strong>加载广告</strong>
初始化广告位后调用load方法开始加载广告</p>
<pre><code class="language-java">aiInterstitial.load();</code></pre>
<p><strong>释放广告</strong>
在退出页面后,调用destroy方法来释放联盟广告资源</p>
<pre><code class="language-java">aiInterstitial.destroy();</code></pre>
<h2>7.开屏广告</h2>
<p><strong>初始化广告位</strong></p>
<pre><code class="language-java">AiSplashView aiSplashView = new AiSplashView(this, "100014");
splashContainer.addView(aiSplashView, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));</code></pre>
<p><strong>设置广告监听</strong></p>
<pre><code class="language-java">aiSplashView.setOnAiSplashListener(new AiSplashListener() {
@Override
public void onLoad(AiAdInfo aiAdInfo) {
Toast.makeText(AdSplashActivity.this, "有广告可展示", Toast.LENGTH_SHORT).show();
}
@Override
public void onFail(CommonError error) {
Toast.makeText(AdSplashActivity.this, "无广告展示", Toast.LENGTH_SHORT).show();
}
@Override
public void onReady() {
Toast.makeText(AdSplashActivity.this, "渲染成功,可以展示", Toast.LENGTH_SHORT).show();
}
@Override
public void onShow(AiAdInfo aiAdInfo) {
Toast.makeText(AdSplashActivity.this, "广告展示", Toast.LENGTH_SHORT).show();
}
@Override
public void onClick(AiAdInfo aiAdInfo) {
Toast.makeText(AdSplashActivity.this, "广告点击", Toast.LENGTH_SHORT).show();
}
@Override
public void onSkip(AiAdInfo aiAdInfo) {
Toast.makeText(AdSplashActivity.this, "广告跳过", Toast.LENGTH_SHORT).show();
}
@Override
public void onTimeOver(AiAdInfo aiAdInfo) {
Toast.makeText(AdSplashActivity.this, "广告倒计时结束", Toast.LENGTH_SHORT).show();
}
@Override
public void onClose(AiAdInfo aiAdInfo) {
Toast.makeText(AdSplashActivity.this, "广告关闭", Toast.LENGTH_SHORT).show();
}
});</code></pre>
<p><strong>加载广告</strong>
初始化广告位后调用load方法开始加载广告</p>
<pre><code class="language-java">aiSplashView.load();</code></pre>
<p><strong>释放广告</strong>
在退出页面后,调用destroy方法来释放联盟广告资源</p>
<pre><code class="language-java">aiSplashView.destroy();</code></pre>
<h2>8.Banner广告</h2>
<p><strong>初始化广告位</strong></p>
<pre><code class="language-java">AiBannerView aiBannerView = new AiBannerView(this, "100013");
bannerContainer.addView(aiBannerView, new FrameLayout.LayoutParams(1080, ViewGroup.LayoutParams.WRAP_CONTENT));</code></pre>
<p><strong>设置广告监听</strong></p>
<pre><code class="language-java">aiBannerView.setOnAiBannerListener(new AiBannerListener() {
@Override
public void onLoad(AiAdInfo aiAdInfo) {
Toast.makeText(AdBannerActivity.this, "有广告可展示", Toast.LENGTH_SHORT).show();
}
@Override
public void onFail(CommonError error) {
Toast.makeText(AdBannerActivity.this, "无广告展示", Toast.LENGTH_SHORT).show();
}
@Override
public void onReady() {
Toast.makeText(AdBannerActivity.this, "渲染成功,可以展示", Toast.LENGTH_SHORT).show();
}
@Override
public void onShow(AiAdInfo aiAdInfo) {
Toast.makeText(AdBannerActivity.this, "广告展示", Toast.LENGTH_SHORT).show();
}
@Override
public void onClick(AiAdInfo aiAdInfo) {
Toast.makeText(AdBannerActivity.this, "广告点击", Toast.LENGTH_SHORT).show();
}
@Override
public void onClose(AiAdInfo aiAdInfo) {
}
});</code></pre>
<p><strong>加载广告</strong>
初始化广告位后调用load方法开始加载广告</p>
<pre><code class="language-java">aiBannerView.load();</code></pre>
<p><strong>释放广告</strong>
在退出页面后,调用destroy方法来释放联盟广告资源</p>
<pre><code class="language-java">aiBannerView.destroy();</code></pre>
<h2>9.AiAdInfo回调信息说明</h2>
<table>
<thead>
<tr>
<th>方法</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>getNetworkFirmId()</td>
<td>int</td>
<td>获取 广告平台对应的ID,用于区分广告平台,参考文档末尾的 Network Firm Id Table</td>
</tr>
<tr>
<td>getAdsourceId()</td>
<td>String</td>
<td>获取 广告源ID. 可在开发者后台或TopOn Open API 通过广告源ID查询具体的Network信息</td>
</tr>
<tr>
<td>getAdsourceIndex()</td>
<td>int</td>
<td>获取 当前广告源在WaterFall中的排序(从0开始,0优先级最高)</td>
</tr>
<tr>
<td>getEcpm()</td>
<td>dounble</td>
<td>获取 eCPM,currency获取, 精度可通过 precision 获取</td>
</tr>
<tr>
<td>isHeaderBiddingAdsource()</td>
<td>int</td>
<td>是否为头部竞价的广告源,1:是,2:否</td>
</tr>
<tr>
<td>getShowId()</td>
<td>int</td>
<td>获取 每次展示广告时生成的独立ID</td>
</tr>
<tr>
<td>getPublisherRevenue()</td>
<td>double</td>
<td>获取 展示收益,单位可通过currency获取, 精度可通过 precision 获取</td>
</tr>
<tr>
<td>getCurrency()</td>
<td>String</td>
<td>获取 货币单位,例如:"USD"</td>
</tr>
<tr>
<td>getCountry()</td>
<td>String</td>
<td>获取 国家代码, 例如:”CN"</td>
</tr>
<tr>
<td>getQiDianPlacementId()</td>
<td>String</td>
<td>获取 奇点广告位ID</td>
</tr>
<tr>
<td>getQiDianAdFormat()</td>
<td>String</td>
<td>获取 广告类型,包括:"Native"、"RewardedVideo"、"Banner"、"Interstitial"、"Splash"</td>
</tr>
<tr>
<td>getEcpmPrecision()</td>
<td>String</td>
<td>获取 ECPM精度 <br>"publisher_defined":开发者在奇点后台为广告源定义的eCPM(交互推广的eCPM也属于该类型);<br>"estimated": 奇点的预估eCPM(auto eCPM)(暂不支持);<br>"exact":Header Bidding实时竞价的eCPM(暂不支持)</td>
</tr>
<tr>
<td>getAdNetworkType()</td>
<td>String</td>
<td>获取 Network类型<br>"Network":第三方广告平台<br>"Cross_Promotion":交互推广<br>"Adx":暂未支持</td>
</tr>
<tr>
<td>getNetworkPlacementId()</td>
<td>String</td>
<td>获取 Network的广告位ID</td>
</tr>
<tr>
<td>getEcpmLevel()</td>
<td>int</td>
<td>获取 广告源的eCPM层级,头部竞价广告源默认为0</td>
</tr>
<tr>
<td>getSegmentId()</td>
<td>int</td>
<td>获取 流量分组ID</td>
</tr>
<tr>
<td>getScenarioId()</td>
<td>String</td>
<td>获取 广告场景ID,仅Rewarded Video&Interstitial支持</td>
</tr>
<tr>
<td>getScenarioRewardName()</td>
<td>String</td>
<td>获取 广告场景的激励名称,仅Rewarded Video支持</td>
</tr>
<tr>
<td>getScenarioRewardNumber()</td>
<td>int</td>
<td>获取 广告场景的激励数量,仅Rewarded Video支持</td>
</tr>
<tr>
<td>getSubChannel()</td>
<td>String</td>
<td>获取子渠道信息(暂不支持)</td>
</tr>
<tr>
<td>getChannel()</td>
<td>String</td>
<td>获取 渠道信息(暂不支持)</td>
</tr>
<tr>
<td>getCustomRule()</td>
<td>String</td>
<td>获取 Placement+App维度的自定义规则的Json字符串</td>
</tr>
</tbody>
</table>