在年初的時候,公司的項目有個新的需求,在英文版的應用中加入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()內部,否則你的登陸信息將會丟失,固然了若是讀者能找到解決方案,天然再好不