Android 发布收藏我的收藏
收藏
我的收藏背景信息
目前发布分为下面两种形式:到编辑页和直接到发布页。
分享到抖音编辑页
分享到抖音编辑页流程一般为:三方制作好要分享的视频之后,调用 SDK 分享到抖音,会先调起抖音编辑页,最后再到抖音发布页。
注意:支持分享到抖音编辑页最低抖音版本为 7.5.0,图片视频混合分享要求最低抖音版本为 17.4.0。
分享到抖音发布页
分享到抖音无需经过抖音的编辑页,可以直接到抖音发布页,缩短分享的链路。
分享到发布页目前只支持单视频发布。
注意:
- •直接分享到抖音发布页最低抖音版本为 14.8.0。
- •目前只支持分享本地图片或者视频。
前提条件
- •投稿能力(aweme.share)和转发到日常能力(aweme.forward)均需应用申请对应能力的权限。
- ◦登录抖音开放平台控制台,进入目标应用。在应用详情中申请对应能力的权限(Scope)。
- ◦在抖音 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 的方式。
操作步骤
第一步:准备环境
同时确保在应用的管理后台配置了正确的包名等开发信息,路径为右上角控制台-移动应用-具体应用-设置-开发配置-开发信息。
第二步:接入
首先需要在 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 | 分享的基础媒体数据,目前抖音支持分享类型包括:
|
callerLocalEntry | 集成方可自定义接收回调类,例如:request.callerLocalEntry = "com.xxx.xxx...activity"; 接收回调类需实现 IApiEventHandler,若无指定则默认回调 DouYinEntryActivity。 |
mHashTagList | 默认话题功能 |
mState | 两种传值:
|
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