抖音接入避雷指南,你值得拥有!

640?wx_fmt=jpeg


/   今日科技快讯   /


昨日,美国太空探索技术公司SpaceX首席执行官埃隆·马斯克开始介绍其星际飞船项目取得的最新进展以及未来计划。星际飞船是一种大型航天器,旨在将人们送往月球、火星等太空目的地。星际飞船的概念在过去几年中已经多次改变,现在马斯克计划揭示其最新蓝图。


/   作者简介   /


大家早上好,明天就是国庆长假了,本着非工作日不发文的原则,明天起本公众号也会进行一段时间的休息。这里祝大家国庆节快乐,同时也祝祖国繁荣昌盛,我们节后再见!


本篇文章来自海王星0908的投稿,分享了他对接入抖音过程遇到的一些问题的总结,相信会对大家有所帮助!同时也感谢作者贡献的精彩文章。


海王星0908的博客地址:

https://blog.csdn.net/magic0908


/   前言   /


抖音作为日活量过亿的产品,在今年年初,也终于上线了抖音开放平台,目前支持app接入登录与分享。app通过抖音授权获取用户信息;分享视频并进行处理,提高app在抖音的曝光度。


刚好项目有个新需求,需要集成抖音登录与分享。本以为不就是接个SDK嘛,湿湿水啦!但是bug总与我相伴!且听我慢慢道来。


/   正文   /


导入依赖


在项目根目录build.gradle里添加maven:


 

allprojects {
    repositories {
        ……
        maven { url 'https://dl.bintray.com/aweme-open-sdk-team/public' }
    }
}


接着在app目录的build.gradle添加依赖:


 

dependencies {
    implementation 'com.bytedance.ies.ugc.aweme:open-sdk:0.0.1.3'
}


别忘了在manifest添加权限并处理,最后同步项目:


 

<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" />


集成抖音分享


在Application中,onCreate方法下初始化TikTokOpenApiFactory。


 

String clientkey = "xxx"// 到开发者网站申请并替换
TikTokOpenApiFactory.init(new TikTokOpenConfig(clientkey));


分享视频


 

//视频文件路径
private ArrayList<String> mUri = new ArrayList<>();
mUri.add("xxx.video-path");

// 初始化api,需要传入targetApp
TiktokOpenApi tiktokOpenApi = 
        TikTokOpenApiFactory.create(this, TikTokConstants.TARGET_APP.AWEME);

// 初始化Share
Share.Request request = new Share.Request();
TikTokVideoObject videoObject = new TikTokVideoObject();
videoObject.mVideoPaths = mUri;
TikTokMediaContent content = new TikTokMediaContent();
content.mMediaObject = videoObject;
request.mMediaContent = content;
//配置完成后,调用share方法唤起抖音app
tiktokOpenApi.share(request);


接收回调


两种方式接收回调信息:


  1. 在包名下创建.tiktokapi.TikTokEntryActivity,初始化TTOpenApi,实现 TikTokApiEventHandler接口,在onResp方法中回调结果。(和微信回调类似)

  2. 自定义接收回调全路径


比如需要回调的activity路径为:


 

com.douyin.share.TikTokEntryActivity


则在前面传分享参数时指定回调全路径:


 

request.callerLocalEntry = com.douyin.share.TikTokEntryActivity


回调activity实现TikTokApiEventHandler接口,并在manifest中注册activity,添加android:exported=“true”,然后在onResp方法接收回调:


 

public void onResp(BaseResp resp) {
     if (resp.getType() == TikTokConstants.ModeType.SHARE_CONTENT_TO_TT_RESP) {
         switch (resp.errorCode){
                case TikTokConstants.BaseErrorCode.OK:
                    Toast.makeText(this"分享成功",Toast.LENGTH_SHORT).show();
                    break;
                case TikTokConstants.BaseErrorCode.ERROR_UNKNOW:
                    Toast.makeText(this"未知错误",Toast.LENGTH_SHORT).show();
                    break;
                case TikTokConstants.BaseErrorCode.ERROR_CANCEL:
                    Toast.makeText(this"取消分享",Toast.LENGTH_SHORT).show();
                    break;
            }
     }
     finish();
}


