目录
前言
一、官方文档
二、开始配置
第一步:向抖音短视频申请你的 clientkey 及相关权限
第二步:集成到开发环境
1.根目录下build.gradle引入库
2.app moudel目录下build.gradle引入库
3.配置抖音的软件包可见性
使用一:Android-分享给抖音好友or群
使用二:android 分享图片支持fileprovider方式
1. 配置
前言
此篇仅用来记录相关配置
一、官方文档
抖音开放平台抖音开放平台,致力于打造抖音开放的生态系统,将从基础能力、内容、数据、服务等层面的开放,为开发者提供高效便捷的解决方案https://open.douyin.com/platform/doc?doc=docs/develop/share/android
二、开始配置
SDK 最低支持:Android API 15 - 4.0.x 版本
SDK 接入目前需要引入两个依赖包,包括opensdk-china-external
和opensdk-common
,为了方便,两者使用同样的版本号。当前最新版本为 0.1.9.0。
第一步:向抖音短视频申请你的 clientkey 及相关权限
请到开发者应用登记页面进行申请,申请后将获得 clientkey, 之后通过 clientkey 为应用申请相关的权限,如分享、授权、默认话题等;审核通过后即可使用相关的功能;
第二步:集成到开发环境
1.根目录下build.gradle引入库
buildscript {repositories {google()jcenter()mavenCentral()maven { url "https://jitpack.io" }//抖音maven { url 'https://artifact.bytedance.com/repository/AwemeOpenSDK' }maven { url "https://maven.byted.org/repository/android_public/" }}dependencies {classpath "com.android.tools.build:gradle:7.0.2"classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21'// NOTE: Do not place your application dependencies here; they belong// in the individual module build.gradle files}
}allprojects {repositories {google()jcenter()mavenCentral()maven { url "https://jitpack.io" }//抖音maven { url 'https://artifact.bytedance.com/repository/AwemeOpenSDK' }maven { url "https://maven.byted.org/repository/android_public/" }}
}task clean(type: Delete) {delete rootProject.buildDir
}
2.app moudel目录下build.gradle引入库
//抖音平台接入
implementation 'com.bytedance.ies.ugc.aweme:opensdk-china-external:0.1.9.0'
implementation 'com.bytedance.ies.ugc.aweme:opensdk-common:0.1.9.0'
3.配置抖音的软件包可见性
Android 11 为了加强了隐私保护策略,引入了很多变更和限制,其中软件包可见性 变更,将会导致第三方应用通过抖音开放平台的 SDK 无法正常拉起抖音,从而无法使用开放平台的全部功能,包括但不限于分享消息到抖音、通过抖音进行账号登陆等功能。
特别需要注意的是,Android11 的该变更只会影响到升级<strong>targetSdkVersion=30</strong>的应用,未升级的应用暂不受影响。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="你的包名"><queries><!--允许查询抖音和抖音极速版的软件包信息--><package android:name="com.ss.android.ugc.aweme" /><package android:name="com.ss.android.ugc.aweme.lite" /></queries>
</manifest>
使用一:Android-分享给抖音好友or群
向抖音短视频申请你的clientkey及相关权限请到开发者应用登记页面进行申请,申请后将获得clientkey, 之后通过clientkey为应用申请相关的权限,如分享到抖音联系人/群(im.share)等;审核通过后即可使用相关的功能;
- 初始化 在Application中,初始化DouYinOpenApiFactory
// 修改为在开发者应用登记页面申请的clientkeyDouYinOpenApiFactory.init(new DouYinOpenConfig("[Client Key]"));
2. - Manifest中申请权限,注册接收回调activity
<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />//如果第三方自定义了接收回调的activity则可以跳过此步骤
<activityandroid:name=".douyinapi.DouYinEntryActivity"android:launchMode="singleTask"android:taskAffinity="你的包名"android:exported="true">
</activity>
3.分享html (注意:如果您想要分享html链接到抖音联系人,请先到官网管理中心的您应用下的im.share 权限添加分享链接进行页面链接验证,才可以成功分享。)
val douyinOpenApi = DouYinOpenApiFactory.create(activity)//抖音分享htmlval request = ShareToContact.Request().apply {htmlObject = ContactHtmlObject().apply {html = "https://www.baidu.com/" //你的html链接(必填)discription = "百度" // 你的html描述(必填)title = “App Name” // 你的html title(必填)//thumbUrl // 你的html的封面图(远程图片) (选填,若不填,则使用开放平台官网申请时上传的图标)}}// 调起分享if (douyinOpenApi.isAppSupportShareToContacts) {douyinOpenApi.shareToContacts(request)} else {showToast(R.string.tiktok_version_not_support)}
4.接收回调的activity
/*** Description 接受返回信息* Version 1.0*/
public class DouYinEntryActivity extends Activity implements IApiEventHandler {DouYinOpenApi douYinOpenApi;@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);douYinOpenApi = DouYinOpenApiFactory.create(this);douYinOpenApi.handleIntent(getIntent(), this);}@Overridepublic void onReq(BaseReq req) {}@Overridepublic void onResp(BaseResp resp) {if (resp instanceof ShareToContact.Response) {switch (resp.errorCode) {case 20000://TODO 分享成功break;case 20013://TODO 取消分享break;default://TODO 分享失败break;}finish();}}@Overridepublic void onErrorIntent(@Nullable Intent intent) {//TODO 分享失败}
}
5.混淆
-keep class com.bytedance.sdk.open.aweme.**
注意,若您的应用的代码存在混淆情况,吊起抖音IM分享之后,不能拿到IM分享结果的回调,请将您接收回调的activity(DouYinEntryActivity或者您自定义的回调activity) 也加入免混淆清单
使用二:android 分享图片支持fileprovider方式
主要目的是适配Android11
1. 配置
在项目的AndroidManifest.xml添加相关配置
<!--${applicationId}为你的应用包名--><provider android:name="android.support.v4.content.FileProvider"android:authorities="${applicationId}.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_provider_paths" /></provider>
在res/xml目录(如果没有xml目录,则新建一个)下,添加文件file_provider_paths.xml
,内容如下:
<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-files-path name="sharedata" path="shareData/"/>
</paths>
2.使用FileProvider接口分享图片
fun shareToDouYin(activity: Activity, bitmap: Bitmap) {//创建分享数据文件val pathDir = activity.getExternalFilesDir("shareData")!!.pathval filePath = "$pathDir/share.jpg"//存储val saveSuccess = save(bitmap, File(filePath), Bitmap.CompressFormat.JPEG, false)if (saveSuccess) {val fileUri = getFileUri(activity.applicationContext, filePath)//分享单图/多图val douyinOpenApi = DouYinOpenApiFactory.create(activity)val request = ShareToContact.Request().apply {mMediaContent = MediaContent().apply {mMediaObject = ImageObject().apply {mImagePaths = arrayListOf(fileUri)}}}// 判断是否可以分享到联系人if (douyinOpenApi.isAppSupportShareToContacts) {douyinOpenApi.shareToContacts(request);} else {Toast.makeText(activity, "当前抖音版本不支持", Toast.LENGTH_SHORT).show()}} else {Toast.makeText(activity, "分享失败", Toast.LENGTH_SHORT).show()}}/*** Save the bitmap.** @param src The source of bitmap.* @param file The file.* @param format The format of the image.* @param recycle True to recycle the source of bitmap, false otherwise.* @return `true`: success<br></br>`false`: fail*/fun save(src: Bitmap, file: File, format: CompressFormat, recycle: Boolean): Boolean {var os: OutputStream? = nullvar ret = falsetry {os = BufferedOutputStream(FileOutputStream(file))ret = src.compress(format, 100, os)if (recycle && !src.isRecycled) src.recycle()} catch (e: IOException) {e.printStackTrace()} finally {try {os?.close()} catch (e: IOException) {e.printStackTrace()}}return ret}fun getFileUri(context: Context, filePath: String): String {// 该filePath对应于xml/file_provider_paths里的第一行配置:,因此才可被共享val file = File(filePath)// 要与`AndroidManifest.xml`里配置的`authorities`一致val contentUri: Uri = FileProvider.getUriForFile(context,context.packageName + ".fileprovider",file)// 授权给抖音访问路径,这里填抖音包名context.grantUriPermission("com.ss.android.ugc.aweme",contentUri,Intent.FLAG_GRANT_READ_URI_PERMISSION)// 使用contentPath作为文件路径进行分享 contentUri.toString() 即是以"content://"开头的用于共享的路径return contentUri.toString()}
总结
抖音的文档还是很清楚的,最后清单文件完整是这个样子的
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"package="你的包名"><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><queries><!--允许查询抖音和抖音极速版的软件包信息--><package android:name="com.ss.android.ugc.aweme" /><package android:name="com.ss.android.ugc.aweme.lite" /></queries><application><!--抖音分享结果页--><activityandroid:name=".douyinapi.DouYinEntryActivity"android:exported="true"android:launchMode="singleTask"android:taskAffinity="${applicationId}" /><provider android:name="android.support.v4.content.FileProvider"android:authorities="${applicationId}.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_provider_paths" /></provider><!--${applicationId}为你的应用包名--><!-- endregion--></application>
</manifest>