Help Center/Details/

自渲染信息流

简介

自渲染信息流: 为可自定义布局的信息流广告,包含大图、小图、组图和视频四种基本样式类型,电话拨打、应用下载、跳转到落地页、跳转到浏览器四种交互类型。标题和描述长度为6-26个字符

支持的广告尺寸:

  • 大图(宽高比:1.78的图片)
  • 视频(宽高比:1.78的视频)
  • 小图(宽高比:1.52的图片)
  • 组图(三张宽高比:1.52的图片)

权限

自渲染信息流广告: 已回收,不再提供创建

自渲染信息流请求方法

创建TTAdNative对象

//创建TTAdNative对象,createAdNative(Context context) context需要传入Activity对象
TTAdNative mTTAdNative = TTAdSdk.getAdManager().createAdNative(this);

创建广告请求类型参数AdSlot

AdSlot adSlot = new AdSlot.Builder()
        .setCodeId(codeId)
        .setImageAcceptedSize(640, 320) // 单位px
        .setAdCount(3) //请求广告数量为1到3条
        .setAdLoadType(PRELOAD)//推荐使用,用于标注此次的广告请求用途为预加载(当做缓存)还是实时加载,方便后续为开发者优化相关策略
        .build();

参数说明

参数 说明
setCodeId 平台创建的代码位ID 以9开头9位数字
setAdCount 请求数量1-3条,建议设置1
setImageAcceptedSize 设置请求广告的尺寸 单位:px
setAdLoadType() 用于标注此次的广告请求用途为预加载(当做缓存)还是实时加载,方便后续为开发者优化相关策略,传入参数值:
UNKNOWN//未知,默认值,开发者未传入,或当此次加载的广告用途未知时使用
PRELOAD//预加载,当此次加载的广告用途为预加载(当作缓存)时使用
LOAD//实时加载,当此次加载的广告用途为实时播放时使用

请求广告

调用 TTAdNative.loadFeedAd(AdSlot adSlot, FeedAdListener listener)方法异步加载信息流广告

mTTAdNative.loadFeedAd(adSlot, new TTAdNative.FeedAdListener() {
	//请求广告失败
    @Override
    public void onError(int code, String message) {

      }
    //请求广告成功
    @Override
    public void onFeedAdLoad(List<TTFeedAd> ads) {
       
     }
});

FeedAdListener说明

回调 说明
onError() 请求失败回调
onFeedAdLoad() 请求成功回调

TTFeedAd 接口说明

public interface TTFeedAd {

    /**
     * 获取穿山甲logo,图片大小:80*80
     *
     * @return bitmap对象
     */
    Bitmap getAdLogo();

    /**
     * 广告标题
     *
     * @return
     */
    String getTitle();

    /**
     * 广告描述
     *
     * @return
     */
    String getDescription();

    /**
     * 广告来源
     *
     * @return
     */
    String getSource();

    /**
     * 广告图标Image
     *
     * @return
     */
    TTImage getIcon();

    /**
     * 广告图片Image list
     *
     * @return
     */
    List<TTImage> getImageList();

    /**
     * 得到Feed广告交互类型
     *
     * @return 2:在浏览器打开网页,3:在app中打开,4:下载应用,5:拨打电话 其它:未知类型
     */
    int getInteractionType();

    /**
     * 得到Feed广告图片模式
     *
     * @return 3 大图 2小图 4 组图 5 视频 其它:未知类型
     */
    int getImageMode();
 
    /**
     * 获取负反馈选项数据
     *
     * @return
     */
    List<FilterWord> getFilterWords();

    /**
     * 获取“为什么看到此广告”的原因 - //3410版本新增
     */
    PersonalizationPrompt getPersonalizationPrompt();

    /**
     * 得到dislike dialog
     *
     * @param activity 建议传当前activity,否则可能会影响dislike对话框弹出
     * @return
     */
    TTAdDislike getDislikeDialog(Activity activity);

    /**
     * 自定义dislike dialog
     *
     * @param dialog 自定义dialog,需要由外部传入
     * @return
     */
    TTAdDislike getDislikeDialog(TTDislikeDialogAbstract dialog);

