轉自:http://www.apkbus.com/forum.php?mod=viewthread&tid=243427
前言】
如今的app當中,幾乎都包含了社會化分享的功能,來兩張圖see 一 see:
好在這種分享功能已經有第三方平臺幫我們做好了,我們直接調用其SDK即可。市面上做社會化分享平臺的比較好平臺的有:mob等。
今天我們就用mob的平臺做分享吧,官網地址是: http://www.mob.com/
怎么樣?光看這個網站的首頁就碉堡了吧?好了不廢話,進入正題。
開發環境:IDE版本:Android Studio 1.2物理機版本:Win7旗艦版(64位)一、獲取SDK并解壓:打開網站首頁后,上圖中的箭頭處正是我們所需要的ShareSDK。那我們就先將SDK下載下來吧。
上圖中,點擊箭頭處,進行下載。
上圖中的箭頭處所示,我們需要的是Android的SDK,所以將其下載下來。
上圖中,單機箭頭處正式下載,彈出如下界面:
上圖中,選擇我們所需要的社交平臺進行下載吧,這里面,我選擇:新浪微博、微信、QQ、QQ空間。
下載完了之后,解壓,就是下面這個樣子:
ShareSDK在“ ShareSDK for Android ”目錄下,此目錄中的“Libs”包含了“MainLibs”文件夾(核心庫)和“OnekeyShare”文件夾(快捷分享庫)。截圖如下:
“ShareSDK for Android Services”包含ShareSDK已經發布的“插件服務”,暫時只提供了“評論與贊”服務,我們不需要這個哈。
二、在ShareSDK官網進行注冊:在官網注冊賬號獲得ShareSDK的Appkey:
然后選擇應用名稱和平臺:
應用創建成功后,效果如下:
上圖中的 App Key 要記住,因為我們稍后要用。
單擊紅框部分的“應用信息”,可以添加一些信息,這些信息可有可無哈。
二、在各大社交平臺注冊:如果你想新浪微博,就必須在新浪開放平臺上將這個app注冊一下,不然新浪是不會無緣無故讓你分享的;分享到微信和QQ的道理是一樣的。
參考鏈接:
ShareSDK各社交平臺申請APPkey 的網址及申請流程匯總:http://bbs.mob.com/forum.php?mod=viewthread&tid=275
1、新浪開放平臺注冊:參考鏈接: http://bbs.mob.com/thread-89-1-4.html
登陸微博開放平臺: http://open.weibo.com/
圖文操作如下:
上圖中,填好應用名稱,選好“應用平臺”,然后單擊“創建”即可。
上圖中,單擊左側的“基本信息”,可以看到新浪微博的App Key、App Secret(紅框部分),這個信息稍后需要填到我們工程中的ShareSDK.xml中對應的<SinaWeibo>標簽中去。
上圖中,單擊左側的“高級信息”,然后填寫紅框部分的網址,填的這個網址稍后需要填到我們工程中的ShareSDK.xml中對應的<SinaWeibo>標簽的RedirectUrl屬性中去。
上圖的網址中,需要填寫一個可以打開的網址即可,比如這個:http://www.baidu.com/
,不然分享的時候很可能會報下面的錯誤:
這個錯誤可以參考下面這個鏈接:
新浪微博error:redirect_uri_mismatch的解決方法:http://bbs.mob.com/forum.php?mod=viewthread&tid=50
至于微信開放平臺、QQ空間開放品臺的申請是類似的,只不過微信開放平臺的審核是需要時間的。
另外需要說明的是:
在新浪微博和QQ的開放平臺注冊的應用,即使審核不通過,也可以得到AppKey進行分享;而微信開放平臺申請的應用需要審核成功之后才能得到AppKey進行分享(我自己是等了一天的時間才得到了app審核通過的通知)
2、微信開放平臺注冊:我們需要在微信開放平臺進行注冊: http://open.weixin.qq.com/
參考鏈接:
微信開放平臺申請流程: http://bbs.mob.com/thread-95-1-4.html
核心是要填“應用簽名”,也就是下面這張圖:(簽名工具的apk安裝包見附件)
參考鏈接:
騰訊開放平臺申請流程: http://bbs.mob.com/thread-98-1-4.html
申請網址: http://open.qq.com/
打開Android Studio,先新建一個名為ShareDemo的PRoject,然后開始導入sdk。
這里面我們就不用復制jar包的方式了,因為jar包不方便改源碼。 我們采用新建Library module的方式來導入SDK 。當然了,如果你非要用復制jar包的方式來做,可以參考官方鏈接: http://mob.com/Index/mediaItem/id/158
還記得新建Library module以及引用library的步驟嗎?不清楚的話,可以去參考本人之前的博文:這里重復一下, 新建一個module形式的第三方library的通用步驟是:
新建一個library形式的module,刪掉這個module中src/main目錄里面的所有文件(包括刪掉java、res、AndroidManifest.xml)復制第三方庫的AndroidMainfest.xml、res、src文件(夾)到庫目錄的src/main目錄中將src/main目錄下的src目錄重命名(Shift+F6)為java我們將上圖中的兩個工程文件新建為兩個Library module:ShareSDK和OneKeyShare,記得要將下面的這個文件夾中的東西也要拷到MainLibs這個module的libs文件夾下:
然后,需要注意的是, OneKeyShare這個module是依賴于 ShareSDK 這個module;而app這個module是依賴于OneKeyShare這個module 。
2、添加應用信息:先在app這個module(即我們這個項目的module)下新建一個assets文件夾(即第三方資產目錄),操作如下:
然后,我們將上圖中的ShareSDK.xml文件復制到assets目錄下。
緊接著開始修改ShareSDK.xml文件中的代碼。這里以新浪微博為例:
[XML] 純文本查看 復制代碼?0102030405060708091011 | < ShareSDK AppKey = "修改成你在sharesdk后臺注冊的應用的appkey" /> <!-- ShareByAppClient標識是否使用微博客戶端分享,默認是false --> < SinaWeibo Id = "1" (自定義字段,整型,用于您項目中對此平臺的識別符) SortId = "1" (此平臺在您分享列表中的位置,整型,數值越大越靠后) AppKey = "568898243" (填寫您在新浪微博上注冊到的AppKey) AppSecret = "38a4f8204cc784f81f9f0daaf31e02e3" (填寫您在新浪微博上注冊到的AppSecret) RedirectUrl = "http://www.sharesdk.cn" (填寫您在新浪微博上注冊的RedirectUrl) ShareByAppClient = "false" (是否使用客戶端進行分享) Enable = "true" /> (布爾值,標記此平臺是否有效) |
代碼解釋:
02行:還記得之前說過AppKey有用嗎?這里就派上用場了,填上去就行了。
08行:需要先事先在新浪微博的開發者平臺注冊得到AppKey。也就是上面第三段中提到的內容。
12行:如果不想用這個分享平臺,可以將其設置為false。
總結:
ShareSDK的每一個平臺都具備SortId、Id、Enable字段,除此之外的字段(如新浪微博的AppKey、AppSecret、RedirectUrl、ShareByAppClient等字段)需要到目標平臺上注冊應用以后得到,請正確填寫這些字段的數據,否則ShareSDK無法完成授權,則后續的其它操作也將無法執行。
3、配置AndroidManifest.xml:(1)添加如下權限:(和application節點并列)
[XML] 純文本查看 復制代碼?123456789 | < uses-permission android:name = "android.permission.GET_TASKS" /> < uses-permission android:name = "android.permission.INTERNET" /> < uses-permission android:name = "android.permission.access_WIFI_STATE" /> < uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE" /> < uses-permission android:name = "android.permission.CHANGE_WIFI_STATE" /> < uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" /> < uses-permission android:name = "android.permission.READ_PHONE_STATE" /> < uses-permission android:name = "android.permission.MANAGE_ACCOUNTS" /> < uses-permission android:name = "android.permission.GET_ACCOUNTS" /> |
(2)在application節點下注冊下面的Activity:
[XML] 純文本查看 復制代碼?01020304050607080910111213 | < activity android:name = "com.mob.tools.MobUIShell" android:theme = "@android:style/Theme.Translucent.NoTitleBar" android:configChanges = "keyboardHidden|orientation|screenSize" android:screenOrientation = "portrait" android:windowSoftInputMode = "stateHidden|adjustResize" > < intent-filter > < data android:scheme = "tencent1104646053" /> < action android:name = "android.intent.action.VIEW" /> < category android:name = "android.intent.category.BROWSABLE" /> < category android:name = "android.intent.category.DEFAULT" /> </ intent-filter > </ activity > |
注意: MobUIShell的路徑是固定的,一定要在“cn.sharesdk.framework”下,因為它在Share-Core中。
之后,需要對上面的代碼進行以下修改:
上圖中,將紅框部分的數字改成在騰訊開放平臺申請到的AppId即可。
如果項目集成了微信,還需要添加以下WXEntryActivity,不然的話,mob后臺無法做微信的分享統計 :(在工程的包下新建wxapi目錄再放置WXEntryActivity)
WXEntryActivity.Java的代碼如下:
[Java] 純文本查看 復制代碼?01020304050607080910111213141516171819202122232425262728293031323334353637383940414243 | /* * 官網地站:http://www.mob.com * 技術支持QQ: 4006852216 * 官方微信:ShareSDK (如果發布新版本的話,我們將會第一時間通過微信將版本更新內容推送給您。如果使用過程中有任何問題,也可以通過微信與我們取得聯系,我們將會在24小時內給予回復) * * Copyright (c) 2013年 mob.com. All rights reserved. */ package com.smyhvae.sharedemo.wxapi; import android.content.Intent; import android.widget.Toast; import cn.sharesdk.wechat.utils.WXAppExtendObject; import cn.sharesdk.wechat.utils.WXMediaMessage; import cn.sharesdk.wechat.utils.WechatHandlerActivity; /** 微信客戶端回調activity示例 */ public class WXEntryActivity extends WechatHandlerActivity { /** * 處理微信發出的向第三方應用請求app message * <p> * 在微信客戶端中的聊天頁面有“添加工具”,可以將本應用的圖標添加到其中 * 此后點擊圖標,下面的代碼會被執行。Demo僅僅只是打開自己而已,但你可 * 做點其他的事情,包括根本不打開任何頁面 */ public void onGetMessageFromWXReq(WXMediaMessage msg) { Intent iLaunchMyself = getPackageManager().getLaunchIntentForPackage(getPackageName()); startActivity(iLaunchMyself); } /** * 處理微信向第三方應用發起的消息 * <p> * 此處用來接收從微信發送過來的消息,比方說本demo在wechatpage里面分享 * 應用時可以不分享應用文件,而分享一段應用的自定義信息。接受方的微信 * 客戶端會通過這個方法,將這個信息發送回接收方手機上的本demo中,當作 * 回調。 * <p> * 本Demo只是將信息展示出來,但你可做點其他的事情,而不僅僅只是Toast */ public void onShowMessageFromWXReq(WXMediaMessage msg) { if (msg != null && msg.mediaObject != null && (msg.mediaObject instanceof WXAppExtendObject)) { WXAppExtendObject obj = (WXAppExtendObject) msg.mediaObject; Toast.makeText( this , obj.extInfo, Toast.LENGTH_SHORT).show(); } } } |
同時,在清單文件中進行聲明:
[XML] 純文本查看 復制代碼?1234567 | <!--微信分享回調--> < activity android:name = ".wxapi.WXEntryActivity" android:configChanges = "keyboardHidden|orientation|screenSize" android:exported = "true" android:screenOrientation = "portrait" android:theme = "@android:style/Theme.Translucent.NoTitleBar" /> |
如果項目繼承了易信,方法類似,這里就不貼出來了,現在誰還用易信啊,哈哈哈···
4、添加代碼:集成ShareSDK至少需要在兩個位置添加代碼,包括:
(1)在項目的入口Activity,在其onCreate方法中插入下面的代碼進行初始化:(這個方法越早調用越好)
[Java] 純文本查看 復制代碼?1 | ShareSDK.initSDK( this ); |
如果不在所有的ShareSDK的操作之前調用這行代碼,就會拋出空指針異常。
(2)在項目出口Activity的onDestroy方法中第一行插入下面的代碼:
[Java] 純文本查看 復制代碼?1 | ShareSDK.stoPSDK( this ); |
上方這行代碼會結束ShareSDK的統計功能并釋放資源。如果這行代碼沒有被調用,那么“應用啟動次數”將會不準確,因為應用可能從來沒有被關閉過。
注意:initSDK是可以重復調用的,其實ShareSDK建議在不確定的時候調用這個方法來保證ShareSDK被正確初始化。而stopSDK一旦被調用了,就必須重新調用initSDK才能使用ShareSDK的功能,否則會出現空指針異常。
在代碼中調用此方法,即可打開一鍵分享功能進行分享:
[Java] 純文本查看 復制代碼?01020304050607080910111213141516171819202122232425 | private void showShare() { ShareSDK.initSDK( this ); OnekeyShare oks = new OnekeyShare(); //關閉sso授權 oks.disableSSOWhenAuthorize(); // 分享時Notification的圖標和文字 2.5.9以后的版本不調用此方法 //oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name)); // title標題,印象筆記、郵箱、信息、微信、人人網和QQ空間使用 oks.setTitle(getString(R.string.share)); // titleUrl是標題的網絡鏈接,僅在人人網和QQ空間使用 oks.setTitleUrl( "http://sharesdk.cn" ); // text是分享文本,所有平臺都需要這個字段 oks.setText( "我是分享文本,啦啦啦~" ); // imagePath是圖片的本地路徑,Linked-In以外的平臺都支持此參數 oks.setImagePath( "/sdcard/test.jpg" ); //確保SDcard下面存在此張圖片 // url僅在微信(包括好友和朋友圈)中使用 oks.setUrl( "http://sharesdk.cn" ); // comment是我對這條分享的評論,僅在人人網和QQ空間使用 oks.setComment( "我是測試評論文本" ); // site是分享此內容的網站名稱,僅在QQ空間使用 oks.setSite(getString(R.string.app_name)); // siteUrl是分享此內容的網站地址,僅在QQ空間使用 oks.setSiteUrl( "http://sharesdk.cn" ); // 啟動分享GUI oks.show( this ); } |
上面的這些代碼是官方給的,實際項目中可以放在按鈕的點擊事件中,根據需要去填寫。
代碼解釋:
14行: setText是需要分享的文本內容
16行: setImagePath是需要分享的本地圖片 。(如果是在真機當中,需要通過api去拿sd卡的路徑,即Environment.getExternalStorageDirectory()這個api)
五、正式開始寫代碼:(1)activity_main.xml布局文件:
[XML] 純文本查看 復制代碼?0102030405060708091011121314151617181920 | < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" xmlns:tools = "http://schemas.android.com/tools" android:layout_width = "match_parent" android:layout_height = "match_parent" android:orientation = "vertical" android:paddingBottom = "@dimen/activity_vertical_margin" android:paddingLeft = "@dimen/activity_horizontal_margin" android:paddingRight = "@dimen/activity_horizontal_margin" android:paddingTop = "@dimen/activity_vertical_margin" tools:context = ".MainActivity" > < TextView android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text = "@string/hello_world" /> < Button android:id = "@+id/button1" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text = "分享按鈕" /> </ LinearLayout > |
其實就是加了個button按鈕,用做分享的事件觸發。
(2)ShareSDK.xml中和新浪微博、微信、QQ有關的配置:
新浪微博:[XML] 純文本查看 復制代碼?12345678 | < SinaWeibo AppKey = "858316951" AppSecret = "52685221be9572d0fb99e35a7ba25364" Enable = "true" Id = "1" RedirectUrl = "http://www.baidu.com" ShareByAppClient = "true" SortId = "1" /> |
02行和03行的AppKey和AppSecret要換成你自己在新浪開放平臺注冊的信息。
06行:RedirectUrl里面的網址要改成可用的url地址,并且與新浪開放平臺的授權回調頁的網址一致,也就是下面這個:(在第三段中已經強調過了)
07行:如果設置為true,那就會用新浪微博的app來進行分享操作;如果你沒有安裝新浪微博的app,很可能會導致分享失敗。如果設置為false,那就會用網頁版的新浪微博進行分享。
微信和QQ的配置信息差不多,就不贅述了。(3)MainActivity.java:
[Java] 純文本查看 復制代碼?01020304050607080910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 | package com.smyhvae.sharedemo; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import cn.sharesdk.framework.ShareSDK; import cn.sharesdk.onekeyshare.OnekeyShare; public class MainActivity extends Activity implements View.OnClickListener { private Button button1; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener( this ); } //點擊按鈕,開始進行分享 @Override public void onClick(View v) { ShareSDK.initSDK( this ); OnekeyShare oks = new OnekeyShare(); //關閉sso授權 oks.disableSSOWhenAuthorize(); // title標題:微信、QQ(新浪微博不需要標題) oks.setTitle( "我是分享標題" ); //最多30個字符 // text是分享文本:所有平臺都需要這個字段 oks.setText( "我是分享文本,啦啦啦~http://uestcbmi.com/" ); //最多 40 個字符 // imagePath是圖片的本地路徑:除Linked-In以外的平臺都支持此參數 //oks.setImagePath(Environment.getExternalStorageDirectory() + "/meinv.jpg");//確保SDcard下面存在此張圖片 //網絡圖片的url:所有平臺 oks.setImageUrl( "http://7sby7r.com1.z0.glb.clouddn.com/CYSJ_02.jpg" );//網絡圖片rul // url:僅在微信(包括好友和朋友圈)中使用 oks.setUrl( "http://sharesdk.cn" ); //網友點進鏈接后,可以看到分享的詳情 // Url:僅在QQ空間使用 oks.setTitleUrl( "http://www.baidu.com" ); //網友點進鏈接后,可以看到分享的詳情 // 啟動分享GUI oks.show( this ); } } |
第39行中, 如果不想用本地的圖片,而是采用分享網絡的圖片 ,可以將這一行去掉,改為第42行。
提示:如果imagePath和imageUrl同時存在,imageUrl將被忽略。
六、運行效果:1、分享到新浪微博:(不采用客戶端進行分享的方式)運行效果如下:
第一次分享時,系統會彈出頁面讓你填寫你自己的新浪微博賬號,我第一次運行的時候已經填寫過了。
現在打開新浪微博,分享成功了:
什么?你覺得分享的圖片太小了不夠刺激?那點開大圖爽一下吧:(確實是分享成功了滴)
2、分享到新浪微博:(采用客戶端進行分享的方式)
運行之后,進行分享操作的界面如下:
分享成功之后的效果如下:
上圖的左下角顯示的是說“來自未通過審核應用”,但有時候會顯示手機的名字,很奇怪吧?咨詢了一下官方客服(官方客服的解答太耐心了,感激涕零),情況是這樣的:
如果不用客戶端進行分享(即ShareByAppClient=”false”):
app在新浪開放平臺沒通過審核,就會顯示“未通過審核應用”
app在新浪開放平臺通過了審核,就會顯示具體的app的名字
如果用客戶端進行分享(即ShareByAppClient=”true”):
app在新浪開放平臺沒通過審核,就會顯示“未通過審核應用”或者手機型號
app在新浪開放平臺通過了審核,顯示的是手機型號。效果如下:
3、分享到微信:
提示:記得要將生成簽名的apk安裝到手機,不然無法分享到微信哦。
3.1 分享到微信好友:留在微信后,效果如下:
3.2 分享到微信朋友圈:
4、分享到QQ、QQ空間:
運行效果:
4.1、分享到QQ好友:4.2、分享到QQ空間:
動態效果圖如下:
如果你還需要做一些細微的調整,那就需要多看官方的東西了,這里貼出兩個鏈接:
官網博客: http://mob.com/index.php/share/index/media/cid/11
【ShareSDK】常見問題匯總: http://bbs.mob.com/forum.php?mod=viewthread&tid=30&extra=page%3D1
【工程文件】
http://download.csdn.NET/detail/smyhvae/8818779
新聞熱點
疑難解答