目录
第一步:向抖音短视频申请你的 clientkey 及相关权限
2.app moudel目录下build.gradle引入库
使用二:android 分享图片支持fileprovider方式
此篇仅用来记录相关配置
SDK 最低支持:Android API 15 - 4.0.x 版本
SDK 接入目前需要引入两个依赖包,包括opensdk-china-external
和opensdk-common
,为了方便,两者使用同样的版本号。当前最新版本为 0.1.9.0。
请到开发者应用登记页面进行申请,申请后将获得 clientkey, 之后通过 clientkey 为应用申请相关的权限,如分享、授权、默认话题等;审核通过后即可使用相关的功能;
- 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
- }
- //抖音平台接入
- 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'
Android 11 为了加强了隐私保护策略,引入了很多变更和限制,其中软件包可见性 变更,将会导致第三方应用通过抖音开放平台的 SDK 无法正常拉起抖音,从而无法使用开放平台的全部功能,包括但不限于分享消息到抖音、通过抖音进行账号登陆等功能。
特别需要注意的是,Android11 的该变更只会影响到升级targetSdkVersion=30的应用,未升级的应用暂不受影响。
-
- <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>
- // 修改为在开发者应用登记页面申请的clientkey
- DouYinOpenApiFactory.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则可以跳过此步骤
- <activity
- android:name=".douyinapi.DouYinEntryActivity"
- android:launchMode="singleTask"
- android:taskAffinity="你的包名"
- android:exported="true">
- activity>
3.分享html (注意:如果您想要分享html链接到抖音联系人,请先到官网管理中心的您应用下的im.share 权限添加分享链接进行页面链接验证,才可以成功分享。)
- val douyinOpenApi = DouYinOpenApiFactory.create(activity)
-
- //抖音分享html
- val 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;
-
- @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 instanceof ShareToContact.Response) {
-
- switch (resp.errorCode) {
- case 20000:
- //TODO 分享成功
- break;
- case 20013:
- //TODO 取消分享
- break;
- default:
- //TODO 分享失败
- break;
- }
-
- finish();
- }
- }
-
- @Override
- public void onErrorIntent(@Nullable Intent intent) {
- //TODO 分享失败
- }
- }
5.混淆
-keep class com.bytedance.sdk.open.aweme.**
注意,若您的应用的代码存在混淆情况,吊起抖音IM分享之后,不能拿到IM分享结果的回调,请将您接收回调的activity(DouYinEntryActivity或者您自定义的回调activity) 也加入免混淆清单
主要目的是适配Android11
在项目的AndroidManifest.xml添加相关配置
-
- <provider android:name="android.support.v4.content.FileProvider"
- android:authorities="${applicationId}.fileprovider"
- android:exported="false"
- android:grantUriPermissions="true">
- <meta-data
- android: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")!!.path
- val 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
`false`: fail - */
- fun save(src: Bitmap, file: File, format: CompressFormat, recycle: Boolean): Boolean {
- var os: OutputStream? = null
- var ret = false
- try {
- 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()
- }
总结
抖音的文档还是很清楚的,最后清单文件完整是这个样子的
- <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>
-
-
- <activity
- android: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-data
- android:name="android.support.FILE_PROVIDER_PATHS"
- android:resource="@xml/file_provider_paths" />
- provider>
-
-
-
- application>
- manifest>