    /**
     * 获取下载状态控制器
     */
    DownloadStatusController getDownloadStatusController();

    /**
     * 注册可点击的View,click/show会在内部完成
     *
     * @param container 渲染广告最外层的ViewGroup
     * @param clickView 可点击的View
     */
    void registerViewForInteraction(@NonNull ViewGroup container, @NonNull View clickView, AdInteractionListener listener);

    /**
     * 注册可点击的View,click/show会在内部完成
     *
     * @param container     渲染广告最外层的ViewGroup
     * @param clickViews    可点击的View的列表
     * @param creativeViews 用于下载或者拨打电话的View
     */
    void registerViewForInteraction(@NonNull ViewGroup container, @NonNull List<View> clickViews, @Nullable List<View> creativeViews, AdInteractionListener listener);

    /**
     * 注册可点击的View,click/show会在内部完成,注册dislike按钮
     *
     * @param container     渲染广告最外层的ViewGroup
     * @param clickViews    可点击的View的列表
     * @param creativeViews 用于下载或者拨打电话的View
     * @param dislikeView   dislike按钮
     * @param listener      点击回调
     */
    void registerViewForInteraction(@NonNull ViewGroup container, @NonNull List<View> clickViews, @Nullable List<View> creativeViews, @Nullable View dislikeView, AdInteractionListener listener);

    /**
     * 设置下载监听器
     */
    void setDownloadListener(TTAppDownloadListener downloadListener);

    /**
     * 兼容下载类广告,使用activity申请权限
     */
    void setActivityForDownloadApp(@NonNull Activity activity);

    /**
     * 获取广告的view,如视频广告的view,在广告平台可设置是否自动播放、是否静音等。
     *
     * @return
     */
    View getAdView();

    /**
     * 信息流视频广告回调接口
     */
    interface VideoAdListener {

        /**
         * 视频广告加载成功
         *
         * @param ad
         */
        void onVideoLoad(TTFeedAd ad);

        /**
         * 视频广告加载失败(原生MediaPlayer内部提供的错误类型)
         * @param errorCode 错误类型:
         *                  MEDIA_ERROR_UNKNOWN
         *                  MEDIA_ERROR_SERVER_DIED
         *
         * @param extraCode 额外错误信息
         *                  MEDIA_ERROR_IO
         *                  MEDIA_ERROR_MALFORMED
         *                  MEDIA_ERROR_UNSUPPORTED
         *                  MEDIA_ERROR_TIMED_OUT
         *                  MEDIA_ERROR_SYSTEM
         *
         */
        void onVideoError(int errorCode, int extraCode);

        /**
         * 视频广告播放回调
         *
         * @param ad
         */
        void onVideoAdStartPlay(TTFeedAd ad);

        /**
         * 视频广告暂停回调
         *
         * @param ad
         */
        void onVideoAdPaused(TTFeedAd ad);

        /**
         * 视频广告续播
         *
         * @param ad
         */
        void onVideoAdContinuePlay(TTFeedAd ad);
    }


    void setVideoAdListener(VideoAdListener videoAdListener);

}

信息流广告行为监听

重要!!! AdInteractionListener涉及到广告计费,必须正确调用 convertView必须使用ViewGroup

在加载到信息流广告后,接入方需要注册在信息流广告中可以点击的View,即TTFeedAd.registerViewForInteraction()方法,以实现广告的功能交互及计。
包含图文点击区域的注册和附加创意按钮点击区域的注册。对于落地页广告,用户点击图文广告区域会跳转到相应的落地页,点击附加创意区域会进行电话拨打、应用下载等操作。

注意: 如果需要点击图文区域也能进行下载或者拨打电话动作,请将图文区域的view传入creativeViewList,详细代码如下

注册点击View示例的示例代码如下,该示例片段在Demo的BaseAdapter getView()方法中调用

/**
  * 注册可点击的View,click/show会在内部完成
  * @param container     渲染广告最外层的ViewGroup
  * @param clickViews    可点击的View的列表
  * @param creativeViews 用于下载或者拨打电话的View
  */
