1. 背景

在年初的时候,公司的项目有个新的需求,在英文版的应用中加入Facebook和Twitter分享功能。

2. 完成情况

由于这个项目比较急,所以开发这个功能从预研到接入总共耗时一周。后来,在发了第一个英文正式版之后,在时间不是那么紧迫的情况下,将原来使用第三方库的Twitter分享,进行了重写,替换为Twitter官方SDK接入功能,耗时一周,所以从一开始的预研到最终定稿,总共花费时间两周。

3. 预研与接入

3.1 Facebook

在预研Facebook的时候,在我印象中,好像没有什么困难的地方,一切进行得都还挺顺利的样子。接着看吧,随着笔者的回忆,困难与问题也许会慢慢浮出水面的。

准备工作:

1) 从上方地址中可以下载到Facebook official SDK;

2) 从自己账户下拉菜单中选择add a new app,然后跟着里面的操作一步一步进行即可,最后你会得到一个Facebook app id;

3) 从 https://developers.facebook.com/docs/android/getting-started中可以看到 

然后到可以执行这二条命令行之一的地方执行,可以得到一个公钥,并且将这个填写到(注意,在大部份windows下是不能执行以上命令的,所以笔者建议可以安装一个类似可以执行Linux命令的模拟器)

准备工作就这么多了,下面开始进行代码接入步骤了。

1) 集成Facebook SDK到项目中去:将准备工作中下载的Facebook SDK包放到项目中去,然后在gralde文件中加入代码

  1. compile(name: 'facebook-android-sdk-4.10.0', ext: 'aar')

2) 在AndroidManifest.xml中加入

其中的APP_ID就是第二步中得到的值。

3) 在你主程序刚开始的地方,或者自己重写的Application类的onCreate()中加入:

  1. FacebookSdk.sdkInitialize(getApplicationContext());

4) 组建要分享的内容并且调用分享代码即可,

  1. ShareLinkContent.Builder shareLinkContentBuilder = new ShareLinkContent.Builder();
  2. shareLinkContentBuilder.setContentDescription()
  3. .setContentTitle()
  4. .setContentUrl();
  5. ShareLinkContent shareLinkContent = shareLinkContentBuilder.build();
  6. if (ShareDialog.canShow(ShareLinkContent.class)) {
  7. ShareDialog.show((Activity)mContext, shareLinkContent);
  8. }

那么Facebook分享的内容差不多就是这么一些了。如果读者能跟着笔者走到这一步,相信目标近在咫尺了。

3.2 Twitter

接下来,笔者要说一说关于Twitter分享的过程与心得。这里笔者只介绍使用Twitter官方文档来接入Twitter功能,至于如何使用第三方库来完成,下次有空的时候再另写一篇Blog吧。相比Facebook分享的接入,笔者以为Twitter要复杂的多。其中涉及的操作也比Facebook繁琐很多,但是whatever,笔者此时能在这里记录这篇Blog,总算是能说明这件事情过去了,不管遇到了哪些问题,也总算是解决了。

弯路

凡事并不总是按照我们所预想着的方向顺利发展的。在笔者进行Twitter分享的过程中,尤能体现这一点。首先说一说笔者一开始通过查网页的方式进行查资料。笔者第一次进入Twitter官方介绍是在以下地址https://dev.twitter.com/oauth,这里主要介绍的是如何进行用户进入Twitter平台的授权方式。当然了,Twitter平台在用户登录时有一个授权的过程,只是有些时候,我们平常用户不能看到而已。于是笔者就顺着这条路往下走,然后就走进了开源的授权代码中。因为这是一条弯路,所以笔者只介绍到这里,不要再前进了,但是读者要是能一直走到底的话,那就太厉害了。笔者是不想继续了。

正途

弯路总归还是少走一点的好,毕竟人生路并不长。

https://docs.fabric.io/此站点是Twitter官方文档,有兴趣的可以自行查看。笔者主要介绍自己根据此文档,并且成功进行Twitter分享的步骤。

准备工作:

1) 给自己的Android Studio安装一个Fabric插件:只要打开Android Studio中的设置下的plugins,一搜Fabric for Android Studio就可以安装了;

2) 到https://apps.twitter.com/中进行create new app,跟着里面的步骤一直走会得到一个app key和一个app secret,注意,如果要进行发推功能的话,那么在这个步骤中,不要忘记选择Read, Write and Access direct messages这一项单选按钮;

准备工作就这点,少吧。

  1. buildscript {
  2. repositories {
  3. jcenter()
  4. maven { url 'https://maven.fabric.io/public' }
  5. }
  6. dependencies {
  7. classpath 'com.android.tools.build:gradle:1.5.0'
  8. // The Fabric Gradle plugin uses an open ended version to react
  9. // quickly to Android tooling updates
  10. classpath 'io.fabric.tools:gradle:1.+'
  11. }
  12. }
  13.  
  14. apply plugin: 'com.android.application'
  15. //Put Fabric plugin after Android plugin
  16. apply plugin: 'io.fabric'
  17.  
  18. repositories {
  19. jcenter()
  20. maven { url 'https://maven.fabric.io/public' }
  21. }