OK!至此我们就可以接收分享回调了!心情别提有多愉快!!来看看效果:


640?wx_fmt=gif


what!我取消分享后,虽然弹出了Toast,但是并没有回到我们的app,而是留在抖音。这就坑了!微信取消分享后都可以回到app,但是抖音就不行。估计是我哪里配置不对,去扒官方文档,在FQA里发现了这样一段话:


640?wx_fmt=png


就是说,抖音在回调activity的时候,这个类是通过singleInstance启动的,如果想回到应用,也有办法,注意画红线的部分,“启动自己app的类跳回自己app的栈”,我将信将疑的照做了,在onResp方法启动MainActivity。


 

public void onResp(BaseResp resp) {
     if (resp.getType() == TikTokConstants.ModeType.SHARE_CONTENT_TO_TT_RESP) {
         ……
         //添加这行代码
         startActivity(new Intent(this, MainActivity.class));
     }
     finish();
}


我们再来跑一遍:


640?wx_fmt=gif


没毛病,好像是成功了!?嗯?有点怪,页面启动分享的按钮怎么不见了!我继续按返回键操作:


640?wx_fmt=gif


what!按下返回键后,又回到了抖音主界面,再接着按返回键,才回到我们的app(有启动分享的按钮)。这就坑了,文档不是说启动自己app的类就能回到自己app的栈吗?我好奇的打开了手机任务栈,发现:


640?wx_fmt=png


坑!怎么我自己app的界面跑到抖音的进程里了?


分析


我们来捋一捋这些场景,并结合官方文档来分析。文档描述,tiktok回调这个类是通过singleInstance的,即抖音回调activity的时候,是通过singleInstance启动TikTokEntryActivity的,这个时候的TikTokEntryActivity运行在独立的任务栈里,属于前台任务。


当调用到TikTokEntryActivity的onResp方法,执行到startActivity(new Intent(this, MainActivity.class)),启动MainActivity并finish自己,这个时候抖音的任务栈属于前台任务栈,那么自然而然的,新启动的MainActivity就依附在抖音的任务栈上。接着再按返回键,退出了抖音的任务栈,最后才回到自己app的任务栈。


探索方案


OK!知道了原因,对应的解决方案也就有了。在TikTokEntryActivity调用finish后,我们只需要将MainActivity拉回自己app的任务栈,那么不就可以搞定了吗?想法是好,但是还会有两个问题:


  1. 如何将MainActivity拉回自己app的任务栈?

  2. 接收回调后,不一定是跳转到MainActivity,而是怎么回到启动分享的那个activity?


第一个问题好解决,把MainActivity的启动模式设置为singleTask就行了;第二个问题,怎么回到启动分享的那个activity?比如一个实际的场景,A是根activity,A可以启动B或者启动C,然后B和C都可以唤起抖音分享,那么分享后回到哪个activity得知道,也就是需要知道栈顶activity。就跟唤起微信,取消分享的场景一样(不知道抖音为什么不做成和微信一样的处理方式,还需要开发者额外处理)。


把问题1和2结合起来就是:


接收回调后,如何跳转到启动分享的那个activity?(即自己app栈的栈顶activity)。


从shareSDK找线索


具体怎么做?搜索了一番,发现shareSDK是支持抖音分享的,可以扒它们抖音SDK模块的jar包看看是怎么处理的?下载shareSDK官方demo,用Android Studio打开后,在依赖包目录下找到了关于抖音模块的代码。


640?wx_fmt=png


DouYinHandlerActivity,没错,就是这个类,其中有一个方法引起了我的注意:


640?wx_fmt=png


很明显,shareSDK的处理是在onDestroy方法,创建Intent,并通过隐式启动来跳转到自己app的任务栈。action的值表示需要在manifest对应的activity去添加,flags被混淆成了数字,反编译后发现是FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP,对应:


 

Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP


