小说书城

小说书城

接入准备

环境要求

若项目的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));
    }

});