将这一段代码拷到主程序的build.gradld的第一行中,此处是声明一个maven库,从中我们可以进行后续的下载包的工作。

  1. compile('com.twitter.sdk.android:twitter:1.13.0@aar') {
  2. transitive = true;
  3. }
  4. compile('com.twitter.sdk.android:tweet-composer:1.0.3@aar') {
  5. transitive = true;
  6. }
  7. compile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') {
  8. transitive = true;
  9. }
  10. compile('com.twitter.sdk.android:tweet-ui:1.10.0@aar') {
  11. transitive = true;
  12. }

将这一段代码拷到该文件的dependencies中进行程序包的下载。可以看到里面有跟Twitter毫无关系的程序包,比如crashlytics。但是笔者将其列在此处,说明少了它还是不行的,最起码程序无法正常通过编译。

在主程序目录下创建一个文件名为fabric.properties里面就写入

  1. apiSecret=准备工作中的secret
  2. apiKey=准备工作中的key

到这里,这个文件就不用去动了,等下要用到插件的时候,这个文件会自动进行更新并且替换掉原来的secret值,这些都是正常的。

接下来进行代码的接入。

1) 在Androidmanifest.xml中加入

注意此处的这个值不可改变,直接拷贝即可;
2) 在自己的主程序开始处,或者是在重写的Application类的onCreate()中加入

  1. TwitterAuthConfig authConfig = new TwitterAuthConfig(Constants.TWITTER_API_KEY, Constants.TWITTER_API_SECRET);
  2. Fabric.with(this, new Twitter(authConfig));
  3. Fabric.with(this, new TwitterCore(authConfig), new TweetUi());
  4. Fabric.with(this, new TwitterCore(authConfig), new TweetComposer(), new Crashlytics());

这个是为了加载你的授权信息;

3) 如果你的项目是要经过混淆的,那么就在混淆代码中加入

  1. -dontwarn com.squareup.okhttp.**
  2. -dontwarn com.google.appengine.api.urlfetch.**
  3. -dontwarn rx.**
  4. -dontwarn retrofit.**
  5. -keepattributes Signature
  6. -keepattributes *Annotation*
  7. -keep class com.squareup.okhttp.** { *; }
  8. -keep interface com.squareup.okhttp.** { *; }
  9. -keep class retrofit.** { *; }
  10. -keepclasseswithmembers class * {
  11. @retrofit.http.* ;
  12. }

4) 将Twitter官方的登录按钮写入到你自己的布局文件中去

并且在程序中能过findViewById()找到这个按钮,通过如下方法

  1. loginButton = (TwitterLoginButton) findViewById(R.id.login_button);
  2. btnShowTweet = (Button) findViewById(R.id.btn_show_tweet);
  3. llTweets = (LinearLayout) findViewById(R.id.ll_tweets);
  4. btnShowTweet.setOnClickListener(this);
  5. loginButton.setCallback(new Callback() {
  6. @Override
  7. public void success(Result result) {
  8. // Do something with result, which provides a TwitterSession for making API calls
  9. TwitterAuthToken authToken = result.data.getAuthToken();
  10. String token = authToken.token;
  11. String secret = authToken.secret;
  12. Toast.makeText(MainActivity.this, token + " " + secret, Toast.LENGTH_LONG).show();
  13. //compose a tweet
  14. TweetComposer.Builder builder = new TweetComposer.Builder(MainActivity.this)
  15. .text("just setting up my Fabric.")
  16. .image(getImgUri());
  17. builder.show();
  18.  
  19. //load tweets
  20. // TweetUtils.loadTweets(tweetIds, new Callback>() {
  21. // @Override
  22. // public void success(Result> result) {
  23. // for (Tweet tweet : result.data) {
  24. // llTweets.addView(new TweetView(MainActivity.this, tweet));
  25. // }
  26. // }
  27. //
  28. // @Override
  29. // public void failure(TwitterException e) {
  30. //
  31. // }
  32. // });
  33.  
  34. //app card
  35. // final TwitterSession session = TwitterCore.getInstance().getSessionManager().getActiveSession();
  36. // final Card card = new Card.AppCardBuilder(MainActivity.this).imageUri(getImgUri()).googlePlayId("com.medzone.twitterpic").build();
  37. // final Intent intent = new ComposerActivity.Builder(MainActivity.this).session(session).card(card).createIntent();
  38. // startActivity(intent);
  39. }
  40.  
  41. @Override
  42. public void failure(TwitterException exception) {
  43. // Do something on failure
  44. Toast.makeText(MainActivity.this, "Error", Toast.LENGTH_LONG).show();
  45. Log.d("hsc", exception.getMessage());
  46. }
  47. });
  48. }
  49.  
  50. @Override
  51. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  52. super.onActivityResult(requestCode, resultCode, data);
  53.  
  54. // Pass the activity result to the login button.
  55. loginButton.onActivityResult(requestCode, resultCode, data);
  56. }

此处需要注意的是应该将你的代码写在success()内部,不然你的登录信息将会丢失,当然了如果读者能找到解决方案,自然再好不

