跳到主要内容
版本:2.3

资源位 SDK(Android)

::: info 最低兼 Android 版本 4.2 API 17

资源位 SDK 主要提供两种接入方式: :::

  • 原生模板

在视图对应位置进行轮播图 GTouchBanner 的初始化,banner 配置后调用轮播图 API,数据请求、banner 视图的样式、图片缓存、点击跳转行为等全部通过接口下发的配置在 SDK 内部处理

集成与使用代码参考 GIO 电商 demo shopping 分支的 HomeFragment 文件

  • 自渲染

调用 API 接口 GrowingTouch#loadBannerData 获取 banner 数据模型以及响应信息,后续展示及点击逻辑由用户进行自实现

集成 SDK

集成 GrowingIO Android CDP SDK

资源位 SDK 依赖于数据数据采集 SDK

版本要求最低 1.2.3,如已集成请跳过

参考 Android SDK

添加依赖

2.1 在 app build.gradle 添加 SDK 依赖

dependencies {

...

//由于资源位底层网络库依赖OkHttp3网络库,请添加OkHttp3依赖

implementation "com.squareup.okhttp3:okhttp:3.12.1"

//资源位SDK依赖

implementation "com.growingio.android:gtouch:$gtouch_version"

//触达原生banner模板依赖

implementation "com.growingio.android.widget:gtouch-banner:$gtouch_version"

}

$gtouch_version 为最新 SDK 版本号,现最新的版本号为请参考SDK 更新日志

需要的权限列表

所需权限同无埋点 SDK

<uses-permission android:name="android.permission.INTERNET"  />

<!--非危险权限,不需要运行时请求,Manifest文件中添加即可-->

<uses-permission android:name="android.permission.ACCESS\_NETWORK\_STATE" />

<uses-permission android:name="android.permission.SYSTEM\_ALERT\_WINDOW"/>

<uses-permission android:name="android.permission.ACCESS\_WIFI\_STATE" />

初始化 SDK

请将以下GrowingTouch.startWithConfig加在您的 Application 的 onCreate 方法中,且保证在 GrowingIO 采集 SDK 启动代码之后

public  class  MyApplication  extends  Application  {



@Override

public void onCreate() {

super.onCreate();

// GrowingIO 采集SDK 启动代码



// GrowingIO 资源位SDK 启动代码



GrowingTouch.startWithConfig(this, new GTouchConfig()

.setDebugEnable(BuildConfig.DEBUG)

.setMessageHost("获取您的服务器上发出的弹窗和banner数据")

);

}

}

请注意调用顺序,需要在 GrowingIO 采集 SDK 启动代码调用后,再调用 GrowingTouch.startWithConfig 函数。

代码混淆

如果您启用了代码混淆,请务必在您的 proguard-rules.pro 文件里加入下面的代码:

#GrowingIO

-keep class com.growingio.** {

*;

}

-dontwarn com.growingio.**

-keepnames class * extends android.view.View

-keepnames class * extends android.app.Fragment

-keepnames class * extends android.support.v4.app.Fragment

-keepnames class * extends androidx.fragment.app.Fragment

-keep class android.support.v4.view.ViewPager{

*;

}

-keep class android.support.v4.view.ViewPager$**{

*;

}

-keep class androidx.viewpager.widget.ViewPager{

*;

}

-keep class androidx.viewpager.widget.ViewPager$**{

*;

}



#okhttp

-dontwarn okhttp3.**

-keep class okhttp3.**{*;}



#okio

-dontwarn okio.**

-keep class okio.**{*;}

原生模板接入

参数说明

配置字段属性字段是否必填类型说明
BannerkeygtouchBannerKeystring在服务端进行查看后配置到本地,一个 bannerKey 对应一个 banner(唯一标识),不设置抛出 IllegalArgumentException
轮播间隔gtouchAutoPlayIntervallong不设置默认为 3000ms,注意单位为 ms
自动循环gtouchAutoPlayAbleboolean不设置默认为 true
轮播指示器样式gtouchPointDrawableResourceId不设置为 SDK 默认小圆点
轮播指示器位置gtouchIndicatorGravityint(Gravity)默认为 Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM
默认占位图gtouchPlaceholderDrawableResourceId用户设置,不设置默认为-1
图片的填模式scaleTypeImageView.ScaleType不设置默认为 CENTER_CROP
错位占位图gtouchErorReplaceDrawableResourceId用户设置,不设置抛出 IllegalArgumentException

在对应视图 xml 中添加 Banner 控件(建议使用 xml 布局)

<com.growingio.android.sdk.gtouch.widget.banner.GTouchBanner

android:id="@+id/gtouch_banner"

android:layout_width="match_parent"

android:layout_height="107dp"

app:gtouchBannerKey="99299c5d32d6e14a"

app:gtouchErrorReplaceDrawable="@mipmap/load_error"

app:gtouchIndicatorGravity="bottom|right"

app:gtouchPlaceholderDrawable="@mipmap/loading" />

GTouchBanner 初始化代码如下

private  GTouchBanner mGTouchBanner;

mGTouchBanner = findViewById(R.id.gtouch_banner);