找到办法后我欣喜若狂,赶紧参照该方法处理。发现可以跳转到自己app,但是有时候会失效!后来还下载了shareSDK的apk测试,也发现偶尔会有失效的问题。看来这个办法不够完美,只能继续寻找方案。


从竞品找线索


然后,在抖音开放平台官网发现,轻颜相机是目前市面上集成了抖音SDK的app,我赶紧下载测试:


640?wx_fmt=gif


可以看到,轻颜相机是可以回到自己app的。那么轻颜相机是怎么做的呢?扒了下源码,最终靠懵 + 猜,发现了如下的方法:


 

public int c(d paramd) {
   ……
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append(this.mActivity.getPackageName());
    stringBuilder.append(".wttsharesdk.WttShareActivity");
    String str = stringBuilder.toString();
    ComponentName componentName = 
        new ComponentName(this.mActivity.getPackageName(), str);
    Intent intent = new Intent();
    intent.setComponent(componentName);
    this.mActivity.startActivity(intent);
    ……
}


逻辑是使用StringBuilder拼接activity路径,然后通过ComponentName隐式启动startActivity,回到自己的app。至此,我们来整理下思路,首先我们可以获取到自己app栈顶activity(这个activity必须是singleTask模式),拿到ComponentName,再通过隐式Intent跳转,不就能回到自己app任务栈了吗?


开搞,代码实现:


 

……
private String getTopClassName(){
     ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
     List<ActivityManager.RunningTaskInfo> taskInfos = manager.getRunningTasks(1);
     if (taskInfos != null && taskInfos.size() != 0){
         ComponentName componentName = taskInfos.get(0).topActivity;
         //拿到栈顶的activity className
         return componentName.getClassName();
     }
     return "";
}

private void openComponent(){
     String className = getTopClassName();
     if (!className.isEmpty()){
         ComponentName componentName = 
             new ComponentName(getPackageName(),className);
         Intent intent = new Intent();
         intent.setComponent(componentName);
         startActivity(intent);
     }
}
……


在onResp()里调用openComponent():


 

public void onResp(BaseResp resp) {
     if (resp.getType() == TikTokConstants.ModeType.SHARE_CONTENT_TO_TT_RESP) {
          ……
         openComponent();
     }
     finish();
}


注意栈顶activity需要设置launchMode=“singleTask”,至于为什么,稍后解释。


 

<activity
     android:name=".MainActivity"
     android:launchMode="singleTask">
</activity>


我们来看看修改后的效果:


640?wx_fmt=gif


可以看到,分享后按返回键正常回到了自己的app,继续返回,退出app任务栈;接着回到抖音的任务栈,再返回,最后回到桌面,具体流程如下图:


640?wx_fmt=png


大概分三步:


  1. app栈顶activityB唤起抖音分享,启动模式为singleTask;

  2. 分享结束后,抖音启动TikTokEntryActivity,启动模式为singleInstance,回调onResp;

  3. TikTokEntryActivity调用finish,并通过Component启动栈顶的activityB,由于activityB已存在实例,系统重用该实例并调到栈顶,将任务栈拉回前台。


/   总结   /


至此,整体看下来,主要还是对activity启动模式的理解程度,以及反编译的一些相关知识,虽然平时接触不多,但是当真正遇到问题的时候,我们有了思路,才会体现出自己肚子里有多少墨水,从容应对。


推荐阅读:





欢迎关注我的公众号

学习技术或投稿


640.png?


640?wx_fmt=jpeg

长按上图,识别图中二维码即可关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/64594.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BottomSheetDialogFragment仿制抖音评论框

没有效果图的示例简直就是扯淡 BottomSheetDialogFragment BottomSheetDialogFragment 继承自 AppCompatDialogFragment&#xff0c;官方解释为模态底部表&#xff0c;是 DialogFragment 的一个版本&#xff0c;它使用的是 BottomSheetDialog&#xff0c;而不是浮动对话框。Bo…

uniapp 抖音授权登录、发布、分享 Ba-Aweme

