小说书城
小说书城
接入准备
环境要求
若项目的targetSdkVersion
版本大于28,将无法展示小说书城
添加依赖项
将 SDK 压缩包内的novelsdk-x.y.z
复制到application module/libs
文件夹(没有的话须手动创建), 并增加依赖
depedencies {
// 小说书城相关支持包
implementation files('./libs/novelsdk-x.y.z.aar')
//如果工程未引入kotlin,需要引入以下依赖库
implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.4.10'
implementation 'org.jetbrains.kotlin:kotlin-stdlib-common:1.4.10'
implementation 'org.jetbrains:annotations:13.0'
implementation 'org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.4.10'
}
混淆配置
在当前工程的混淆配置文件中追加以下内容:
点击展开混淆配置
#保持 native 方法不被混淆
-keepclasseswithmembernames class * {
native <methods>;
}
# Keep native methods
-keepclassmembers class * {
native <methods>;
}
#FBReader native层调用java代码配置
-keep class org.geometerplus.zlibrary.core.library.ZLibrary {*;}
-keep class org.geometerplus.zlibrary.core.filesystem.ZLFile {*;}
-keep interface org.geometerplus.zlibrary.text.model.ZLTextModel {*;}
-keep class org.geometerplus.zlibrary.text.model.CachedCharStorageException {*;}
-keep class org.geometerplus.zlibrary.core.encodings.Encoding {*;}
-keep class org.geometerplus.zlibrary.core.encodings.EncodingConverter {*;}
-keep class org.geometerplus.zlibrary.core.encodings.JavaEncodingCollection {*;}
-keep class org.geometerplus.fbreader.formats.NativeFormatPlugin {*;}
-keep class org.geometerplus.fbreader.formats.PluginCollection {*;}
-keep class org.geometerplus.fbreader.Paths {*;}
-keep class org.geometerplus.fbreader.book.Book {*;}
-keep class org.geometerplus.fbreader.book.Tag {*;}
-keep class org.geometerplus.fbreader.bookmodel.NativeBookModel {*;}
-keep public class com.baidu.novel.android.common.util.Util { *; }
#保持okhttp不被混淆
-dontwarn com.baidu.searchbox.novel.okhttp3.**
-keep class com.baidu.searchbox.novel.okhttp3.**{ *; }
-keep interface com.baidu.searchbox.novel.okhttp3.**{ *; }
#gson
-keepclassmembers,allowobfuscation class * {
@com.baidu.searchbox.novel.gson.annotations.SerializedName <fields>;
}
# 单针对该类做keep处理
-keep public class com.baidu.novel.android.common.util.Util { *; }
# 自定义控件
-keepclasseswithmembers class * {
public <init>(android.content.Context);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keep class **.R$* {
public static <fields>;
}
-keep class com.baidu.searchbox.reader.ReaderPluginApi{*;}
#UBC
-keep class com.baidu.ubc.* {*;}
请求小说书城
调用ZJNovelAd#loadAd
方法请求广告,并在ZJNovelAdLoadListener
中获取广告对象与处理错误信息
public class ZJNovelAd {
/**
* 小说书城
*
* @param posId 广告位ID
* @param loadListener 加载回调
*/
public static void loadAd(String posId, ZJNovelAdLoadListener loadListener);
}
加载回调说明
方法 | 说明 |
---|---|
onError(int code, String msg) | 广告加载失败 code: 错误码 msg: 错误信息 |
onAdLoaded(ZJNovelAd novelAd) | 广告加载成功 novelAd: 广告对象 |
展示小说书城
在加载成功回调中获取到ZJNovelAd
对象后,可以配置交互回调、展示广告
ZJNovelAd 说明
方法 | 说明 |
---|---|
setInteractionListener(ZJNovelAdInteractionListener interactionListener) | 配置交互回调 |
getAdView(Activity activity) | 获取广告视图(activity:需要传入当前前台activity) |
onDestroy() | 需要在 activity#onDestroy 时调用,防止内存泄漏 |
交互回调
方法 | 说明 |
---|---|
onFeedShow() | 进入书城页面 |
onFeedQuit(long l) | 退出书城页面 l -- 进入页面的时间戳,单位ms |
feedDuration(float f) | 书城停留时间 f -- 停留书城页面的时间,单位ms |
enterReader(ZJNovelAd.NovelInfo info) | 进入阅读器 info -- 书籍信息 |
quitReader(ZJNovelAd.NovelInfo info) | 退出阅读器 info -- 书籍信息 |
onAdClick() | 广告点击 |
onAdImpression() | 广告展现 |
onReadTime(long duration) | 用户单次打开阅读器阅读时长,翻页过程不被纳入阅读时长 在可读页面(非预览和购买章节)第一次翻页完成后开始计时,每页停留时长>1秒算有效停留时长,第一页、最后一页、翻页均不计入有效时长,且单页时长不超过30S |
书籍信息说明
ZJNovelAd.NovelInfo.class
方法 | 说明 |
---|---|
String getNovelName() | 获取书籍名称 |
String getChapterName() | 获取章节名称 |
long getReaderDuration() | 获取阅读时长,单位ms |
小说书城接入示例
// 加载广告
ZJNovelAd.loadAd(posId , new ZJNovelAdLoadListener() {
@Override
public void onError(int code, @NonNull String msg) {
Log.e("ZJNovelAd", "激励广告加载出错" + code + "-" + msg);
}
@Override
public void onAdLoaded(@NonNull ZJNovelAd novelAd) {
// 小说书城加载成功,配置交互回调
novelAd.setInteractionListener(NovelAdActivity.this);
// 小说书城展示
this.container.addView(novelAd.getAdView(NovelAdActivity.this));
}
});