mGTouchBanner.loadData(new BannerStateChangedListener() {

/**

\* Banner数据加载成功

*

\* @param banner Banner控件对象

*/

@Override

public void onLoadDataSuccess(GTouchBanner banner) {

Log.e(TAG, "onLoadDataSuccess: ");

}





/**

\* Banner数据加载失败

*

\* @param banner Banner控件对象

\* @param errorCode 错误码

\* @param description 错误描述,有可能为null

*/

@Override

public void onLoadDataFailed(GTouchBanner banner, int errorCode, String description) {

Log.e(TAG, "onLoadDataFailed: errorCode = " + errorCode + ", description = " + description);

}





/**

\* Banner item被点击

*

\* @param banner Banner控件对象

\* @param position item所处位置

\* @param targetUrl 需要跳转的路由url

\* @return 返回为true,资源位SDK不在处理跳转的路由url;返回为false,资源位SDK会处理跳转内部界面和H5两种资源位系统提供的路由

*/

@Override

public boolean onItemClick(GTouchBanner banner, int position, String targetUrl) {

Log.e(TAG, "onItemClick: position = " + position + ", targetUrl = " + targetUrl);

return false;

}



/**

\* 加载失败图片被点击

*

\* @param banner Banner控件对象

*/

@Override

public void onErrorImageClick(GTouchBanner banner) {

Log.e(TAG, "onErrorImageClick");

}

});

自渲染接入

数据模型说明

  • BannerData
属性字段类型说明
getName()stringbannerd 名称
getBannerkey()stringbanner 的唯一标识
getItem()List<BannerItemData>banner 的所有 item,类型为 bannerItemData
  • BanneritemData
属性字段类型说明
getIndex()intindex 标识,从 0 开始
getTitle()stringitem 的名称
getImageUrl()stringbannerItem 显示图片 url

获取 banner 数据模型

使用 GrowingTouch#loadBannerData(@NonNull String bannerKey,@NonNull final BannerDataCallback callback)

v1.3.0-cdp 版本新增了对灵活资源位的支持,注意灵活资源位可能发生没有 banner 的情况,需要特殊处理。

// bannerKey在服务端进行查看后配置到本地

GrowingTouch.loadBannerData("9e38f09a9cc50a79", new BannerDataCallback() {

/**

\* Banner数据请求成功

*

\* @param bannerData Banner所有数据

*/

@Override

public void onSuccess(BannerData bannerData) {

if(bannerData.getItems().size < 1){

throw new GTouchSDKException("灵活资源位会发生item为0的情况,需特殊处理")

}

}





/**

\* Banner数据请求失败

*

\* @param errorCode 错误码

\* @param description 错误描述,有可能为null,如网络错误时

*/

@Override

public void onLoadFailed(int errorCode, String description) {

}

});

bannerItem 绑定对应的 itemview 的点击事件

使用 BannerItemData#bindItemDataToClickView(final View clickView, final BannerItemOnClickListener listener)

// itemView即每个bannerItemData对应的视图

bannerItemData.bindItemDataToClickView(itemView, new BannerItemOnClickListener() {

/**

\* 点击回调

*

\* @param clickView 点击的View

\* @param itemData 点击的Item的数据

\* @param targetUrl 需要跳转的目标Url

\* targetUrl两种格式分别为:

\* 1.直接的网址(如:https://www.growingio.com)

\* 2.跳转应用内部界面(如:GInApp://com.growingio.gtouch.InAppPageActivity?key1=value1&key2=value2),在自渲染中跳转需要用户进行处理

*/

@Override

public void onClick(View clickView, BannerItemData itemData, String targetUrl) {

}

});

​ 使用 bannerItem 进行绑定点击事件的原因及注意事项:

  • 添加额外依赖:com.android.support:viewpager:x.x.x(含有该依赖即可,如依赖包:com.android.support:appcompat-v7:x.x.x)
  • 使用 androidx 时请同时设置 android.enableJetifier 为 true
  • 保证 banner 的展示以及点击事件能够正确传给 GroiwngIO 的数据端,需要使用 BannerItemData#bindItemDataToClickView 进行点击事件的绑定
  • 将对应视图的点击事件实现在 BannerItemOnClickListener 回调时,不要进行额外的点击事件设置
  • 保证 banner 的展示事件准确,需要在视图真正显示时进行 BannerItemData#bindItemDataToClickView 调用,注意如使用 ViewPager 存在预加载(无法 disable),建议在类似 PagerAdapter#setPrimaryItem 函数中进行绑定调用
  • 如使用 ViewPager2(目前版本:androidx.viewpager2:viewpager2:1.0.0-beta03),为保证展示事件的准确性建议关闭离屏加载(类似 ViewPager 的预加载,默认关闭),使用预加载时在视图绑定时(在创建时将导致展示事件错乱)进行 BannerItemData#bindItemDataToClickView 调用

原生模板接入异常情况说明

获取 Banner 数据失败(包括获取到的 BannerItem 的 size 为 0)

  • 当存在上一次获取到 Banner 数据时,将会加载上一次数据
  • 没有上一次数据时,将会回调用户错误(onLoadDataFailed)并加载设置的错误图片
  • 获取到的 BannerItem 的 size 为 0 时,原生模板所在的 view 会自动隐藏,界面上会有对应的隐藏动画,请开发者酌情考虑使用我们的模板。

后端返回的配置数据 banneritem 的 index 不连续(包括:自渲染接入)

SDK 中会将 index 进行去重并重新编号

BannerItem 单张图加载失败

删除该 item,删除后不存在 item 将会加载用户与设置的错误图片(errorReplaceDrawable)