信息流广告

信息流广告

此章节将演示如何请求在原生环境下请求与展示信息流广告

竖版图文横板图文
竖版图文横板图文

请求信息流广告

调用ZJNativeExpressAd#loadAd的重载方法请求广告,并在ZJNativeExpressAdLoadListener中获取广告对象与处理错误信息

public class ZJNativeExpressAd {

    public static void loadAd(Activity activity, String posId, int num, ZJNativeExpressAdLoadListener loadListener);

    public static void loadAd(Activity activity, String posId, int num, boolean isVolumeOn, ZJNativeExpressAdLoadListener loadListener);

    public static void loadAd(Activity activity, String posId, int num, int widthDP, int heightDP, ZJNativeExpressAdLoadListener loadListener);

    /**
     * 加载广告
     *
     * @param activity     当前Activity
     * @param posId        广告位ID
     * @param num          期望请求的数量
     * @param widthDP      期望宽,单位DP,部分联盟需要额外配置
     * @param heightDP     期望高,单位DP,部分联盟需要额外配置
     * @param isVolumeOn   是否开启声音(默认为true)
     * @param loadListener 加载回调
     */
    public static void loadAd(Activity activity, String posId, int num, int widthDP, int heightDP, boolean isVolumeOn, ZJNativeExpressAdLoadListener loadListener);

}

提示

默认不需要传入宽高数值,SDK 会根据模板自适应渲染

如有特殊需求传入时,请联系我们固定素材的宽高比,并需要确保传入的数值单位为DP。且为有效值(不大于屏幕宽高),否则会渲染失败。

加载回调说明

方法说明
onError(int code, String msg)广告加载出错
code: 错误码
msg: 错误信息
onAdLoaded(List<ZJNativeExpressAd> adList)广告加载成功
adList: 广告列表

提示

Demo 工程中提供了简易的广告缓存策略示例,建议请求信息流列表时使用缓存,减少无效请求,提升广告的曝光率

展示信息流广告

在加载成功回调中获取到ZJNativeExpressAd对象后,可以配置交互回调,并展示广告

展示广告分为render方法手动渲染广告和showAd方法 SDK 渲染广告两种,其中

  • render(Activity)方法需要在onNativeExpressAdRenderSuccess回调中获取到adView,然后手动插入到容器中

  • showAd(Activity, ViewGroup)方法需要传入容器对象,SDK 会自动渲染并将adView插入到容器中,不会有onNativeExpressAdRenderSuccess回调

ZJNativeExpressAd 说明

方法说明
setInteractionListener(ZJNativeExpressAdInteractionListener interactionListener)配置交互回调
showAd(Activity activity, ViewGroup container)SDK展示广告
activity: 需要传入当前前台activity对象
container: 设置广告容器
showAd(Activity activity, ViewGroup container, ViewGroup.LayoutParams lp)SDK展示广告
activity: 需要传入当前前台activity对象
container: 设置广告容器
lp: 广告视图在容器内的LayoutParams
render(Activity activity)手动渲染广告
调用后在 onNativeExpressAdRenderSuccess 回调中会返回 adView
destroy()页面销毁时需要调用,回收资源,防止内存泄漏

交互回调说明

方法说明
onNativeExpressAdRenderSuccess(View adView)广告渲染成功
adView: 广告视图,需要手动添加到容器中,仅调用 render(Activity) 方法时回调
onNativeExpressAdShow()广告展示
onNativeExpressAdClick()广告点击
onNativeExpressAdClose()广告关闭
onNativeExpressAdShowError(int code, String msg)广告展示失败
code: 错误码
msg: 错误信息

信息流广告接入示例

单条信息流接入示例

