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

    背景信息

    目前发布分为下面两种形式:到编辑页和直接到发布页。

    分享到抖音编辑页

    分享到抖音编辑页流程一般为:三方制作好要分享的视频之后,调用 SDK 分享到抖音,会先调起抖音编辑页,最后再到抖音发布页。
    注意:支持分享到抖音编辑页最低抖音版本为 7.5.0,图片视频混合分享要求最低抖音版本为 17.4.0。

    分享到抖音发布页

    分享到抖音无需经过抖音的编辑页,可以直接到抖音发布页,缩短分享的链路。
    分享到发布页目前只支持单视频发布。
    接入该功能时,请将 SDK 升级到 0.1.6.0 及以上版本,详情请参见 Android 接入
    注意:
      直接分享到抖音发布页最低抖音版本为 14.8.0。
      目前只支持分享本地图片或者视频。

    前提条件

      投稿能力(aweme.share)和转发到日常能力(aweme.forward)均需应用申请对应能力的权限。
      在抖音 30.5.0 以下版本,应用只需申请 aweme.share 权限,即可使用投稿能力和转发到日常能力。
      在抖音 30.5.0 及以上版本,应用需申请 aweme.share 权限以使用投稿能力,申请 aweme.forward 权限以使用转发到日常能力。
      支持分享到抖音编辑页的最低抖音版本为 7.5.0,图片视频混合分享要求最低抖音版本为 17.4.0。
      支持分享到抖音发布页的最低抖音版本为 14.8.0,并将 SDK 升级到 0.1.6.0 及以上版本。
      文件要求分享至抖音的视频/图片需满足以下限制,否则将导致文件解析错误分享失败。
      视频:
      格式要求 mp4 文件,且文件支持解析
      单视频及视频总时长最大值为 60 分钟。
      分辨率无限制。
      Android 18.0.0 以下版本多视频分享数量不能超过 12 个;Android 18.0.0 及以上版本多视频分享数量不能超过 35 个。
      图片:
      Android 21.2.0 以下版本高宽比需满足区间 1/2.2~2.2(低版本)1/3~3(抖音 17.4.0 之后)。
      抖音应用 12.3.0 及以上版本分享多图数量不能超过 35 个;抖音应用 12.3.0 以下版本多图分享数量不能超过 12 个。
    注意:分享内容带水印可能会受到限制或被删除,请勿携带水印。
    注意:在 Android R 的手机上,对于存储到 app 私有目录下面的文件是不允许分享到别的 app 的,所以分享到抖音的功能可能会失效,请开发者及时针对这种情况进行适配。既可以将要分享的文件存储到公开可访问的目录,也可以使用 FileProvider 的方式对分享的文件路径进行临时授权。开发者需要针对 Android 7.0 版本及以上设备,判断抖音版本支持的情况下,更新为 FileProvider 的方式进行分享。详情请参见 Android 分享支持 FileProvider 的方式

    操作步骤

    第一步:准备环境

    接入分享功能前请确保 SDK 环境已配置完毕且获取了相关权限。具体操作请参见 Android 接入
    同时确保在应用的管理后台配置了正确的包名等开发信息,路径右上角控制台-移动应用-具体应用-设置-开发配置-开发信息

    第二步:接入

    首先需要在 Application 中初始化 DouYinOpenApiFactory。
    @Override public void onCreate() { super.onCreate(); String clientkey = "[Client Key]"; // 修改为在开发者应用登记页面申请的clientkey,路径为右上角控制台-移动应用-具体应用-总览 DouYinOpenApiFactory.init(new DouYinOpenConfig(clientkey)); }
    然后在 Manifest 中申请权限,注册接收回调 activity。
    <uses-permission android:name="android.permission.INTERNET" /> <!--如果第三方自定义了接收回调的activity则可以跳过此步骤--> <!--放到application结点下--> <activity android:name=".douyinapi.DouYinEntryActivity" android:launchMode="singleTask" android:taskAffinity="你的包名" android:exported="true" />

    第三步:发布图片和视频

    支持分享图片或视频,此外我们在抖音版本 17.4.0 支持了图片视频混合内容的分享,你可以使用 douyinOpenApi.isAppSupportMixShare() 判断是否支持。

    构造内容

    Share.Request request = new Share.Request(); request.mState = "xxx"; //建议传入OpenAPI中申请的ShareID,分享结果会通过 Webhooks 进行回调。更多信息,请参见查询视频分享结果及数据。 // request.callerLocalEntry = DouYinEntryActivity.class.getCanonicalName(); //自定义回调Activity ArrayList<String> mUri = new ArrayList<>(); // 初始化资源路径,路径请使用FileProvider路径 File file = new File("xxx文件路径"); //此处需要申明FileProvider,详情参考 Android 分享支持 FileProvider 的方式 Uri uri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileProvider", file); //分别给抖音、抖音极速版、抖音火山版授权 context.grantUriPermission(ParamKeyConstants.DOUYIN_PACKAGE_NAME, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); context.grantUriPermission(ParamKeyConstants.DOUYIN_LITE_PACKAGE_NAME, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); context.grantUriPermission(ParamKeyConstants.DOUYIN_HOTSOON_PACKAGE_NAME, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); mUri.add(uri.toString()); // 分享图片 ImageObject imageObject = new ImageObject(); imageObject.mImagePaths = mUri; MediaContent mediaContent = new MediaContent(); mediaContent.mMediaObject = imageObject; request.mMediaContent = mediaContent; //分享视频 VideoObject videoObject = new VideoObject(); videoObject.mVideoPaths = mUri; MediaContent videoContent = new MediaContent(); videoContent.mMediaObject = videoObject; request.mMediaContent = videoContent; // 分享混合内容(要求SDK版本至少为0.1.7.0,抖音版本至少为17.4.0) if (douyinOpenApi.isAppSupportMixShare()) { MixObject mixObject = new MixObject(); mixObject.mMediaPaths = mUri; MediaContent mixContent = new MediaContent(); mixContent.mMediaObject = mixObject; request.mMediaContent = mixContent; }

    发布到抖音

    DouYinOpenApi douyinOpenApi = DouYinOpenApiFactory.create(this); //如果预期直接拉起发布页,可以判断抖音是否支持。 // 目前直接到发布页仅支持单个视频 if(douyinOpenApi.isAppSupportShareToPublish()) { request.shareToPublish = true; } // 调起分享 douyinOpenApi.share(request);

    第四步:接受返回信息(DouYinEntryActivity demo)

    包名下创建.douyinapi.DouYinEntryActivity,初始化DouYinOpenApi,实现IApiEventHandler接口,在onResp方法中回调授权结果。
    注意:douyinapi.前边的 package 路径需和 app 的包名一致,否则回调将找不到这个类,也可以选择在传分享参数时,通过 <strong>request.callerLocalEntry</strong> 参数来自己指定接收回调的全路径。
    public class DouYinEntryActivity extends Activity implements IApiEventHandler { DouYinOpenApi douYinOpenApi; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); douYinOpenApi = DouYinOpenApiFactory.create(this); douYinOpenApi.handleIntent(getIntent(), this); } @Override public void onReq(BaseReq req) { } @Override public void onResp(BaseResp resp) { if (resp.getType() == CommonConstants.ModeType.SHARE_CONTENT_TO_TT_RESP) { Share.Response response = (Share.Response) resp; // 错误码除了response.errorCode字段,还增加了response.subErrorCode字段,帮助三方排查错误原因 Toast.makeText(this, "分享失败,errorCode: " + response.errorCode + "subcode" + response.subErrorCode + " Error Msg : " + response.errorMsg, Toast.LENGTH_SHORT).show(); } } @Override public void onErrorIntent(@Nullable Intent intent) { // 错误数据 Toast.makeText(this, "Intent出错", Toast.LENGTH_LONG).show(); } }
    发布成功后,会弹出分享弹窗,若想获取用户分享成功后留在抖音内的回调,需要注册并接收广播信息。
    说明:注册广播有动态和静态,需要选择实现。
    // 接收广播的action public static final StringACTION_STAY_IN_TT = "com.aweme.opensdk.action.stay.in.dy";
    回调错误码 errorCode 如下:
    response.errorCode
    含义
    0
    正常
    -1
    未知错误
    -2
    用户手动取消
    -3
    发送失败
    -4
    第三方未获取分享权限或获取权限失败
    -5
    文件解析错误
    subErrorCode 如下:
    response.subErrorCode
    含义
    20002
    无效请求参数
    20003
    应用包名与官网填写不对应或者无 aweme.share 权限。请检查应用是否正常或者包名是否匹配。
    20004
    用户手动取消登录
    20005
    用户未授权使用相册
    20006
    网络出错
    20007
    视频格式或长度不支持
    20008
    图文格式不支持
    20010
    解析媒体资源失败
    20011
    视频尺寸或比例不支持
    20012
    视频格式不支持(要求 mp4)
    20013
    用户手动取消发布
    20014
    有正在上传的作品,需要发布完成后才能下一次发布
    20015
    用户存为草稿
    20017
    无效的链接
    20018
    无效的用户
    20029
    当前为基本模式
    20030
    当前处于防沉迷时间锁阻断状态
    20031
    当前处于防沉迷蒙层展示状态
    20035
    视频状态非公开
    20036
    当前抖音版本不支持,请升级到最新抖音版本
    20037
    内部异常
    20041
    请检查应用包名是否匹配
    22001
    不支持的分辨率 android 独有
    注意:
      如想获取 subErrorCode,请将 SDK 升级到 0.0.1.5 版本以上,并确保抖音为 9.4.0 及以上版本。
      若您的应用的代码存在混淆,若在混淆的情况下存在不能调起分享的情况,请在您的 proguard 文件中添加 -keep class com.bytedance.sdk.open.aweme.**,若调起分享后不能收到回调,请将你接收回调的 activity(DouYinEntryActivity 或者您自定义的回调 activity) 也加入免混淆清单。

    Share.request 参数含义

    参数
    含义
    mMediaContent
    分享的基础媒体数据,目前抖音支持分享类型包括:
      单图/多图:生成动画电影,使用 ImageObject 。当分享多图时,抖音 12.3.0 之后,支持多图数量不能超过 35,低版本多图数量不能超过 12。
      单视频/多视频:使用 VideoObject。当分享多视频时,视频个数小于等于 12 通过 request.mMediaContent = [MediaContent] 设置分享媒体资源。
    callerLocalEntry
    集成方可自定义接收回调类,例如:request.callerLocalEntry = "com.xxx.xxx...activity"; 接收回调类需实现 IApiEventHandler,若无指定则默认回调 DouYinEntryActivity。
    mHashTagList
    默认话题功能
    mState
    两种传值:
      1:传入自定义字符串,可在 Response 中获取到该值,集成方可唯一标识这次请求。
      2:传入 OpenAPI 中申请 ShareID,分享结果会通过 Webhooks 进行回调。
    更多信息,请参见查询视频分享结果及数据
    mMicroAppInfo
    分享小程序数据,成功发布视频后,在视频左下角带有小程序入口。
    shareToPublish
    是否直接分享到抖音发布页。将图片直接分享到发布页需要使用新版分享
    newShare
    是否使用新版分享
    shareParam
    新版分享携带参数,详情参考下面ShareParam 使用
    feature
    体裁。抖音30.3.0版本开始支持该字段。 目前有以下取值:
    note 分享为笔记体裁
    ShareParam 参数含义
    参数
    类型
    含义
    poiId
    字符串
    poi 锚点数据,出现在发布页。
    musicParamObject
    object
    背景音乐数据,可以设置图片或者视频的背景音乐。
    stickersObject
    object
    贴纸对象,参见下方的设置分享内容贴纸
    titleObject
    object
    标题对象,参见下方的设置分享内容的标题
    dailyScale
    int
    日常内容缩放尺度。
    shareDailyBGBaseColor
    int
    日常背景的基准色
    shareDailyBGComplementaryColor
    int
    日常背景的渐变色
    shareDailyBGUrl
    string
    设置日常的背景图片。
    privateStatus
    enum
    视频发布后公开范围。 抖音30.0.0版本开始支持该字段。 目前有以下取值:
    Public 所有人可见(公开)
    Private 仅自己可见(私密)
    Friends 朋友可见
    downloadType
    enum
    视频发布后是否允许下载。抖音30.0.0版本开始支持该字段。 目前有以下取值:
    AllowDownload 允许下载
    DenyDownload 不允许下载
    注:日常背景的设置生效优先级为基准色>背景图片

    分享内容携带额外信息

    设置分享内容的标题

    目前支持设置标题,同时标题中支持插入话题和@用户。指定的话题会展现在发布页面,用户可自行删除该话题,该话题类型支持商业化话题和普通话题。发布后同抖音原生话题没有差别。
    Share.Request request = new Share.Request(); request.newShare = true; ShareParam shareParam = new ShareParam(); request.shareParam = shareParam; TitleObject titleObject = new TitleObject(); shareParam.titleObject = titleObject; titleObject.shortTitle = "分享短标题"; // 抖音30.0.0版本开始支持该字段 titleObject.title = "分享标题"; HashtagTitleMarker hashtagTitleMarker = new HashtagTitleMarker(); hashtagTitleMarker.name = "hashtagTitleMarker"; hashtagTitleMarker.start = 1; //插入标题的位置索引 titleObject.addMarker(hashtagTitleMarker); MentionTitleMarker mentionTitleMarker = new MentionTitleMarker(); mentionTitleMarker.openId = "xxx"; mentionTitleMarker.start = 5; titleObject.addMarker(mentionTitleMarker);
    注意:
      1.该能力从抖音 21.3.0 版本开始支持。抖音30.0.0版本开始支持shortTitle字段。
      2.标题总长度不超过 500。
      3.分享的话题审核依旧遵循抖音的审核逻辑,强烈建议第三方谨慎拟定话题名称,避免强导流行为。

    设置分享内容的贴纸

    支持第三方传入贴纸。贴纸会出现在编辑页面,用户可自行移动、删除贴纸。目前支持话题贴纸、@用户贴纸、图片贴纸、poi 贴纸等。
    Share.Request request = new Share.Request(); request.newShare = true; ShareParam shareParam = new ShareParam(); request.shareParam = shareParam; StickersObject stickersObject = new StickersObject(); HashtagSticker hashtagSticker = new HashtagSticker(); //话题贴纸 hashtagSticker.name = "hashtagSticker"; stickersObject.addSticker(hashtagSticker); CustomSticker customSticker = new CustomSticker();//自定义图片贴纸 customSticker.path = "xx"; //文件路径,请使用FileProvider customSticker.startTime = 0; customSticker.endTime = 1000 * 1000; customSticker.normalizedSizeX = 0.5F; //归一化大小,宽除以屏幕宽 customSticker.normalizedSizeY = 0.5F; //归一化大小,高各除以屏幕高 customSticker.scale = 1F; //缩放 customSticker.rotate = 0F; //旋转 customSticker.offsetX = 0.5F; //横纵向偏移,贴纸中心点在归一化屏幕中的位置 customSticker.offsetY = 0.5F; //横纵向偏移,贴纸中心点在归一化屏幕中的位置 stickersObject.addSticker(customSticker); MentionSticker mentionSticker = new MentionSticker(); // @用户贴纸 mentionSticker.openId = "xxx";//@用户的openid,用户授权后可以获取到 stickersObject.addSticker(mentionSticker); PoiSticker poiSticker = new PoiSticker();// Poi贴纸 poiSticker.poiId = "xxx"; //poiId stickersObject.addSticker(poiSticker); //目前同时仅支持传入一个poi贴纸 shareParam.stickersObject = stickersObject;
    注意:
      1.该能力从抖音 2130 版本开始支持。
      2.在选择图集情况下无法携带贴纸。
      3.分享的话题审核依旧遵循抖音的审核逻辑,强烈建议第三方谨慎拟定话题名称,避免强导流行为。

    设置小程序锚点

    支持第三方分享内容至抖音时,携带相关小程序信息,成功发布视频后,在视频左下角带有小程序入口。
    Share.Request request = new Share.Request(); MicroAppInfo mMicroInfo = new MicroAppInfo(); mMicroInfo.setAppTitle("小程序title"); mMicroInfo.setDescription("小程序描述"); mMicroInfo.setAppId("ttef9b992670b151ec"); mMicroInfo.setAppUrl("pages/movie/index?utm_source=share_wxapp&cityId=10&cityName=%E4%B8%8A%E6%B5%B7"); request.mMicroAppInfo = mMicroInfo;
    注意:使用分享携带小程序,请在<strong>build.gradle</strong>中添加 gson 依赖,否则会报错找不到 gson 文件。
    implementation 'com.google.code.gson:gson:2.9.0'
    目前携带的小程序需跟应用为同一主体下才能挂载成功。如果非同主体请使用推广任务。只需要在之前的基础上传入额外的任务信息,目前该能力需要抖音版本大于 26.50 版本。小程序推广计划参数详情请点击这里
    // 塞入小程序任务信息 request.extras = Bundle() request.extras?.putLong("micro_app_task_id", taskId) //小程序任务id request.extras?.putString("agent_client_key", agentClientKey) //撮合中介

    设置 Poi 锚点

    目前支持第三方内容传入内容至抖音时携带 poi 信息,在发布页可以看到 poi 信息,成功发布视频后,在视频左下角带有 poi 入口。
    Share.Request request = new Share.Request(); request.newShare = true; ShareParam shareParam = new ShareParam(); request.shareParam = shareParam; shareParam.poiId = "xxx"; //poiId
    注:如果同时传入小程序和 poi 锚点信息,会优先采用小程序信息。

    示例 Demo

    提供了一个完整的接入示例 Demo,你可以通过 Demo 直观地查看接入方法。