简介&#xff08;下载地址&#xff09; Ba-Aweme 是一个集成抖音的uniapp插件&#xff0c;支持抖音授权登录&#xff0c;发布图片、视频&#xff0c;分享到联系人群组&#xff0c;直接拍摄等。自带选择图片和选择视频方法。 注意&#xff1a; 使用前&#xff0c;先到抖音开放…

四,产品创建和开发板连接天猫精灵后台

一&#xff0c;WiFi设备接入天猫精灵 https://living.aliyun.com/建议使用Chrome浏览器 接入流程&#xff1a; 产品的product secret: 手机下载天猫精灵app&#xff0c;扫码配网。 测试设备&#xff1a; 设备三元组&#xff1a; “product_secret”: Vkj0eNbl…

【蓝牙Mesh笔记 ①】ESP32-C3 模组上实现天猫精灵蓝牙 BLE Mesh AliGenie 接入,无需WiFi 连接也可以实现天猫精灵语音控制。

本系列博客学习由非官方人员 半颗心脏 潜心所力所写&#xff0c;仅仅做个人技术交流分享&#xff0c;不做任何商业用途。如有不对之处&#xff0c;请留言&#xff0c;本人及时更改。 系列一&#xff1a;ESP32系列模组基础学习系列笔记 1、 爬坑学习新旅程&#xff0c;虚拟机搭…

我们需要为机器人行业做点事?

本文内容基于近段时间国内外几个比较火热的事件的有感&#xff0c;做一些联想&#xff0c;科技的未来在哪里&#xff1f; 1.chatgpt的出现&#xff0c;科技巨头们都开始向大模型概念进行业务延伸&#xff08;阿里、百度、讯飞、360、包括今天刚得到的消息&#xff0c;华为也准…

AIGC+机器人=具身智能?硅谷最酷的两个男人不谋而合预演“下个浪潮”

收集整理|小鱼新的AI题材层出不穷&#xff0c;这次轮到“机器人AI"融合而成的具身智能概念。 “硅谷钢铁侠"马斯克和热爱黑色皮衣的"显卡教父”黄仁勋均作出积极表态&#xff0c;可谓不谋而合。 当地时间5月16日&#xff0c;特斯拉2023年年度股东大会召开&…

微软的焦虑?想多了!从.NET6 Preview2到大厂招聘,起飞

看了篇文章叫《从.NET看微软的焦虑》&#xff0c;这里忍不住先吐槽一下&#xff0c;看完不仅毫无收获&#xff0c;而且有一种先起个夺眼球的标题&#xff0c;然后再东拼西凑找证据。讲真的&#xff0c;微软市值基本上等于“阿里腾讯百度”三者之和&#xff0c;居然还焦虑的无法…

帆软BI产品FineBI下一个强硬对手——Metabase

在商业BI产品中&#xff0c;国内的FineBI&#xff08;帆软的FineReport报表工具之外的另一款BI产品&#xff09;处于领先地位&#xff0c;这些年大大小小的开源BI系统出了不少&#xff0c;但对Tableau、FineBI这类商业软件的影响其实并不是很大&#xff0c;主要原因是这些开源软…

打造一个window桌面应用:在线聊天对话机器人

大家好&#xff0c;我是辰哥~~~ 本文目标&#xff1a;打造一个window桌面应用&#xff1a;在线聊天对话机器人。 今天辰哥教大家做一个在线聊天对话机器人桌面应用&#xff0c;已经打包成exe可执行文件&#xff0c;读者可以直接拿来使用&#xff0c; 先上演示图 聊天客户端桌…

小Pang聊嵌入式界面开发

怎么说呢&#xff0c;昨天与嵌入式界面开发高手小Pang,聊了一下嵌入式界面开发方面的东西&#xff0c;小Pang也是很多经验的开发人员了&#xff0c;对这方面&#xff0c;是他的拿手好戏&#xff0c;官方的说&#xff0c;他是这方面的权威&#xff0c;个人来说&#xff0c;他是这…

跟随CSDN走进微软

