抖音开放平台Logo
开发者文档
控制台
  • 移动应用
  • open SDK 概述
  • open SDK 下载
  • open SDK 接入
  • Android 接入
  • iOS 接入
  • 鸿蒙 接入
  • 抖音分享
  • 抖音投稿发布
  • 抖音名片
  • 抖音登录和授权
  • 常见问题
  • 网站应用
  • Android 接入
    收藏
    我的收藏

    本文为抖音短视频 Android 终端 SDK 新手使用教程,只涉及 SDK 的使用方法,默认读者已经具有使用 Android Studio 开发 Android 程序的经验,以及相关的编程知识基础等。

    前提条件

      请确保 SDK 最低支持 Android API 15 - 4.0.x 版本。
      向抖音短视频申请你的 ClientKey(下文简称 AppID)及相关权限:
      a.请到开发者应用登记页面进行申请,申请后将获得 AppID。具体步骤请参见创建移动应用和网站应用
      b.通过 AppID 为应用申请相关的权限,如分享、授权等。
      c.审核通过后即可使用相关的功能。

    接入流程

    SDK 接入目前需要引入两个依赖包,包括opensdk-china-externalopensdk-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 在后续的名片接口中使用票据进行能力鉴权。
    接口说明参见文档: client_code 接口access_code 接口
    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 开发环境配置完毕. 具体子功能接入请查阅相关功能接入文档。
    常见问题,请参见 Android 常见问题