Android Facebook和Twitter分享的更多相关文章

  1. Android Facebook和Twitter登录和分享完整版

    最近公司的软件需要改国际版,需要Facebook和Twitter的登录和分享. 本人先用Umeng的第三方社会化分享实现了该功能,但是后来一想问题来了,经过查证.Umeng只在中国和美国有服务器,那也 ...

  2. 使用facebook和twitter进行分享经验总结

    凤凰涅槃,浴火重生. 在传说当中,凤凰是人世间幸福的使者,每五百年,它就要背负着积累于在人间的所有痛苦和恩怨情仇,投身于熊熊烈火中自焚,以生命和美丽的终结换取人世的祥和与幸福.同样在肉体经受了巨大的痛 ...

  3. facebook和twitter的截图分享

    记录一下代码,以后自己可以抄..我抄我自己=.= SDK的接入看之前的博客.所以话不多少,直接上代码(记得分享一定要安装原生app(FB和twitter),不然只通过网页分享无法发图片.),初始化都在 ...

  4. 移动端折腾国外分享(facebook、twitter、linkedin)

    一.前言 国内做HTML5页面,关注最多就是微信分享了,之前也写过关于微信分享的文章,可以点击查看:分享相关文章 再者,就是国内的其它分享,比如常用的新浪微博.腾讯微博.QQ空间等等,最方便的就是直接 ...

  5. web网页动态分享facebook和twitter

    介绍 facebook分享 http://www.facebook.com/sharer.php?t=${text}u=encodeURIComponent('静态html') twitter分享 h ...

  6. 分享前端Facebook及Twitter第三方登录

    最近公司要求做海外的第三方登录:目前只做了Facebook和Twitter;国内百度到的信息太少VPN FQ百度+Google了很久终于弄好了.但是做第三方登录基本上都有个特点就是引入必须的js,设置 ...

  7. SDK接入(1)之Android Facebook SDK接入

    SDK接入(1)之Android Facebook SDK接入 由于游戏已上线,且处于维护阶段,所以有空写写各种SDK接入过程和遇到的问题,也当作一种工作总结.SDK接入主流分为这么几类,登录.支付. ...

  8. 国外流行的共享网站实现:facebook,twitter,google+1,tumblr等待

    近期需要做相关的国外几个站点共享,本来我以为它会和weibo.在同样的烦恼空间,什么appkey啦,apptoken啦.api啦.结果非常意外的发现并非如此恼火. Twitter分享: https:/ ...

  9. 为什么中国出不了facebook和Twitter?

    我们坐拥全球最大基数的网民,我们拥有让人骄傲的四大发明,我们有有流传全世界的孙子兵法,可是在互联网时代,我们却落后了.互联网可以说是江山人才辈辈出,各领风骚三两年. 让我们来简单地回顾一下近几年的互联 ...

随机推荐

  1. jQuery之$('#id')和$('#'+id)

    最近在项目中使用$('#id')时,发现拿到的元素怎么都是空元素,(前提是id是作为变量),纠结了好一阵,使用fire bug也调试了半天终于发现原来$('#id')是使用整体来匹配,即查找id 为i ...

  2. [ASP.net教程]ASP.NET保存信息总结(Application、Session、Cookie、ViewState和Cache等)

    以下是关于ASP.NET中保存各种信息的对象的比较,理解这些对象的原理,对制作完善的程序来说是相当有必要的(摘至互联网,并非原创--xukunping)在ASP.NET中,有很多种保存信息的对象.例如 ...

  3. iOS 高级框架的介绍

    Core Data.Core Graphics.Core Animation 和 OpenGL ES 框架,是对于应用程序开发很重要的高级技术,因此需要花时间来学习和掌握. Core Data 框架管 ...

  4. Unity C#和OC互相调用

    Unity  两种方式 一般都是组合使用 1.[DllImport("__Internal")]  C#调用oc 2.UnitySendMessage        oc调用C# ...

  5. iptables_forward

    FORWARD 好了,我们接着往下走,这个包已经过了两个PREROUTING链了,这个时候,出现了一个分支转折的地方,也就是图中下方的那个菱形(FORWARD),转发!这里有一个对目的地址的判断(这里 ...

  6. XML HttpRequest

    XMLHttpRequest对象提供了在网页加载后与服务器进行通信的方法. 使用XMLHttpRequest对象,能够: 在不重新加载页面的情况下更新网页 在页面已加载后从服务器请求数据,接受数据 在 ...

  7. caffe编译关于imread问题的解决

    change Makefile: LIBRARIES += glog gflags protobuf leveldb snappy \ lmdb boost_system hdf5_hl hdf5 m ...

  8. 【avalon源码】

    1. document.getElementsByTagName('head')[0] document.head 2. 3. var IEVersion = NaN if (window.VBArr ...

  9. dede文章摘要字数的设置方法

    本文转自:http://blog.csdn.net/yxwmzouzou/article/details/17491991 在织梦系统中(针对5.7版本),文章摘要(可以通过以下四种相关标签调用)被设 ...

  10. Think Python - Chapter 12 Tuples

    12.1 Tuples are immutable(元组是不可变的)A tuple is a sequence of values. The values can be any type, and t ...