// 可以被点击的view, 也可以把convertView放进来意味整个item可被点击,点击会跳转到落地页
List<View> clickViewList = new ArrayList<View>();
clickViewList.add(convertView);
// 创意点击区域的view 点击根据不同的创意进行下载或拨打电话动作
//如果需要点击图文区域也能进行下载或者拨打电话动作,请将图文区域的view传入creativeViewList
List<View> creativeViewList = new ArrayList<View>();
creativeViewList.add(adViewHolder.mCreativeButton);
// 注册普通点击区域,创意点击区域。重要! 这个涉及到广告计费及交互,必须正确调用。convertView必须使用ViewGroup。
ad.registerViewForInteraction((ViewGroup) convertView, images, clickViewList, creativeViewList,adViewHolder.mDislike,new TTNativeAd.AdInteractionListener() {

    // 点击普通区域的回调
    @Override
    public void onAdClicked(View view, TTNativeAd ad) {
       
    }
    
    // 点击创意区域的回调
    @Override
    public void onAdCreativeClick(View view, TTNativeAd ad) {
       
    }
    
    // 广告曝光展示的回调
    @Override
    public void onAdShow(TTNativeAd ad) {
       
    }
});

AdInteractionListener说明

回调 说明
onAdClicked() 点击普通区域回调
onAdCreativeClick() 点击创意区域回调
onAdShow() 广告展示回调

信息流视频回调接口

ad.setVideoAdListener(new TTFeedAd.VideoAdListener() {

    //视频加载成功
    @Override
    public void onVideoLoad(TTFeedAd ad) {

    }
    
    //视频加载失败
    @Override
    public void onVideoError(int errorCode, int extraCode) {

    }

    //视频开始播放
    @Override
    public void onVideoAdStartPlay(TTFeedAd ad) {

    }

    //视频暂停播放
    @Override
    public void onVideoAdPaused(TTFeedAd ad) {

    }

    //视频继续播放
    @Override
    public void onVideoAdContinuePlay(TTFeedAd ad) {

    }
    
    //视频播放进度
    @Override
    public void onProgressUpdate(long current, long duration) {
      
    }
    
    //视频完成播放
    @Override
    public void onVideoAdComplete(TTFeedAd ad) {
       
    }
});

VideoAdListener说明

回调 说明
onVideoLoad() 视频加载成功回调
onVideoError() 视频加载失败回调
onVideoAdStartPlay() 视频开始播放回调
onVideoAdPaused() 视频广告暂停回调
onVideoAdContinuePlay() 视频广告需播回调
onProgressUpdate() 视频播放进度回调
onVideoAdComplete() 视频播放完成回调

App下载状态控制器

当返回的广告为应用下载类型,即ad.getInteractionType() == TTAdConstant.INTERACTION_TYPE_DOWNLOAD 时,接入方可调用如下示例代码接入 Feed 广告下载控制器:

private void bindDownLoadStatusController(AdViewHolder adViewHolder, final TTFeedAd ad) {
    final DownloadStatusController controller = ad.getDownloadStatusController();
    adViewHolder.mStopButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (controller != null) {
                controller.changeDownloadStatus();
                Toast.makeText(mContext, "改变下载状态", Toast.LENGTH_SHORT).show();
                Log.d(TAG, "改变下载状态");
            }
        }
        });
    adViewHolder.mRemoveButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (controller != null) {
                controller.cancelDownload();
                Toast.makeText(mContext, "取消下载", Toast.LENGTH_SHORT).show();
                Log.d(TAG, "取消下载");
            }
        }
    });
}

广告下载事件监听

