Android 接入收藏我的收藏
收藏
我的收藏本文为抖音短视频 Android 终端 SDK 新手使用教程,只涉及 SDK 的使用方法,默认读者已经具有使用 Android Studio 开发 Android 程序的经验,以及相关的编程知识基础等。
前提条件
- •请确保 SDK 最低支持 Android API 15 - 4.0.x 版本。
- •向抖音短视频申请你的 ClientKey(下文简称 AppID)及相关权限:
- a.请到开发者应用登记页面进行申请,申请后将获得 AppID。具体步骤请参见创建移动应用和网站应用。
- b.通过 AppID 为应用申请相关的权限,如分享、授权等。
- c.审核通过后即可使用相关的功能。
接入流程
SDK 接入目前需要引入两个依赖包,包括
opensdk-china-external
和opensdk-common
,为了方便,两者使用同样的版本号。- 1.将 SDK 集成到开发环境。
- 2.配置抖音的软件包可见性。
操作步骤
SDK集成
将 SDK 集成到开发环境,需要添加如下配置。
//gradle文件中添加: repositories { maven { url 'https://artifact.bytedance.com/repository/AwemeOpenSDK' } } dependencies { def open_sdk_version = "0.2.0.4" //使用最新的版本 implementation "com.bytedance.ies.ugc.aweme:opensdk-china-external:$open_sdk_version" implementation "com.bytedance.ies.ugc.aweme:opensdk-common:$open_sdk_version" // 下面为非必须接入,当需要接入额外能力才需要接入。 implementation "com.bytedance.ies.ugc.aweme:openokhttp-china-external:$open_sdk_version" // 默认网络能力实现。如果不使用默认实现可以不依赖该组件,自行实现OpenNetworkService然后注入。 implementation "com.bytedance.ies.ugc.aweme:openpicasso-china-external:$open_sdk_version" // 默认图片能力实现。如果不使用默认实现可以不依赖该组件,自行实现OpenImageService然后注入。 implementation "com.bytedance.ies.ugc.aweme:openticket-china-external:$open_sdk_version" // 名片接入需要依赖。 implementation "com.bytedance.ies.ugc.aweme:openprofile-china-external:$open_sdk_version" // 名片能力实现,接入名片需要依赖。 implementation "com.bytedance.ies.ugc.aweme:openapplog-china-external:$open_sdk_version" // 埋点能力默认实现,如果存在包大小问题可以先不考虑接入。 }
配置抖音的软件包可见性
Android 11 为了加强了隐私保护策略,引入了很多变更和限制,其中软件包可见性变更,将会导致第三方应用通过抖音开放平台的 SDK 无法正常拉起抖音,从而无法使用开放平台的全部功能,包括但不限于分享消息到抖音、通过抖音进行账号登录等功能。特别需要注意的是,Android11 的该变更只会影响到升级
<strong>targetSdkVersion=30</strong>
的应用,未升级的应用暂不受影响。<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xxx.xxxx"> <queries> <!--允许查询抖音和抖音极速版的软件包信息--> <package android:name="com.ss.android.ugc.aweme" /> <package android:name="com.ss.android.ugc.aweme.lite" /> <package android:name="com.ss.android.ugc.live" /> </queries> </manifest>
初始化SDK
目前 SDK 需要注入宿主能力来保障 SDK 正常运行,下面列出常用的能力。
val douYinOpenSDKConfig = DouYinOpenSDKConfig.Builder() .context(context) //此处注入context .clientKey("xx") //此处填写申请的应用client_key .logService(OpenLogServiceImpl()) // 可选,建议实现查看日志,不实现默认输出到logcat .networkService(OpenNetworkOkHttpServiceImpl()) //注入网络实现 .imageService(PicassoOpenImageServiceImpl()) // 注入图片实现 .hostInfoService(OpenHostInfoServiceImpl()) //注入宿主信息实现 .hostTicketService(OpenHostTicketServiceImpl()) //注入票据实现 .eventService(OpenEventAppLogServiceImpl()) // 可选实现,如果依赖了openapplog-china-external组件,可以注入 .build() DouYinOpenApiFactory.initConfig(douYinOpenSDKConfig) //如果依赖了openapplog组件,那么调用下面的代码,需要确保在用户同意隐私协议后调用。 // xxx 为当前渠道,必填 OpenAppLogUtils.init(this, "xxx")
日志能力依赖
需要实现 OpenLogService,然后注入。可以参考下面代码实现。
class OpenLogServiceImpl : OpenLogService { override fun d(tag: String?, messages: String?) { //宿主的日志实现 } override fun i(tag: String?, messages: String?) { //宿主的日志实现 } override fun w(tag: String?, messages: String?) { //宿主的日志实现 } override fun e(tag: String?, messages: String?) { //宿主的日志实现 } }
宿主信息能力依赖
目前宿主信息需要实现 OpenHostInfoService ,可以参考下面代码。
class OpenHostInfoServiceImpl : OpenHostInfoService { override fun getDeviceId(): String { return "" } override fun getChannel(): String { return "" //渠道 } override fun getAppId(): String { return "" } override fun getAppName(): String { return "" //app名称 } override fun getUpdateVersionCode(): String { return "" //版本号 } override fun getVersionCode(): String { return BuildConfig.VERSION_CODE.toString() } override fun getVersionName(): String { return BuildConfig.VERSION_NAME } override fun getInstallId(): String { return "" } override fun extraInfo(): SparseArray<String>? { return null } }
票据能力依赖
目前 OpenHostTicketService 主要用于名片能力,目前不使用名片能力可以不实现。通过实现该能力,SDK 在后续的名片接口中使用票据进行能力鉴权。
class OpenHostTicketServiceImpl : OpenHostTicketService { /** * 获取client_code * * @param callback 成功情况下回传client_code,上面文档中的data.clientCode */ override fun requestClientCode(p0: String?, p1: OpenCallback<String>?) { GlobalScope.launch(Dispatchers.IO) { try { val hostTickerService = HostConfigManager.getHostConfig().hostTickerService() if (hostTickerService == null) { p1?.onFail(CommonConstants.SDKErrorCode.CLIENT_CODE_ERROR, "没有实现") return@launch } val result = try { hostTickerService.getClientCode(p0 ?: "") } catch (e: Exception) { p1?.onFail(-1, e.message) return@launch } if (result.isSuccess && result.getData()?.isNotEmpty() == true) { p1?.onSuccess(result.getData()) return@launch } else { p1?.onFail(result.errCode, result.msg) } } catch (e: Exception) { p1?.onFail(-1, e.message) } } } /** * @param clientKey * @param openId * @param callback 成功情况下回传access_code,上面文档中data.access_code */ override fun requestAccessCode(p0: String?, p1: String?, p2: OpenCallback<String>?) { GlobalScope.launch(Dispatchers.IO) { try { val hostTickerService = HostConfigManager.getHostConfig().hostTickerService() if (hostTickerService == null) { p2?.onFail(CommonConstants.SDKErrorCode.ACCESS_CODE_ERROR, "没有实现") return@launch } if (p0.isNullOrEmpty() || p1.isNullOrEmpty()) { p2?.onFail(CommonConstants.SDKErrorCode.ACCESS_CODE_ERROR, "client_key or openid is empty") return@launch } val result = try { hostTickerService.getAccessCode(p0, p1) } catch (e: Exception) { p2?.onFail(-1, e.message) return@launch } if (result.isSuccess && result.getData()?.isNotEmpty() == true) { p2?.onSuccess(result.getData()) return@launch } else { p2?.onFail(result.errCode, result.msg) } } catch (e: Exception) { p2?.onFail(-1, e.message) } } } }
至此,SDK 开发环境配置完毕. 具体子功能接入请查阅相关功能接入文档。