// 加载广告
ZJNativeExpressAd.loadAd(this, posId, 1, new ZJNativeExpressAdLoadListener() {

    @Override
    public void onError(int code, @NonNull String msg) {
        Log.e("ZJNativeExpressAd", "信息流加载出错" + code + "-" + msg);                 
    }

    @Override
    public void onAdLoaded(@NonNull List<ZJNativeExpressAd> adList) {
        // 信息流广告加载成功,配置交互回调
        adList.get(0).setInteractionListener(NativeExpressActivity.this);
        // SDK 渲染
        adList.get(0).showAd(MainActivity.this, this.container);
    }

});
// 加载广告
ZJNativeExpressAd.loadAd(this, posId, 1, object : ZJNativeExpressAdLoadListener {
    
    override fun onError(code: Int, msg: String) {
        Log.e("ZJNativeExpressAd", "信息流加载出错$code-$msg")
    }

    override fun onAdLoaded(adList: List<ZJNativeExpressAd>) {
        // 信息流广告加载成功,配置交互回调
        adList[0].setInteractionListener(this@NativeExpressActivity)
        // SDK 渲染
        adList[0].showAd(this@MainActivity, this.container)
    }

})

插入到列表中

请求广告

private void loadMore() {
    int widthDP = 0;
    if (recycler.getWidth() > 0) {
        widthDP = UIUtil.getViewWidthDP(recycler);
        // Linear / Grid
        widthDP = isLinearLayout ? widthDP : widthDP / 2;
    }
    ZJNativeExpressAd.loadAd(this, DataCenter.PosId.NATIVE_EXPRESS, 3, widthDP, 0, new ZJNativeExpressAdLoadListener() {

        /**
         * 加载出错
         *
         * @param code 错误码
         * @param msg  错误信息
         */
        @Override
        public void onError(int code, @NonNull String msg) {
            if (recycler != null) {
                recycler.setLoadingError();
            }
            Toast.makeText(NativeExpressListActivity.this, "广告数据请求失败: " + code + "-" + msg, Toast.LENGTH_SHORT).show();
        }

        /**
         * 加载成功
         *
         * @param adList 广告列表
         */
        @Override
        public void onAdLoaded(@NonNull List<ZJNativeExpressAd> adList) {
            if (recycler == null) {
                // 当前的页面已经被销毁,后续不需要再进行其他操作
                return;
            }
            recycler.setLoadingFinish();
            if (adList.isEmpty()) {
                Toast.makeText(NativeExpressListActivity.this, "加载失败", Toast.LENGTH_SHORT).show();
                return;
            }
            List<ZJNativeExpressAd> newData = new ArrayList<>();
            int loadCount = 15; // 模拟正常数据
            for (int i = 0; i < loadCount; i++) {
                newData.add(null);
            }
            for (ZJNativeExpressAd ad : adList) {
                if (ad == null) {
                    continue;
                }
                // 插入到数据中
                newData.add(new Random().nextInt(newData.size() - 1), ad);
            }
            boolean isStop = adapter.addData(newData);
            if (isStop) {
                recycler.onStop();
            }
        }

    });
}
 private fun loadMore() {
    var widthDP = 0
    if (recycler.getWidth() > 0) {
        widthDP = UIUtil.getViewWidthDP(recycler)
        // Linear / Grid
        widthDP = if (isLinearLayout) widthDP else widthDP / 2
    }
    ZJNativeExpressAd.loadAd(
        this,
        DataCenter.PosId.NATIVE_EXPRESS,
        3,
        widthDP,
        0,
        object : ZJNativeExpressAdLoadListener {
                
            /**
             * 加载出错
             *
             * @param code 错误码
             * @param msg  错误信息
             */
            override fun onError(code: Int, msg: String) {
                if (recycler != null) {
                    recycler.setLoadingError()
                }
                Toast.makeText(
                    this@NativeExpressListActivity,
                    "广告数据请求失败: $code-$msg", Toast.LENGTH_SHORT
                ).show()
            }

            /**
             * 加载成功
             *
             * @param adList 广告列表
             */
            override fun onAdLoaded(adList: List<ZJNativeExpressAd?>) {
                if (recycler == null) {
                    // 当前的页面已经被销毁,后续不需要再进行其他操作
                    return
                }
                recycler.setLoadingFinish()
                if (adList.isEmpty()) {
                    Toast.makeText(
                        this@NativeExpressListActivity,
                        "加载失败",
                        Toast.LENGTH_SHORT
                    ).show()
                    return
                }
                val newData: MutableList<ZJNativeExpressAd?> = ArrayList()
                val loadCount = 15 // 模拟正常数据
                for (i in 0 until loadCount) {
                    newData.add(null)
                }
                for (ad in adList) {
                    if (ad == null) {
                        continue
                    }
                    // 插入到数据中
                    newData.add(Random().nextInt(newData.size - 1), ad)
                }
                val isStop: Boolean = adapter.addData(newData)
                if (isStop) {
                    recycler.onStop()
                }
            }
                
        })
}