//下载监听设置
TTAppDownloadListener downloadListener = new TTAppDownloadListener() {
    //未开始下载
    @Override
    public void onIdle() {

     }
    /**
     * 下载中回调
     * @param totalBytes 安装包总字节数 -1 :未知
     * @param currBytes 当前已下载的字节数
     * @param fileName 下载文件名称
     * @param appName 当前下载的APP名
     */
    @SuppressLint("SetTextI18n")
    @Override
    public void onDownloadActive(long totalBytes, long currBytes, String fileName, String appName) {
       
    }
    
     /**
     * 下载暂停回调
     * @param totalBytes 安装包总字节数 -1 :未知
     * @param currBytes 当前已下载的字节数
     * @param fileName 下载文件名称
     * @param appName 当前下载的APP名
     */
    @SuppressLint("SetTextI18n")
    @Override
    public void onDownloadPaused(long totalBytes, long currBytes, String fileName, String appName) {
      
    }
    
     /**
     * 下载失败回调
     * @param totalBytes 安装包总字节数 -1 :未知
     * @param currBytes 当前已下载的字节数
     * @param fileName 下载文件名称
     * @param appName 当前下载的APP名
     */
    @Override
    public void onDownloadFailed(long totalBytes, long currBytes, String fileName, String appName) {
       
    }

     /**
     * 安装完成回调
     * @param fileName 下载文件名称
     * @param appName 当前下载的APP名
     */
    @Override
    public void onDownloadFinished(long totalBytes, String fileName, String appName) {

    }
    /**
     * 下载完成回调
     * @param totalBytes 安装包总字节数 -1 :未知
     * @param fileName 下载文件名称
     * @param appName 当前下载的APP名
     */
    @Override
    public void onInstalled(String fileName, String appName) {
       
    }
   
};

TTAppDownloadListener说明

回调 说明
onIdle() 绑定下载监听回调
onDownloadActive() 下载中回调
onDownloadPaused() 下载暂停回调
onDownloadFailed() 下载失败回调
onDownloadFinished() 下载完成回调
onInstalled() 安装完成回调

信息流广告接入Dislike

在获得TTFeedAd后,调用TTFeedAd.getDislikeDialog()获取TTAdDislike对象,然后为该对象设置用户选择结果回调。

以下逻辑为穿山甲3500版本SDK中逻辑,3500以下版本SDK开发者可参考对应demo进行集成

private void bindDislikeAction(View dislike, final TTFeedAd ad, boolean isCustomDislike) {
        if (isCustomDislike) {
            // 使用自定义Dislike,用户选择"为什么看到此广告",开发者需要执行startPersonalizePromptActivity逻辑进行跳转
            final DislikeInfo dislikeInfo = ad.getDislikeInfo();
            if (dislikeInfo == null || dislikeInfo.getFilterWords() == null || dislikeInfo.getFilterWords().isEmpty()) {
                return;
            }
            final DislikeDialog dislikeDialog = new DislikeDialog(this, dislikeInfo);
            dislikeDialog.setOnPersonalizationPromptClick(new DislikeDialog.OnPersonalizationPromptClick() {
                @Override
                public void onClick(PersonalizationPrompt personalizationPrompt) {
                    TToast.show(FeedVideoActivity.this, "点击了为什么看到此广告");
                }
            });
            ad.setDislikeDialog(dislikeDialog);
            dislike.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dislikeDialog.show();
                }
            });
        } else {
            // 使用默认Dislike
            final TTAdDislike ttAdDislike = ad.getDislikeDialog(this);
            dislike.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (ttAdDislike != null)
                        ttAdDislike.showDislikeDialog();
                }
            });
        }
    }

DislikeInteractionCallback

回调 说明
onItemClick() 自定义样式情况下用户点击filterWord回调
onClick() 自定义样式情况下用户点击了”为什么看到此广告“
onSelected() 默认dislike样式,点击filterWord回调。开发者可以在此回调中移除广告
onCancel() 默认dislike样式,点击取消回调
onShow() 默认dislike样式,dislike弹窗展示回到
onRefuse() 默认dislike样式,用户重复点击dislike按钮回调,3600版本废除

销毁广告对象

在Activity的onDestroy回调方法中销毁广告view

//在Activity的onDestroy方法中清空广告对象
@Override
protected void onDestroy() {
    super.onDestroy();
    if (ad != null) {
        ad = null;
    }
}

参考Demo

请参考穿山甲Demo以及/res/layout/下的 listitem_ad_pic.xml 文件。
自渲染渲染信息流详细代码使用ListView请参考Demo中FeedListActivity
使用RecyclerView可参看Demo中FeedRecyclerActivity

自渲染信息流注意点:

1、AdInteractionListener涉及到广告计费,必须正确调用 convertView必须使用ViewGroup

2、TTAdDislike支持自渲染信息流广告、自渲染Banner广告

Did the content solve your problem?
Contact us