抖音开放平台Logo
开发者文档
控制台

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); // 分享图片 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 直观地查看接入方法。​