在列表中渲染广告

public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    if (holder instanceof AdViewHolder) {
        ((AdViewHolder) holder).container.removeAllViews();
        ZJNativeExpressAd ad = adList.get(position);
        // 配置回调
        ad.setInteractionListener(new ZJNativeExpressAdInteractionListener() {

            /**
             * 展示失败
             *
             * @param code 错误码
             * @param msg  错误信息
             */
            @Override
            public void onNativeExpressAdShowError(int code, String msg) {
                Toast.makeText(activity, "展示出错: " + code + "-" + msg, Toast.LENGTH_SHORT).show();
            }

            /**
             * 渲染成功
             * 仅在调用render方法后回调,调用showAd方法时不会回调渲染成功
             * @param adView 广告的View,需要手动添加到容器中
             */
            @Override
            public void onNativeExpressAdRenderSuccess(View adView) {
                Toast.makeText(activity, "渲染成功", Toast.LENGTH_SHORT).show();
                if (adView != null) {
                    ((AdViewHolder) holder).container.addView(adView);
                }
            }

            /**
             * 展示成功
             */
            @Override
            public void onNativeExpressAdShow() {
                Toast.makeText(activity, "广告展示", Toast.LENGTH_SHORT).show();
            }

            /**
             * 点击
             */
            @Override
            public void onNativeExpressAdClick() {
                Toast.makeText(activity, "广告点击", Toast.LENGTH_SHORT).show();
            }

            /**
             * 关闭,部分广告不支持
             */
            @Override
            public void onNativeExpressAdClose() {
                Toast.makeText(activity, "广告关闭", Toast.LENGTH_SHORT).show();
                int pos = holder.getPosition();
                adList.remove(pos);
                notifyItemRemoved(pos);
            }

        });
        // 手动渲染广告
        ad.render(activity);
    }
}
fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    if (holder is AdViewHolder) {
        (holder as AdViewHolder).container.removeAllViews()
        val ad: ZJNativeExpressAd = adList.get(position)
        // 配置回调
        ad.setInteractionListener(object : ZJNativeExpressAdInteractionListener {

            /**
             * 展示失败
             *
             * @param code 错误码
             * @param msg  错误信息
             */
            override fun onNativeExpressAdShowError(code: Int, msg: String) {
                Toast.makeText(activity, "展示出错: $code-$msg", Toast.LENGTH_SHORT).show()
            }

            /**
             * 渲染成功
             * 仅在调用render方法后回调,调用showAd方法时不会回调渲染成功
             * @param adView 广告的View,需要手动添加到容器中
             */
            override fun onNativeExpressAdRenderSuccess(adView: View) {
                Toast.makeText(activity, "渲染成功", Toast.LENGTH_SHORT).show()
                if (adView != null) {
                    (holder as AdViewHolder).container.addView(adView)
                }
            }

            /**
             * 展示成功
             */
            override fun onNativeExpressAdShow() {
                Toast.makeText(activity, "广告展示", Toast.LENGTH_SHORT).show()
            }

            /**
             * 点击
             */
            override fun onNativeExpressAdClick() {
                Toast.makeText(activity, "广告点击", Toast.LENGTH_SHORT).show()
            }

            /**
             * 关闭,部分广告不支持
             */
            override fun onNativeExpressAdClose() {
                Toast.makeText(activity, "广告关闭", Toast.LENGTH_SHORT).show()
                val pos = holder.position
                adList.remove(pos)
                notifyItemRemoved(pos)
            }

        })
        // 手动渲染广告
        ad.render(activity)
    }
}