在年初的时候,公司的项目有个新的需求,在英文版的应用中加入Facebook和Twitter分享功能。react
因为这个项目比较急,因此开发这个功能从预研到接入总共耗时一周。后来,在发了第一个英文正式版以后,在时间不是那么紧迫的状况下,将原来使用第三方库的Twitter分享,进行了重写,替换为Twitter官方SDK接入功能,耗时一周,因此从一开始的预研到最终定稿,总共花费时间两周。android
在预研Facebook的时候,在我印象中,好像没有什么困难的地方,一切进行得都还挺顺利的样子。接着看吧,随着笔者的回忆,困难与问题也许会慢慢浮出水面的。windows
1) 从上方地址中能够下载到Facebook official SDK;api
2) 从本身帐户下拉菜单中选择add a new app,而后跟着里面的操做一步一步进行便可,最后你会获得一个Facebook app id;session
3) 从 https://developers.facebook.com/docs/android/getting-started中能够看到 app
而后到能够执行这二条命令行之一的地方执行,能够获得一个公钥,而且将这个填写到(注意,在大部份windows下是不能执行以上命令的,因此笔者建议能够安装一个相似能够执行Linux命令的模拟器)composer
准备工做就这么多了,下面开始进行代码接入步骤了。maven
1) 集成Facebook SDK到项目中去:将准备工做中下载的Facebook SDK包放到项目中去,而后在gralde文件中加入代码ide
compile(name: 'facebook-android-sdk-4.10.0', ext: 'aar')
2) 在AndroidManifest.xml中加入布局
其中的APP_ID就是第二步中获得的值。
3) 在你主程序刚开始的地方,或者本身重写的Application类的onCreate()中加入:
FacebookSdk.sdkInitialize(getApplicationContext());
4) 组建要分享的内容而且调用分享代码便可,
ShareLinkContent.Builder shareLinkContentBuilder = new ShareLinkContent.Builder(); shareLinkContentBuilder.setContentDescription() .setContentTitle() .setContentUrl(); ShareLinkContent shareLinkContent = shareLinkContentBuilder.build(); if (ShareDialog.canShow(ShareLinkContent.class)) { ShareDialog.show((Activity)mContext, shareLinkContent); }
那么Facebook分享的内容差很少就是这么一些了。若是读者能跟着笔者走到这一步,相信目标近在咫尺了。
接下来,笔者要说一说关于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这一项单选按钮;
准备工做就这点,少吧。
buildscript { repositories { jcenter() maven { url 'https://maven.fabric.io/public' } } dependencies { classpath 'com.android.tools.build:gradle:1.5.0' // The Fabric Gradle plugin uses an open ended version to react // quickly to Android tooling updates classpath 'io.fabric.tools:gradle:1.+' } } apply plugin: 'com.android.application' //Put Fabric plugin after Android plugin apply plugin: 'io.fabric' repositories { jcenter() maven { url 'https://maven.fabric.io/public' } }
将这一段代码拷到主程序的build.gradld的第一行中,此处是声明一个maven库,从中咱们能够进行后续的下载包的工做。
compile('com.twitter.sdk.android:twitter:1.13.0@aar') { transitive = true; } compile('com.twitter.sdk.android:tweet-composer:1.0.3@aar') { transitive = true; } compile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') { transitive = true; } compile('com.twitter.sdk.android:tweet-ui:1.10.0@aar') { transitive = true; }
将这一段代码拷到该文件的dependencies中进行程序包的下载。能够看到里面有跟Twitter毫无关系的程序包,好比crashlytics。可是笔者将其列在此处,说明少了它仍是不行的,最起码程序没法正常经过编译。
在主程序目录下建立一个文件名为fabric.properties里面就写入
apiSecret=准备工做中的secret apiKey=准备工做中的key
到这里,这个文件就不用去动了,等下要用到插件的时候,这个文件会自动进行更新而且替换掉原来的secret值,这些都是正常的。
接下来进行代码的接入。
1) 在Androidmanifest.xml中加入
注意此处的这个值不可改变,直接拷贝便可;
2) 在本身的主程序开始处,或者是在重写的Application类的onCreate()中加入
TwitterAuthConfig authConfig = new TwitterAuthConfig(Constants.TWITTER_API_KEY, Constants.TWITTER_API_SECRET); Fabric.with(this, new Twitter(authConfig)); Fabric.with(this, new TwitterCore(authConfig), new TweetUi()); Fabric.with(this, new TwitterCore(authConfig), new TweetComposer(), new Crashlytics());
这个是为了加载你的受权信息;
3) 若是你的项目是要通过混淆的,那么就在混淆代码中加入
-dontwarn com.squareup.okhttp.** -dontwarn com.google.appengine.api.urlfetch.** -dontwarn rx.** -dontwarn retrofit.** -keepattributes Signature -keepattributes *Annotation* -keep class com.squareup.okhttp.** { *; } -keep interface com.squareup.okhttp.** { *; } -keep class retrofit.** { *; } -keepclasseswithmembers class * { @retrofit.http.* ; }
4) 将Twitter官方的登陆按钮写入到你本身的布局文件中去
而且在程序中能过findViewById()找到这个按钮,经过以下方法
loginButton = (TwitterLoginButton) findViewById(R.id.login_button); btnShowTweet = (Button) findViewById(R.id.btn_show_tweet); llTweets = (LinearLayout) findViewById(R.id.ll_tweets); btnShowTweet.setOnClickListener(this); loginButton.setCallback(new Callback() { @Override public void success(Result result) { // Do something with result, which provides a TwitterSession for making API calls TwitterAuthToken authToken = result.data.getAuthToken(); String token = authToken.token; String secret = authToken.secret; Toast.makeText(MainActivity.this, token + " " + secret, Toast.LENGTH_LONG).show(); //compose a tweet TweetComposer.Builder builder = new TweetComposer.Builder(MainActivity.this) .text("just setting up my Fabric.") .image(getImgUri()); builder.show(); //load tweets // TweetUtils.loadTweets(tweetIds, new Callback>() { // @Override // public void success(Result> result) { // for (Tweet tweet : result.data) { // llTweets.addView(new TweetView(MainActivity.this, tweet)); // } // } // // @Override // public void failure(TwitterException e) { // // } // }); //app card // final TwitterSession session = TwitterCore.getInstance().getSessionManager().getActiveSession(); // final Card card = new Card.AppCardBuilder(MainActivity.this).imageUri(getImgUri()).googlePlayId("com.medzone.twitterpic").build(); // final Intent intent = new ComposerActivity.Builder(MainActivity.this).session(session).card(card).createIntent(); // startActivity(intent); } @Override public void failure(TwitterException exception) { // Do something on failure Toast.makeText(MainActivity.this, "Error", Toast.LENGTH_LONG).show(); Log.d("hsc", exception.getMessage()); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // Pass the activity result to the login button. loginButton.onActivityResult(requestCode, resultCode, data); }
此处须要注意的是应该将你的代码写在success()内部,否则你的登陆信息将会丢失,固然了若是读者能找到解决方案,天然再好不