文章目录 前言一、微软亚洲研究院(MSRA)&#xff1f;二、走进MSRA1.微软的技术发展及愿景2.工作环境 总结 前言 作为CSDN新刊物《新程序员》的读者&#xff0c;我很荣幸参加了CSDN走进微软的活动&#xff0c;见识到了名企的风范&#xff0c;也见到了许多研究院的前沿科技&…

拓扑梅尔智慧办公平台(Topomel Box) 3.0发布

今天&#xff0c;2022年12月21日&#xff0c;我很高兴地宣布&#xff1a;拓扑梅尔智慧办公平台(Topomel Box)的3.0版本正式发布。 下面&#xff0c;请允许我简单地介绍下新版本的一些基本情况。 新特性 1) 统一的文件管理 将所有你关心的文件都统一存放在同一个地方&#xff…

Android:“金九银十”战役打响还没看到跟BAT大佬的差距就危险了!来看看如何在大厂面试一击而中

前言 金九银十已来临&#xff0c;打响九月第一战&#xff01;开启中长线布局策略。 想必现在有许多朋友&#xff0c;都在为即将到来的金三银四做准备&#xff0c;不知道各位朋友是否十足的把握能拿到自己心仪的Offer呢&#xff1f; 下面无偿分享一些我多年面试和工作经验给你…

面试BAT、Facebook、微软、网易等大厂经验分享(获得8个offer)

背景 最近陆陆续续已经开始校招&#xff08;秋招&#xff09;了&#xff0c;现在分享下石头当年参加校招的一些经历。本文最早是发布在 blog 上的&#xff0c;现在通过公众号分享给大家&#xff0c;当然会在原有的基础上做了调整。 幸亏当年有记录&#xff0c;不然现在回想肯…

Teams Tab App 的 manifest 分析

上一篇文章我们深入来分析了 tab app 的代码&#xff0c;这篇文章我们研究一下 manifest。 Teams 的 manifest 实际上是一个很复杂的 json&#xff0c;里面的配置非常多&#xff0c;之前的文章陆陆续续的讲过一些配置&#xff0c;我们在这篇文章里来看看关于 tabs 的一些配置&…

2020最新BAT Android高端技术面试145题详解

前言 本篇是结合我之前面试别人的经验&#xff0c;以及跟一些在BAT上班的朋友&#xff0c;讨论总结出的一份很全面的大公司需要用到的一些高端Android技术。这里也专门整理了一个文档&#xff0c;重点和难点都有详细解析。这些题目有点技术含量&#xff0c;需要好点时间去研究…

百度文心一言推出内测专用独立 App;暴雪回应被网易起诉:未收到相关诉状;iOS 17或支持第三方应用商店 | 极客头条

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#x…

真的来了!百度文心一言APP在哪里下载?跟网页版有什么区别?

此前百度公开宣布文心一言没有APP&#xff0c;所有文心一言APP都是假的。并针对文心一言盗版APP进行举证上诉&#xff0c;还对苹果应用商店起诉。时隔半个多月&#xff0c;今天上午&#xff0c;小宝在文心一言官方网站上看到内测专用APP下载链接&#xff0c;真正的文心一言APP终…

谷歌新大模型明夜就发/ 菜鸟冲刺IPO/ 苹果新增Siri录屏...今日更多新鲜事在此...

日报君 发自 凹非寺量子位 | 公众号 QbitAI 大家好&#xff0c;今天是5月9日星期二&#xff0c;有很多新产品即将发布的消息呢~ 话不多说&#xff0c;赶快和日报君一起来看看吧。 iOS 16.5下周发布&#xff0c;可用Siri录屏 你的Siri&#xff0c;很快就可以用来录屏了。 快科技…

话费直充/三网直冲/联通直充/电信直充/移动直充/系统源码

介绍&#xff1a; 系统特性: ①、移动&#xff0c;联通&#xff0c;电信话费使用wxH5/宝H5&#xff08;可根据客户定制&#xff09; ②、移动话费/联通话费/电信话费额度支持1-任意额度&#xff08;不得超过官网所支持的额度&#xff09; ③、系统实测每分钟订单量订单1500单左…