Android UI SDK对接文档

注:新接入的应用会有接口请求限制,请在对接完成之后务必联系相关人员进行验收,验收通过之后会去掉相关的限制

ReleaseNote

版本时间修改内容
3.3.3.122021年7月10日优化播放器
3.3.3.162021年7月30日1.播放器支持exo_player2.播放器优化,支持手势调节声音&进度,支持变速播放3.移除敏感权限的获取,新增隐私合规接口``4.修复bug
3.3.3.262021年8月17日1.优化对支持exo_player2.优化广告效果
3.4.0.22021年10月15日1.广告新增频次控制2.播放器优化3.修复已知bug
3.4.2.62021年11月22日1.升级播放器核心,请注意依赖库的改变
3.4.2.82022年1月10日1.增加播放器统计2.增加信息流和小视频暂停和继续播放方法3.增加视频来源显示样式
3.4.4.22022年2月18日1.优化sdk结构 2.删除广告模块
3.4.4.42022年3月3日1.优化UI2.新增UI相关配置3.增加小视频频道获取和设置4.升级播放器tv.yilan.media.xxx:1.1.1详见[2.1](#add_lib)5.增加登陆状态回调,详见7.3``6.增加主题配置,相见5.1
3.4.4.82022年4月1日1.优化播放器性能2.增加新页面,抖音样式的关注页[5.2](#dou_yin_follow)3.增加对自定义内容的支持,详见5.4
3.5.5.42022年10月21日1. 优化了一个播放回调的问题``2. 修复了一个偶先的bug

一 SDK 概要

UISDK为移动应用提供内容分发功能,为客户提供较为简洁的API接口,方便第三方应用快速的集成并实现内容分发功能。

UISDK(以下简称SDK)提供的功能如下:

  • 快速集成频道Feed流列表
  • 快速集成小视频列表
  • 快速集成播放页
  • 在Feed流和小视频流中插入自定义内容

二 工程配置

接入之前请首先再一览平台为您的应用创建好accessKeyaccessToken

添加依赖

开发者可以使用Gradle方式导入一览SDK

步骤一:添加仓库

project级别的build.gradle文件中添加Maven的引用,如下:

allprojects {
    repositories {
        google()
        jcenter()
        //添加一览maven地址
        maven {
            url 'http://nexus.1lan.tv/repository/maven-releases/'
        }
    }
}

步骤二:添加依赖 <a id="add_lib"></a>

在主modulebuild.gradle文件添加SDK依赖

dependencies {
    //添加SDK主要依赖
    implementation "com.yilan.sdk:ui:3.4.4.4"
    //添加SDK所需播放器依赖
    implementation 'tv.yilan.media:player-java:1.1.1'
    implementation 'tv.yilan.media:player-armv7a:1.1.1'
    //添加一览SDK其他所需依赖
    implementation 'com.squareup.okhttp3:okhttp:3.11.0'
    implementation 'com.google.code.gson:gson:2.8.5'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:support-v4:28.0.0'
}

播放器依赖添加说明:

播放器还有其他平台架构的库文件,开发者可以针对自己目前工程中的配置,按需添加

implementation 'tv.yilan.media:player-armv5:1.1.1'
implementation 'tv.yilan.media:player-arm64:1.1.1'
implementation 'tv.yilan.media:player-x86:1.1.1'
implementation 'tv.yilan.media:player-x86_64:1.1.1'

对应关系如下

平台对应依赖库
armeabiimplementation 'tv.yilan.media:player-armv5:1.1.1'
armeabi-v7aimplementation 'tv.yilan.media:player-armv7a:1.1.1'
arm64-v8aimplementation 'tv.yilan.media:player-arm64:1.1.1'
x86implementation 'tv.yilan.media:player-x86:1.1.1'
x86_64implementation 'tv.yilan.media:player-x86_64:1.1.1'

代码混淆

默认情况下不需要您关注SDK混淆的配置,相关的proguard配置位于SDK AAR文件中**"/proguard.txt",您可以通过check混淆后的您的mapping文件来判断这些配置是否生效。例如,您可以check包名com.yilan.sdk**下类的public和protected成员是否被keep来验证SDK AAR文件中的proguard配置被正确应用。

三 SDK初始化配置

初始化配置

开发者需要在 Application#onCreate()方法中调用以下代码来初始化sdk。

YLUIInit.getInstance()
  .setApplication(this)
  .setAccessKey("")//设置accesskey
  .setAccessToken("")//设置token
  .logEnable(true)//日志开关,默认关闭
  .aaid("")//如工程中集成了“移动安全联盟”,请配置相关id
  .oaid("")//如工程中集成了“移动安全联盟”,请配置相关id
  .vaid("")//如工程中集成了“移动安全联盟”,请配置相关id
  .build();

方法及参数说明如下:

方法名方法说明是否为必须参数
setApplication(Application context)设置Context
setAccessToken(String token)设置token,由一览提供是,注册后台获取
setAccessKey(String key)设置key,由一览提供是,注册后台获取
logEnable(boolean enable)日志开关,默认关闭,用于调试
aaid(String aaid)如工程中集成了“移动安全联盟”,请配置相关id
oaid(String oaid)如工程中集成了“移动安全联盟”,请配置相关id
vaid(String vaid)如工程中集成了“移动安全联盟”,请配置相关id

**注:**我们SDK中并没有集成OAID,只是提供了配置接口,它并不是SDK初始化必须集成项,但是我们建议集成OAID。OAID集成说明详见:移动安全联盟在新窗口打开

示例demo工程接入

ylyun-android-sdk是接入一览SDK的示例工程,它可以使用AndroidStudio来打开。

  1. 将项目clone到本地
  2. 用Android Studio打开clone到本地的工程
  3. 在App中设置在一览后台申请好的accesskey和token

工程地址:https://github.com/yilanyun/ylyun-android-sdk

四 隐私合规检测说明

2021年5月1日起,由国家互联网信息办公室、工业和信息化部、公安部、国家市场监督管理总局联合制定了《常见类型移动互联网应用程序必要个人信息范围规定》(简称“App必要个人信息范围规定”)已正式施行。“App必要个人信息范围规定”不仅明确常见39种类型的App必要个人信息范围,而且明确移动互联网应用程序(App)运营者不得因用户不同意收集非必要个人信息,而拒绝用户使用App基本功能服务。为了避免App被下架,请您务必做好两件事:首先将SDK升级至满足监管要求的最新版本,再按下文合规解法进行配置。

a. 对于信息流SDK可选申请的系统权限,您可以参考“隐私政策”文档,详细了解相关权限与各业务功能的关系及其申请时机,因相关权限的不申请将会对其对应的功能造成影响,您可以结合业务实际需要进行合理配置。

b. 请务必在用户同意您App中的隐私政策后,再进行信息流SDK的初始化。用户同意隐私政策之前,避免动态申请涉及用户个人信息的敏感设备权限;用户同意隐私政策前,您应避免私自采集和上报个人信息。当您的App未向用户提供服务时,例如App在后台运行时,请勿请求信息流SDK的相关服务。

c. 开发者在App集成信息流SDK后,信息流SDK的正常运行会收集必要的最终用户信息用于展示内容及向最终用户推荐可能感兴趣的内容。 请开发者根据集成信息流SDK的实际情况,在您App的隐私政策中,对信息流SDK名称、公司名称、处理个人信息种类及目的、采集方式、隐私政策链接等内容进行披露。

d. 您应确保在App安装后首次冷启动时,在用户阅读您的**《隐私政策》并取得用户授权之后,调用提交隐私协议函数YLUIInit.submitPolicyGrantResult提交隐私协议。反之,如果用户不同意《隐私政策》**授权,则不能调用YLUIInit.submitPolicyGrantResult提交隐私协议。

五 UI功能接入

1.UI样式配置 <a id="ui_config"></a>

YLUIConfig.getInstance()
    // ------ 全局配置 -------
           //全局,设置视频画面适配模式 SURFACE_MODEL_CROP(默认值):裁剪模式,SURFACE_MODEL_FIT:等比拉伸
           .setVideoSurfaceModel(YLPlayerConfig.SURFACE_MODEL_CROP)
           // 全局:视频来源设置,TEXT:文字形式,LOGO:logo形式, 默认值:TEXT
           .setVideoSource(YLUIConfig.TEXT)
  				 //设置主题颜色,默认白色(WhiteTheme:白色主题,BlackTheme:黑色主题)
  				 .setTheme(new WhiteTheme());
           .followAvailable(true)// 全局,是否显示关注 默认值:true

 		// ------ 横视频信息流配置 -------
          //播放模式,STYLE_FEED_PLAY(默认值):当前页面播放,STYLE_NATIVE:跳转到播放页播放,STYLE_WEB:跳转到web页面播放
          .feedPlayStyle(FeedConfig.STYLE_FEED_PLAY)
          //设置是否自动播放视频,仅在当前页面播放时有效(STYLE_FEED_PLAY)
          .feedPlayAuto(false)
          //设置频道标题的字体大小 默认18,单位dp
          .setFeedTitleTextSize(18)
          //设置频道标题是否显示下划线 默认值:true
          .setFeedUseIndicator(true)
          //设置频道标题被选中颜色,默认值 #5698F5
          .setFeedTitleSelectColor(R.color.color_festival)
          //设置频道标题被未选中颜色,默认值 #666666
          .setFeedTitleUnSelectColor(R.color.color_dark)
          //设置每次刷新内容后,是否有toast提示,默认值:false
          .recommendHintEnable(true) //feed信息流加载内容后的toast 提示开关,默认不显示
          //设置评论的样式 SHOW_COMMENT_ALL:即可查看,也可发布评论(需要登陆),SHOW_COMMENT_LIST:只能查看评论,不能发布评论,DISMISS_COMMENT:不显示评论
          .videoComment(CommentConfig.CommentType.SHOW_COMMENT_ALL)
          //设置是否显示点赞按钮 默认值:true
          .videoLikeShow(true)
          //设置是否显示分享按钮,默认值:true
          .videoShareShow(true)
          //在登陆后,设置是否显示单独的关注频道,默认值:true
          .followChannelAvailable(true)
          //设置头像是否可点击,默认值:true
          .feedAvatarClickable(true)
          //是否展示头像,默认值:true
          .feedShowAvatar(true)
          //设置下拉刷新是否可用,默认值:true 可用
          .feedSwipeRefreshEnable(true)
  
		// ------ 小视频信息流配置 -------
         //设置小视频页面样式:STYLE_RIGHT(默认值):交互按钮在右侧,STYLE_BOTTOM:交互按钮在底部
         .setLittleStyle(LittleStyle.STYLE_RIGHT)
         //设置小视频+关注页面(YLLittleChannelFragment)频道字号,默认值(19)
         .setLittleTitleTextSize(19)
         //设置频道被选中时的颜色。默认值:#ffffff
         .setLittleTitleSelectColor(R.color.white)
         //设置频道未被选中时的颜色。默认值:#bbffffff
         .setLittleTitleUnSelectColor(R.color.yl_color_bf)
         //设置点赞是否显示,默认值:true
         .littleLikeShow(true)
         //设置分享是否显示,默认值:true
         .littleShareShow(true)
         //第一次展示时是否显示新手引导,默认值:true
         .littleShowGuide(true)
         //设置是否暂时相关视频,默认值:true
         .littleShowRelate(true)
         //是否展示头像,默认值:true
         .littleShowAvatar(true)
         //设置评论的样式 SHOW_COMMENT_ALL:即可查看,也可发布评论(需要登陆),SHOW_COMMENT_LIST:只能查看评论,不能发布评论,DISMISS_COMMENT:不显示评论
         .littleComment(CommentConfig.CommentType.SHOW_COMMENT_ALL)
         //设置下拉刷新是否可用,默认值:true
         .littleRefreshEnable(true)
         //设置小视频ui元素距离底部的偏移量,默认值:0
         .setLittleTitleBottom(0)
         //设置小视频底部热点距离底部的偏移量,默认值:0
         .setLittleHotBarBottom(0)

		//------小视频快手样式下的配置
         //设置快手样式下的页面样式,默认STYLE_GRID,等宽,STYLE_STAGGER:非等宽瀑布流
         .setKsStyle(KSStyle.STYLE_GRID)

设置评论相关参数说明:

方法名方法说明
CommentConfig设置播放页评论显示类,目前支持以下3种:CommentType.SHOW_COMMENT_ALL //显示评论列表,并支持评论_CommentType.SHOW_COMMENT_LIST //只显示评论列表,不支持评论``CommentType.DISMISS_COMMENT //隐藏评论列表

2.小视频样式接入

类抖音样式

//1.构建小视频的Fragment对象
YLLittleVideoFragment fragment = YLLittleVideoFragment.newInstance();
//2可传入频道id 来定制内容
LittlePageConfig config = LittlePageConfig.DefaultConfig()
  .setChannelID("channleID").setLittleType(YLLittleType.LITTLE_VIDEO);
YLLittleVideoFragment fragment = YLLittleVideoFragment.newInstance(config);

//将Fragment添加到布局中
manager.beginTransaction().replace(R.id.content, fragment).commitAllowingStateLoss();

特别注意:

添加YLLittleVideoFragment或者KSLittleVideoFragmentActivity必须在 AndroidManifest.xml文件中添加以下属性:

android:configChanges="keyboard|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"

YLLittleVideoFragment会自动感知外部的显示和隐藏,并暂停和继续播放视频,如需手动暂停当前视频播放和继续播放,调用如下方法

fragment.pauseVideo();
fragment.resumeVideo();

类抖音样式+关注 <a id="dou_yin_follow"></a>

//构建小视频的Fragment对象
YLLittleChannelFragment fragment = YLLittleChannelFragment.newInstance();
//将Fragment添加到布局中
manager.beginTransaction().replace(R.id.content, fragment).commitAllowingStateLoss();

关注页面(横版信息流样式/抖音样式)

//构建横版信息流样式的关注页面
FollowFragment fragment = new FollowFragment();
//将Fragment添加到布局中
manager.beginTransaction().replace(R.id.content, fragment).commitAllowingStateLoss();
//创建 抖音样式的关注页面
LittlePageConfig c = LittlePageConfig.DefaultConfig()
  .setShowTopContainer(false).setLittleType(YLLittleType.FOLLOW);
YLLittleVideoFragment follow = YLLittleVideoFragment.newInstance(c);
//将Fragment添加到布局中
manager.beginTransaction().replace(R.id.content, follow).commitAllowingStateLoss();

类快手样式

//构建快手样式的Fragment
KSLittleVideoFragment fragment = KSLittleVideoFragment.newInstance();
//将Fragment添加到布局中
manager.beginTransaction().replace(R.id.short_content, fragment).commitAllowingStateLoss();

3.短视频Feed流页面

Feed流默认配置(带频道导航栏)

//构建频道页的Fragment
ChannelFragment fragment = new ChannelFragment();
//将Fragment添加到布局中
FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction().replace(R.id.content, fragment).commitAllowingStateLoss();

Feed流单频道(不带频道导航栏)

接入方可以使用自己的导航栏,内容是YLFeedFragment。

//构建Channel对象,并设置频道id
Channel channel = new Channel();
channel.setId(String id);
//构建单频道Fragment,并传入channel对象
YLFeedFragment fragment = YLFeedFragment.newInstance(channel);

如需要对界面进行刷新,调用如下方法(多频道与单频道Fragment都适用)

fragment.refresh();

YLFeedFragment会自动感知外部的显示和隐藏,并暂停和继续播放视频,如需手动暂停当前视频播放和继续播放,调用如下方法

fragment.pauseVideo();
fragment.resumeVideo();

特别注意:

添加ChannelFragment或者YLFeedFragmentActivity必须在 AndroidManifest.xml文件中添加以下属性:

android:configChanges="keyboard|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"

<!--例如:将ChannelFragment添加到DemoActivity中,那么DemoActivity的configChanges属性中必须加入orientation|screenSize 配置,否则再全屏播放可能会发生异常-->
<activity
    android:name=".demo.DemoActivity"
    android:configChanges="keyboard|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"/>

4.自定义内容 <a id="custum_content"></a>

Feed流和抖音样式均可插入自定义的内容,如图文,广告等

1.在feed流中插入

//通过FeedConfig来注册配置接口,范型填入自己需要的类型
FeedConfig.getInstance().setExtraCallback(new ExtraDataCallback<ExtraData>() {
            @Override
            public List<ExtraData> getData() {
              	// 在此方法中返回自定义类型的数据,信息流会根据下面的规则
                ArrayList<ExtraData> list = new ArrayList();
                list.add(new ExtraData());
                return list;
            }

            @Override
            public int getInterval() {
              	// 间隔数,1表示每隔一个视频会插入一条自定义的内容
                return 1;
            }

            @Override
            public int getStartIndex() {
              	// 表示从列表的第几个位置开始插入自定义内容
                return 1;
            }

            @Override
            public BaseViewHolder<ExtraData> createViewHolder(Context context, ViewGroup parent) {
              	//返回一个BaseViewHolder类型的ExtraViewHolder,ExtraViewHolder
                return new ExtraViewHolder(context,parent);
            }
        });

2.抖音视频流中插入自定义内容

//通过LittleVideoConfig来注册配置接口,范型填入自己需要的类型
LittleVideoConfig.getInstance().setExtraCallback(new ExtraDataCallback<ExtraData>() {
            @Override
            public List<ExtraData> getData() {
              	// 在此方法中返回自定义类型的数据,信息流会根据下面的规则
                ArrayList<ExtraData> list = new ArrayList();
                list.add(new ExtraData());
                return list;
            }

            @Override
            public int getInterval() {
              	// 间隔数,1表示每隔一个视频会插入一条自定义的内容
                return 1;
            }

            @Override
            public int getStartIndex() {
              	// 表示从列表的第几个位置开始插入自定义内容
                return 1;
            }

            @Override
            public BaseViewHolder<ExtraData> createViewHolder(Context context, ViewGroup parent) {
              	//返回一个BaseViewHolder类型的ExtraViewHolder,ExtraViewHolder
                return new ExtraViewHolder(context,parent);
            }
        });

3.自定义ViewHolder

public class ExtraViewHolder extends BaseViewHolder<ExtraData> implements IExtraHolder {

    public ExtraViewHolder(Context context, ViewGroup parent) {
      	//在构造方法中填入参数和自定义的布局文件
        super(context, parent, R.layout.feed_item);
    }

    private TextView textView;

    @Override
    protected void initView() {
      	// 在此方法中初始化 view
        textView = itemView.findViewById(R.id.text_content);
    }

    @Override
    public void onBindViewHolder(ExtraData extra) {
      	//在此处绑定数据,此方法会在RecycleView 的 Adapter 的 onBindViewHolder方法中调用
        textView.setText("我是自定义内容");

    }

    @Override
    public void onResume() {
				//如果此item 在屏幕中,则在页面 onResume 被时调用
    }

    @Override
    public void onPause() {
				//如果此item 在屏幕中,则在页面 onPause 被时调用
    }

    @Override
    public void onDestroy() {
				//页面被onDestroy销毁时 所有被创建的viewholder 都会被调用,可在此处做释放资源的操作
    }

    @Override
    public void onItemSelected(boolean isSelected) {
				// 在抖音样式下,当item被选中时(被滑到屏幕中间)会被调用
    }
}

5.混合信息流页面

混合信息流(单排)

//构建混合信息流(单排)样式的Fragment
HybridFeedFragment fragment = HybridFeedFragment.newInstance();
//将Fragment添加到布局中
manager.beginTransaction().replace(R.id.short_content, fragment).commitAllowingStateLoss();

混合信息流(双排)

//构建混合信息流(双排)样式的Fragment
HybridMultiFeedFragment fragment = HybridMultiFeedFragment.newInstance();
//将Fragment添加到布局中
manager.beginTransaction().replace(R.id.short_content, fragment).commitAllowingStateLoss();

6.局部信息流

局部信息流提供了feed单卡片样式,小视频单卡片样式,及小视频多卡片样式,丰富了信息流的展示,以满足多样化的信息流展示需求。具体样式参考如下

注:使用局部信息流功能需将SDK升级至3.2.0.0或以上版本

展示样式:

类型截图
feed单卡片信息流<img src="http://git.1lan.tv/Avengers/Collector/raw/master/zh/feed/client/android/resource/image-20201209142454360.png" style="zoom:45%;" />
小视频单卡片信息流<img src="http://git.1lan.tv/Avengers/Collector/raw/master/zh/feed/client/android/resource/image-20201209152547065.png" style="zoom:45%;" />
小视频多卡片样式<img src="http://git.1lan.tv/Avengers/Collector/raw/master/zh/feed/client/android/resource/image-20201209145502643.png" style="zoom:45%;" />

feed单卡片信息流

注:参考一览云demo的StreamTestActivity

默认获取一个feed信息流并展示

//1.获取feed流单卡片操作接口
FeedStream feedStream = StreamManager.create().getFeedStream();
//2.直接请求并展,传入的viewGroup容器大小只控制宽度即可,高度自适应
feedStream.load(context).into(viewGroup);
//支持返回渲染好的view,自行处理view的添加操作
View view = feedStream.load(context).getView();

对请求进行简单配置,然后请求并展示

//1.获取feed流单卡片操作接口
FeedStream feedStream = StreamManager.create().getFeedStream();
//2.数据请求配置
StreamOption.Builder builder = new StreamOption.Builder()
                .videoNum(4)//一次请求数据的条数
                .requestMode(RequestMode.ALWAYS_NEW)//数据请求的模式,具体含义见下方说明
                .dataObtainMode(DataObtainMode.LOOP);//多条数据时,填充单卡片数据的数据选择模式
feedStream.option(builder.build()).load(context).into(viewGroup);
//支持返回渲染好的view,自行处理view的添加操作
View view = feedStream.option(builder.build()).load(context).getView();

数据请求模式RequestMode说明

数据请求模式说明
RequestMode.FIXED默认为FIXED(固定数据)模式,此模式下请求一次数据后,数据的填充用已请求的数据,不在请求新的数据。
RequestMode.ALWAYS_NEW总是最新的,每次调用load都会返回新的数据填充view

卡片获取数据模式DataObtainMode说明

数据获取模式说明
DataObtainMode.DEFAULT默认返回数据的第一条
DataObtainMode.LOOP循环返回
DataObtainMode.RANDOM随机返回

小视频单卡片信息流

注:参考一览云demo的StreamTestActivity

默认获取一个小视频信息流并展示

//1.获取小视频信息流单卡片操作接口
LittleStream littleStream = StreamManager.create().getLittleStream();
//2.直接请求并展,传入的viewGroup容器大小只控制宽度即可,高度自适应
littleStream.load(context).into(viewGroup);
//支持返回渲染好的view,自行处理view的添加操作
View view = littleStream.load(context).getView();

对请求进行简单配置,然后请求并展示

//1.获取小视频信息流单卡片操作接口
LittleStream littleStream = StreamManager.create().getLittleStream();
//2.数据请求配置
StreamOption.Builder builder = new StreamOption.Builder()
                .videoNum(4)//一次请求数据的条数
                .requestMode(RequestMode.ALWAYS_NEW)//数据请求的模式,具体含义见下方说明
                .dataObtainMode(DataObtainMode.LOOP);//多条数据时,填充单卡片数据的数据选择模式
littleStream.option(builder.build()).load(context).into(viewGroup);
//支持返回渲染好的view,自行处理view的添加操作
View view = littleStream.option(builder.build()).load(context).getView();

小视频多卡片样式

注:参考一览云demo的StreamTestActivity

获取小视频多卡片信息流并展示

//1.获取小视频多卡片信息流操作接口
LittleStream cardStream = StreamManager.create().getCardStream();
//2.直接请求并展
littleStream.load(context).into(viewGroup);
//支持返回渲染好的view,自行处理view的添加操作
View view = littleStream.load(context).getView();

信息流数据接口 ( IYLDataRequest )

接入方可自行请求信息流数据接口,自行渲染展示,或者调用局部信息流将返回的数据填充展示

接口示例:

/**
* @param type 必填——数据类型0:短视频 1:小视频
* @param num 可选——返回数据数量,范围1-4
* @param channelId 可选——渠道id
* @param callBack
*/
public void getSubFeed(int type, int num, String channelId, YLCallBack<MediaList> callBack) {}

请求示例:

IYLDataRequest.REQUEST.getSubFeed()

调用局部信息流接口,并传入请求数据展示示例:

//1.获取feed流单卡片操作接口
FeedStream feedStream = StreamManager.create().getFeedStream();
//2.发起请求
 IYLDataRequest.instance().getSubFeed(type, num, channelId, new YLCallBack<MediaList>() {
            @Override
            public void onSuccess(MediaList data) {
                if (data != null && data.getData() != null && !data.getData().isEmpty()) {
                    infos.addAll(data.getData());
                    //3.传入数据并展,传入的viewGroup容器大小只控制宽度即可,高度自适应
                    feedStream.load(context,data.getData()).into(viewGroup);
                }
            }

            @Override
            public void onError(int httpCode, String ylCode, String msg) {

            }
        });

六 数据接口

1.接口列表

sdk提供部分接口,以便于您实现更多功能以下接口可通过 IYLDataRequest.REQUEST调用相应数据接口

/**
 * 请求频道列表 (频道可在一览后台设置)
 *
 * @param callback
 * @param videoType; 视频类型 1 横版 2 竖版
 */
void getChannels(int videoType, YLCallBack<ChannelList> callback);


/**
 * 获取小视频推荐视频
 *
 * @param loadType  0-上滑刷新 1-下滑刷新 2-首次刷新
 * @param channelID 频道列表,默认传"",通过getChannels获取频道id
 */
void ugcFeed(String channelID, int loadType, YLCallBack<MediaList> callBack);

/**
 * 实时热点视频列表
 *
 * @param params   参数集合,参考下表
 * @param callback
 */
void hotVideo(Map<String, String> params, YLCallBack<MediaList> callback);

hotVideo接口参数解释:params为一个String类型的Map,里面参数说明如下

参数名称类型默认值是否必传说明
begin_timeString指定区间开始时间戳, 时间戳单位为秒,默认不传,代表获取最新的数据
end_timeString指定区间结束时间戳, 时间戳单位为秒,默认不传,代表获取最新的数据
typeString11为横版视频,2为竖版视频
keyString内容池名称,默认不传
pgString1需要翻页时传入的页数
szString10每次返回视频的个数

举例:

//获取频道列表举例
IYLDataRequest.REQUEST.getChannels.getChannels(1, YLCallBack<ChannelList> callback);

2.视频展现上报

为了更好的服务用户,精准推进,我们建议您在合适的时机对视频的曝光和点击进行上报

//曝光上报:mediaInfo:是每个视频的bean,position:视频在列表中的位置,如果没有传0
ReporterEngine.instance().reportVideoShow(mediaInfo,position);
//点击播放上报:
ReporterEngine.instance().reportVideoClick(mediaInfo);

六 社交&数据接口

社交功能主要包括评论、点赞、分享等,未登录用户只能进行浏览,不能进行参与。如发表评论、删除评论等等。

1 用户登陆、退出

YLUser.getInstance().login(nick, avatar, phone, userId);

YLUser为单例使用,常用的方法如下。

方法名方法说明备注
void login(String nickname, String avatar, String phone, String userId)nickname:用户昵称。必传。avatar:用户头像。phone:用户手机号。必传``userId:用户id。必传调用时机:在APP启动和用户登陆后
void logout()退出登录调用时机:在用户主动退出登录后
String getToken()获取用户token在登陆后获取
boolean isLogin()判断是否登陆返回值:true 表示已登陆,可以发表评论

2 用户标签提交

如果客户端能够获取到用户的一些属性标签,可以把相关标签通过sdk的接口提交到我们的推荐系统,这样我们在给用户推荐内容的时候会更加的准确,相关接口如下:

YLUIConfig.getInstance().setUserTag(String userId, HashMap<String, Object> userTagMap)

userId同3.7.1的userId userTagMap里存储了用户的标签信息,具体参数如下

key取值解释
gender字符串,用户性别,1为男性,2为女性
age字符串,用户起始年龄段,中间以英文逗号分隔,比如:“20,25”

七 回调设置

1.视频相关回调

视频播放状态相关回调进行了统一,Feed流,播放详情页,小视频页设置如下:

YLPlayerConfig.config().registerPlayerCallBack(new OnPlayerCallBack() {...})
/***注意***/
/***如果上述视频监听配置在具备生命周期的组件中,如Activity或Fragment中,   ***/
/***需在组件的onDestory()中解注册监听,否则有内存泄漏的风险,解注册代码如下:***/
YLPlayerConfig.config().unRegisterPlayerCallback();
//OnPlayerCallBack 回调方法相关说明
public interface OnPlayerCallBack {
    /**
     * 开始播放
     * @param pager 播放回调来源 YLPlayerConfig.PAGE_FEED 横版视频feed流页
                                YLPlayerConfig.PAGE_DETAIL 横版视频播放详情页(YLVideoFragment)
                                YLPlayerConfig.PAGE_LITTLE 竖版视频播放页
     * @param videoID 视频id
     * @param taskID  本次播放任务唯一标识
     */
    void onStart(String pager,String videoID, String taskID);

    /**
     * 暂停播放
     *
     * @param videoID 视频id
     * @param taskID  本次播放任务唯一标识
     */
    void onPause(String pager,String videoID, String taskID);

    /**
     * 继续播放
     *
     * @param videoID 视频id
     * @param taskID  本次播放任务唯一标识
     */
    void onResume(String pager,String videoID, String taskID);

    /**
     * 播放完成
     *
     * @param videoID 视频id
     * @param taskID  本次播放任务唯一标识
     */
    void onComplete(String pager,String videoID, String taskID);

    /**
     * 在循环播放模式下,一次播放完成
     *
     * @param videoID 视频id
     * @param taskID  本次播放任务唯一标识
     * @param num     第几次循环播放
     */
    void onLoopComplete(String pager,String videoID, String taskID, int num);

    /**
     * 视频卡顿,开始缓冲
     *
     * @param videoID 视频id
     * @param taskID  本次播放任务唯一标识
     */
    void onStuckStart(String pager,String videoID, String taskID);

    /**
     * 视频卡顿,缓冲完毕,继续播放
     *
     * @param videoID 视频id
     * @param taskID  本次播放任务唯一标识
     */
    void onStuckEnd(String pager,String videoID, String taskID);

    /**
     * 视频播放错误
     *
     * @param videoID 视频id
     * @param taskID  本次播放任务唯一标识
     */
    void onError(String pager,String videoID, String taskID);

    /**
     * 视频停止
     *
     * @param videoID 视频id
     * @param taskID  本次播放任务唯一标识
     */
    void onStop(String pager,String videoID, String taskID);
}

2.短视频Feed流(YLFeedFragment)滑动回调

//1.建议在常驻页面如MainActivity  onCreate中调用
YLUIConfig.getInstance().registerFeedScrollCallBack(new FeedScrollListener() {
    @Override
    public void onScrollTop() {
        super.onScrollTop();
        Log.i(TAG, "top");

    }

    @Override
    public void onScrollBottom() {
        super.onScrollBottom();
        Log.i(TAG, "bottom");
    }
});
//2.建议在常驻页面如MainActivity  onDestroy中调用
 YLUIConfig.getInstance().unregisterFeedScrollCallBack();

3.其他回调(分享、评论、点赞、关注、登陆状态)

分享回调

 //1.建议在常驻页面如MainActivity  onCreate中调用
 YLUIConfig.getInstance().registerShareCallBack(new ShareCallback() {
            @Override
            public void onShare(Context context, MediaInfo info) {
              
            }
        });
 //2.建议在常驻页面如MainActivity  onDestroy中调用
 YLUIConfig.getInstance().unRegisterShareCallBack();

评论回调

//注册评论回调
YLUIConfig.getInstance().registerCommentCallBack(new CommentSimpleCallback() {
            @Override
            public void onCommentClick(String videoID) {
                Log.e("Comment", "评论icon被点击");
            }

            @Override
            public void onCommentSend(String videoID) {
                Log.e("Comment", "评论发送");
            }

            @Override
            public boolean onCommentShow(String videoID) {
                Log.e("Comment", "评论窗口即将展示");
                // 如果返回true,则表示拦击此次点击,评论窗不会弹出,
                return false;
            }

            @Override
            public void onCommentHide(String videoID) {
                Log.e("Comment", "评论窗口关闭");
            }
        });
//建议在常驻页面注册并取消注册
YLUIConfig.getInstance().unregisterCommentCallBack();

点赞回调

//注册点赞回调
YLUIConfig.getInstance().registerLikeCallBack(new LikeCallback() {
            @Override
            public boolean onLike(String videoID, boolean isLike) {
                Log.e("onLike", isLike ? "点赞:" + videoID : "取消点赞:" + videoID);
              	// 如果返回true,则表示拦击此次点击,本次点赞无效
              	return false;
            }
        });
//解注册回调
YLUIConfig.getInstance().unregisterLikeCallBack();
关注回调
YLUIConfig.getInstance().registerFollowCallBack(new FollowCallback() {
    @Override
    public boolean onFollowClick(String videoID) {
        Log.e("Follow", "点击关注,返回值代表是否阻止本次行为,若返回true,表示拦截本次行为");
        return false;
    }
});
//解注册回调
YLUIConfig.getInstance().unRegisterFollowCallBack();
登陆状态回调 <a id="login_callback"></a>
YLUIConfig.getInstance().registerLoginCallback(new LoginCallback() {
    @Override
    public void onNeedLogin() {
      	//可在此处弹出登陆,并调用YLUser.getInstance().login(nick, avatar, phone, userId);想见6.1
        Log.e("onLogin", "需要登陆");
    }

    @Override
    public void onLoginSuccess() {
        Log.e("onLogin", "登陆成功");

    }

    @Override
    public void onLoginError() {
        Log.e("onLogin", "登陆失败");
    }

    @Override
    public void onLogout() {
        Log.e("onLogin", "注销登陆");
    }
});
//解注册回调
YLUIConfig.getInstance().unRegisterLoginCallback();

八 常见问题

1 图片加载库异常,编译不通过

More than one file was found with OS independent path 'lib/armeabi-v7a/libRSSupport.so'

android {
    packagingOptions {
        exclude 'lib/*/libRSSupport.so'
        exclude 'lib/*/librsjni.so'
    }
}