【聲明】 php
歡迎轉載,但請保留文章原始出處→_→ html
生命壹號:http://www.cnblogs.com/smyhvae/java
文章來源:http://www.cnblogs.com/smyhvae/p/4585340.html
android
【前言】ios
現在的app當中,幾乎都包含了社會化分享的功能,來兩張圖see 一 see:api
好在這種分享功能已經有第三方平臺幫咱們作好了,咱們直接調用其SDK便可。市面上作社會化分享平臺的比較好平臺的有:mob等。微信
今天咱們就用mob的平臺作分享吧,官網地址是:http://www.mob.com/網絡
怎麼樣?光看這個網站的首頁就碉堡了吧?好了不廢話,進入正題。app
開發環境:ide
IDE版本:Android Studio 1.2
物理機版本:Win7旗艦版(64位)
1、獲取SDK並解壓:
打開網站首頁後,上圖中的箭頭處正是咱們所須要的shareSDK。那咱們就先將SDK下載下來吧。
上圖中,點擊箭頭處,進行下載。
上圖中的箭頭處所示,咱們須要的是Android的SDK,因此將其下載下來。
上圖中,單機箭頭處正式下載,彈出以下界面:
上圖中,選擇咱們所須要的社交平臺進行下載吧,這裏面,我選擇:新浪微博、微信、QQ、QQ空間。
下載完了以後,解壓,就是下面這個樣子:
ShareSDK在「ShareSDK for Android」目錄下,此目錄中的「Libs」包含了「MainLibs」文件夾(核心庫)和「OnekeyShare」文件夾(快捷分享庫)。截圖以下:
「ShareSDK for Android Services」包含ShareSDK已經發布的「插件服務」,暫時只提供了「評論與贊」服務,咱們不須要這個哈。
2、在ShareSDK官網進行註冊:
在官網註冊帳號得到ShareSDK的Appkey:
而後選擇應用名稱和平臺:
應用建立成功後,效果以下:
上圖中的App Key要記住,由於咱們稍後要用。
單擊紅框部分的「應用信息」,能夠添加一些信息,這些信息無關緊要哈。
2、在各大社交平臺註冊:
若是你想分享到新浪微博,就必須在新浪開放平臺上將這個app註冊一下,否則新浪是不會平白無故讓你分享的;分享到微信和QQ的道理是同樣的。
參考連接:
ShareSDK各社交平臺申請APPkey 的網址及申請流程彙總:http://bbs.mob.com/forum.php?mod=viewthread&tid=275
一、新浪開放平臺註冊:
參考連接:http://bbs.mob.com/thread-89-1-4.html
登錄微博開放平臺:http://open.weibo.com/
圖文操做以下:
上圖中,填好應用名稱,選好「應用平臺」(固然也能夠同時勾選"iPhone",這樣的話,android平臺和ios平臺就能夠共用同一個appId了),而後單擊「建立」便可。
上圖中,單擊左側的「基本信息」,能夠看到新浪微博的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審覈經過的通知)
二、微信開放平臺註冊:
咱們須要在微信開放平臺進行註冊: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/
4、各類配置:
一、導入SDK到工程文件:
打開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:ShareSDK和OneKeyShare,記得要將下面的這個文件夾中的東西也要拷到MainLibs這個module的libs文件夾下:
而後,須要注意的是,OneKeyShare這個module是依賴於ShareSDK這個module;而app這個module是依賴於OneKeyShare這個module。
二、添加應用信息:
先在app這個module(即咱們這個項目的module)下新建一個assets文件夾(即第三方資產目錄),操做以下:
而後,咱們將上圖中的ShareSDK.xml文件複製到assets目錄下。
緊接着開始修改ShareSDK.xml文件中的代碼。這裏以新浪微博爲例:
1 <ShareSDK 2 AppKey = "修改爲你在sharesdk後臺註冊的應用的appkey"/> 3 4 <!-- ShareByAppClient標識是否使用微博客戶端分享,默認是false --> 5 <SinaWeibo 6 Id="1" (自定義字段,整型,用於您項目中對此平臺的識別符) 7 SortId="1" (此平臺在您分享列表中的位置,整型,數值越大越靠後) 8 AppKey="568898243" (填寫您在新浪微博上註冊到的AppKey) 9 AppSecret="38a4f8204cc784f81f9f0daaf31e02e3" (填寫您在新浪微博上註冊到的AppSecret) 10 RedirectUrl="http://www.sharesdk.cn" (填寫您在新浪微博上註冊的RedirectUrl) 11 ShareByAppClient="false" (是否使用客戶端進行分享) 12 Enable="true" /> (布爾值,標記此平臺是否有效)
代碼解釋:
02行:還記得以前說過AppKey有用嗎?這裏就派上用場了,填上去就好了。
08行:須要先事先在新浪微博的開發者平臺註冊獲得AppKey。也就是上面第三段中提到的內容。
12行:若是不想用這個分享平臺,能夠將其設置爲false。
總結:
ShareSDK的每個平臺都具有SortId、Id、Enable字段,除此以外的字段(如新浪微博的AppKey、AppSecret、RedirectUrl、ShareByAppClient等字段)須要到目標平臺上註冊應用之後獲得,請正確填寫這些字段的數據,不然ShareSDK沒法完成受權,則後續的其它操做也將沒法執行。
三、配置AndroidManifest.xml:
(1)添加以下權限:(和application節點並列)
<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:
<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的代碼以下:
1 /* 2 * 官網地站:http://www.mob.com 3 * 技術支持QQ: 4006852216 4 * 官方微信:ShareSDK (若是發佈新版本的話,咱們將會第一時間經過微信將版本更新內容推送給您。若是使用過程當中有任何問題,也能夠經過微信與咱們取得聯繫,咱們將會在24小時內給予回覆) 5 * 6 * Copyright (c) 2013年 mob.com. All rights reserved. 7 */ 8 package com.smyhvae.sharedemo.wxapi; 9 import android.content.Intent; 10 import android.widget.Toast; 11 import cn.sharesdk.wechat.utils.WXAppExtendObject; 12 import cn.sharesdk.wechat.utils.WXMediaMessage; 13 import cn.sharesdk.wechat.utils.WechatHandlerActivity; 14 /** 微信客戶端回調activity示例 */ 15 public class WXEntryActivity extends WechatHandlerActivity { 16 /** 17 * 處理微信發出的向第三方應用請求app message 18 * <p> 19 * 在微信客戶端中的聊天頁面有「添加工具」,能夠將本應用的圖標添加到其中 20 * 此後點擊圖標,下面的代碼會被執行。Demo僅僅只是打開本身而已,但你可 21 * 作點其餘的事情,包括根本不打開任何頁面 22 */ 23 public void onGetMessageFromWXReq(WXMediaMessage msg) { 24 Intent iLaunchMyself = getPackageManager().getLaunchIntentForPackage(getPackageName()); 25 startActivity(iLaunchMyself); 26 } 27 /** 28 * 處理微信向第三方應用發起的消息 29 * <p> 30 * 此處用來接收從微信發送過來的消息,比方說本demo在wechatpage裏面分享 31 * 應用時能夠不分享應用文件,而分享一段應用的自定義信息。接受方的微信 32 * 客戶端會經過這個方法,將這個信息發送回接收方手機上的本demo中,看成 33 * 回調。 34 * <p> 35 * 本Demo只是將信息展現出來,但你可作點其餘的事情,而不只僅只是Toast 36 */ 37 public void onShowMessageFromWXReq(WXMediaMessage msg) { 38 if (msg != null && msg.mediaObject != null 39 && (msg.mediaObject instanceof WXAppExtendObject)) { 40 WXAppExtendObject obj = (WXAppExtendObject) msg.mediaObject; 41 Toast.makeText(this, obj.extInfo, Toast.LENGTH_SHORT).show(); 42 } 43 } 44 }
同時,在清單文件中進行聲明:
<!--微信分享回調--> <activity android:name=".wxapi.WXEntryActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" android:screenOrientation="portrait" android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
若是項目繼承了易信,方法相似,這裏就不貼出來了,如今誰還用易信啊,哈哈哈···
四、添加代碼:
集成ShareSDK至少須要在兩個位置添加代碼,包括:
(1)在項目的入口Activity,在其onCreate方法中插入下面的代碼進行初始化:(這個方法越早調用越好)
ShareSDK.initSDK(this);
若是不在全部的ShareSDK的操做以前調用這行代碼,就會拋出空指針異常。
(2)在項目出口Activity的onDestroy方法中第一行插入下面的代碼:
ShareSDK.stopSDK(this);
上方這行代碼會結束ShareSDK的統計功能並釋放資源。若是這行代碼沒有被調用,那麼「應用啓動次數」將會不許確,由於應用可能歷來沒有被關閉過(注:這一行代碼我仍是沒用到,不知道會形成什麼實質性的後果)。
注意:initSDK是能夠重複調用的,其實ShareSDK建議在不肯定的時候調用這個方法來保證ShareSDK被正確初始化。而stopSDK一旦被調用了,就必須從新調用initSDK才能使用ShareSDK的功能,不然會出現空指針異常。
在代碼中調用此方法,便可打開一鍵分享功能進行分享:
1 private void showShare() { 2 ShareSDK.initSDK(this); 3 OnekeyShare oks = new OnekeyShare(); 4 //關閉sso受權 5 oks.disableSSOWhenAuthorize(); 6 // 分享時Notification的圖標和文字 2.5.9之後的版本不調用此方法 7 //oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name)); 8 // title標題,印象筆記、郵箱、信息、微信、人人網和QQ空間使用 9 oks.setTitle(getString(R.string.share)); 10 // titleUrl是標題的網絡連接,僅在人人網和QQ空間使用 11 oks.setTitleUrl("http://sharesdk.cn"); 12 // text是分享文本,全部平臺都須要這個字段 13 oks.setText("我是分享文本,啦啦啦~"); 14 // imagePath是圖片的本地路徑,Linked-In之外的平臺都支持此參數 15 oks.setImagePath("/sdcard/test.jpg");//確保SDcard下面存在此張圖片 16 // url僅在微信(包括好友和朋友圈)中使用 17 oks.setUrl("http://sharesdk.cn"); 18 // comment是我對這條分享的評論,僅在人人網和QQ空間使用 19 oks.setComment("我是測試評論文本"); 20 // site是分享此內容的網站名稱,僅在QQ空間使用 21 oks.setSite(getString(R.string.app_name)); 22 // siteUrl是分享此內容的網站地址,僅在QQ空間使用 23 oks.setSiteUrl("http://sharesdk.cn"); 24 // 啓動分享GUI 25 oks.show(this); 26 }
上面的這些代碼是官方給的,實際項目中能夠放在按鈕的點擊事件中,根據須要去填寫。
代碼解釋:
14行:setText是須要分享的文本內容
16行:setImagePath是須要分享的本地圖片。(若是是在真機當中,須要經過api去拿sd卡的路徑,即Environment.getExternalStorageDirectory()這個api)
5、正式開始寫代碼:
(1)activity_main.xml佈局文件:
<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有關的配置:
新浪微博:
1 <SinaWeibo 2 AppKey="858316951" 3 AppSecret="52685221be9572d0fb99e35a7ba25364" 4 Enable="true" 5 Id="1" 6 RedirectUrl="http://www.baidu.com" 7 ShareByAppClient="true" 8 SortId="1"/>
02行和03行的AppKey和AppSecret要換成你本身在新浪開放平臺註冊的信息。
06行:RedirectUrl裏面的網址要改爲可用的url地址,而且與新浪開放平臺的受權回調頁的網址一致,也就是下面這個:(在第三段中已經強調過了)
07行:若是設置爲true,那就會用新浪微博的app來進行分享操做;若是你沒有安裝新浪微博的app,極可能會致使分享失敗。若是設置爲false,那就會用網頁版的新浪微博進行分享。
微信和QQ的配置信息差很少,就不贅述了。
(3)MainActivity.java:
1 package com.smyhvae.sharedemo; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.View; 6 import android.widget.Button; 7 8 import cn.sharesdk.framework.ShareSDK; 9 import cn.sharesdk.onekeyshare.OnekeyShare; 10 11 12 public class MainActivity extends Activity implements View.OnClickListener { 13 14 private Button button1; 15 16 @Override 17 protected void onCreate(Bundle savedInstanceState) { 18 super.onCreate(savedInstanceState); 19 setContentView(R.layout.activity_main); 20 button1 = (Button) findViewById(R.id.button1); 21 button1.setOnClickListener(this); 22 } 23 24 //點擊按鈕,開始進行分享 25 @Override 26 public void onClick(View v) { 27 ShareSDK.initSDK(this); 28 OnekeyShare oks = new OnekeyShare(); 29 //關閉sso受權 30 oks.disableSSOWhenAuthorize(); 31 32 // title標題:微信、QQ(新浪微博不須要標題) 33 oks.setTitle("我是分享標題"); //最多30個字符 34 35 // text是分享文本:全部平臺都須要這個字段 36 oks.setText("我是分享文本,啦啦啦~http://uestcbmi.com/"); //最多40個字符 37 38 // imagePath是圖片的本地路徑:除Linked-In之外的平臺都支持此參數 39 //oks.setImagePath(Environment.getExternalStorageDirectory() + "/meinv.jpg");//確保SDcard下面存在此張圖片 40 41 //網絡圖片的url:全部平臺 42 oks.setImageUrl("http://7sby7r.com1.z0.glb.clouddn.com/CYSJ_02.jpg");//網絡圖片rul 43 44 // url:僅在微信(包括好友和朋友圈)中使用 45 oks.setUrl("http://sharesdk.cn"); //網友點進連接後,能夠看到分享的詳情 46 47 // Url:僅在QQ空間使用 48 oks.setTitleUrl("http://www.baidu.com"); //網友點進連接後,能夠看到分享的詳情 49 50 // 啓動分享GUI 51 oks.show(this); 52 } 53 }
第39行中,若是不想用本地的圖片,而是採用分享網絡的圖片,能夠將這一行去掉,改成第42行。
提示:若是imagePath和imageUrl同時存在,imageUrl將被忽略。
6、運行效果:
一、分享到新浪微博:(不採用客戶端進行分享的方式)
運行效果以下:
第一次分享時,系統會彈出頁面讓你填寫你本身的新浪微博帳號,我第一次運行的時候已經填寫過了。
如今打開新浪微博,分享成功了:
什麼?你以爲分享的圖片過小了不夠刺激?那點開大圖爽一下吧:(確實是分享成功了滴)
二、分享到新浪微博:(採用客戶端進行分享的方式)
運行以後,進行分享操做的界面以下:
分享成功以後的效果以下:
上圖的左下角顯示的是說「來自未經過審覈應用」,但有時候會顯示手機的名字,很奇怪吧?諮詢了一下官方客服(官方客服的解答太耐心了,感激不盡),狀況是這樣的:
若是不用客戶端進行分享(即ShareByAppClient="false"):
app在新浪開放平臺沒經過審覈,就會顯示「未經過審覈應用」
app在新浪開放平臺經過了審覈,就會顯示具體的app的名字
若是用客戶端進行分享(即ShareByAppClient="true"):
app在新浪開放平臺沒經過審覈,就會顯示「未經過審覈應用」或者手機型號
app在新浪開放平臺經過了審覈,顯示的是手機型號。效果以下:
三、分享到微信:
我這裏採用的是不繞過審覈的方式來進行分享(即ShareSDK.xml中關於微信的部分中,BypassApproval="false")。通常也是採起這種方式進行分享的吧。到底要不要繞過,看官網博客便知:
微信分享(對比及配置):http://mob.com/index.php/share/index/mediaItem/id/112
提示:記得要將生成簽名的apk安裝到手機,否則沒法分享到微信哦(好吧,仔細看微信開放平臺的註冊流程就好了)。
3.1 分享到微信好友:
留在微信後,效果以下:
3.2 分享到微信朋友圈:
四、分享到QQ、QQ空間:(和分享到微信的過程和界面一致)
運行效果:
4.一、分享到QQ好友:
4.二、分享到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
【工程文件】
7、在onekeyshare這個Module中對分享界面進行略微修改:
因爲咱們使用的是onekeyshare一鍵分享功能,因而分享界面在onekeyshare這個module中已經定製好了,如今能夠進行略微的修改:
一、將每行多個分享按鈕改成每行兩個分享按鈕:
這樣的話,每排就是固定爲兩個分享按鈕:
二、修改分享界面的背景:
能夠在下面這個位置加背景:
上圖中, 添加紅框部分的代碼便可。
8、徹底自定義分享界面:
如今我想自定義成下面的這樣的界面:
此時,因爲咱們是徹底自定義界面,因此咱們在集成的時候不須要集成onekeyshare模塊(快捷分享)。也就是說,咱們只須要讓app這個module依賴於ShareSDK這個module就好了。
至於自定義的分享按鈕的佈局,咱們須要一個GridView
代碼實現:
(1)share_item.xml:
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="wrap_content" 5 android:background="#00ffffff" 6 android:padding="30dp" 7 8 > 9 10 <ImageView 11 android:id="@+id/imageView1" 12 android:layout_width="wrap_content" 13 android:layout_height="30dp" 14 android:layout_alignParentTop="true" 15 android:layout_centerHorizontal="true" 16 android:src="@mipmap/ic_launcher"/> 17 18 <TextView 19 android:id="@+id/textView1" 20 android:layout_width="wrap_content" 21 android:layout_height="wrap_content" 22 android:layout_below="@+id/imageView1" 23 android:layout_centerHorizontal="true" 24 android:layout_marginTop="2dp" 25 android:text="TextView"/> 26 27 </RelativeLayout>
(2)share_dialog.xml:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:background="#00ffffff" 6 android:orientation="vertical"> 7 8 <GridView 9 android:listSelector="@android:color/transparent" 10 android:id="@+id/share_gridView" 11 android:layout_width="match_parent" 12 android:layout_height="wrap_content" 13 android:background="@mipmap/share_bg" 14 android:gravity="center" 15 android:horizontalSpacing="1dp" 16 android:numColumns="2" 17 android:paddingBottom="10dp" 18 android:paddingTop="15dp" 19 android:paddingLeft="9dp" 20 android:paddingRight="8dp" 21 android:verticalSpacing="1dp"> 22 </GridView> 23 24 25 <RelativeLayout 26 android:id="@+id/share_cancel" 27 android:layout_width="match_parent" 28 android:layout_height="wrap_content" 29 android:layout_marginBottom="15dp" 30 android:layout_marginLeft="4dp" 31 android:layout_marginRight="4dp" 32 android:layout_marginTop="10dp" 33 android:background="@mipmap/share_cancle" 34 android:gravity="center"> 35 36 <TextView 37 android:layout_width="wrap_content" 38 android:layout_height="wrap_content" 39 android:layout_alignParentTop="true" 40 android:layout_centerHorizontal="true" 41 android:layout_marginBottom="5dp" 42 android:layout_marginTop="5dp" 43 android:text="取消" 44 android:textColor="@color/home" 45 android:textSize="18sp"/> 46 47 </RelativeLayout> 48 49 </LinearLayout>
其實就是一個GridView和一個取消按鈕。
爲了達到UI上的效果,上面這兩個佈局文件的padding和margin我調了兩個小時。唉···
(3)ShareDialog.java:
1 package com.smyhvae.sharedemo; 2 3 import android.app.AlertDialog; 4 import android.content.Context; 5 import android.view.Gravity; 6 import android.view.View.OnClickListener; 7 import android.view.Window; 8 import android.widget.AdapterView.OnItemClickListener; 9 import android.widget.GridView; 10 import android.widget.RelativeLayout; 11 import android.widget.SimpleAdapter; 12 13 import java.util.ArrayList; 14 import java.util.HashMap; 15 import java.util.List; 16 17 public class ShareDialog { 18 19 private AlertDialog dialog; 20 private GridView gridView; 21 private RelativeLayout cancelButton; 22 private SimpleAdapter saImageItems; 23 private int[] image = {R.mipmap.share_sina, R.mipmap.share_wechat, R.mipmap.share_wechat_moments, R.mipmap.share_qq}; 24 private String[] name = {"微博", "微信好友", "朋友圈", "QQ"}; 25 26 public ShareDialog(Context context) { 27 28 dialog = new AlertDialog.Builder(context).create(); 29 dialog.show(); 30 Window window = dialog.getWindow(); 31 window.setGravity(Gravity.BOTTOM); // 很是重要:設置對話框彈出的位置 32 window.setContentView(R.layout.share_dialog); 33 gridView = (GridView) window.findViewById(R.id.share_gridView); 34 cancelButton = (RelativeLayout) window.findViewById(R.id.share_cancel); 35 List<HashMap<String, Object>> shareList = new ArrayList<HashMap<String, Object>>(); 36 for (int i = 0; i < image.length; i++) { 37 HashMap<String, Object> map = new HashMap<String, Object>(); 38 map.put("ItemImage", image[i]);//添加圖像資源的ID 39 map.put("ItemText", name[i]);//按序號作ItemText 40 shareList.add(map); 41 } 42 43 saImageItems = new SimpleAdapter(context, shareList, R.layout.share_item, new String[]{"ItemImage", "ItemText"}, new int[]{R.id.imageView1, R.id.textView1}); 44 gridView.setAdapter(saImageItems); 45 } 46 47 public void setCancelButtonOnClickListener(OnClickListener Listener) { 48 cancelButton.setOnClickListener(Listener); 49 } 50 51 public void setOnItemClickListener(OnItemClickListener listener) { 52 gridView.setOnItemClickListener(listener); 53 } 54 55 56 /** 57 * 關閉對話框 58 */ 59 public void dismiss() { 60 dialog.dismiss(); 61 } 62 }
第31行是設置對話框彈出的位置。
(4)MainActivity.java:
1 package com.smyhvae.sharedemo; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.os.Message; 7 import android.view.View; 8 import android.widget.AdapterView; 9 import android.widget.Button; 10 import android.widget.Toast; 11 12 import java.util.HashMap; 13 14 import cn.sharesdk.framework.Platform; 15 import cn.sharesdk.framework.Platform.ShareParams; 16 import cn.sharesdk.framework.PlatformActionListener; 17 import cn.sharesdk.framework.ShareSDK; 18 import cn.sharesdk.sina.weibo.SinaWeibo; 19 import cn.sharesdk.tencent.qq.QQ; 20 import cn.sharesdk.wechat.friends.Wechat; 21 import cn.sharesdk.wechat.moments.WechatMoments; 22 23 24 public class MainActivity extends Activity implements View.OnClickListener, 25 PlatformActionListener { 26 27 private Button shareButton; 28 ShareDialog shareDialog; 29 30 @Override 31 protected void onCreate(Bundle savedInstanceState) { 32 super.onCreate(savedInstanceState); 33 setContentView(R.layout.activity_main); 34 initView(); 35 //一、分享的初始化 36 ShareSDK.initSDK(this); 37 } 38 39 private void initView() { 40 shareButton = (Button) findViewById(R.id.shareButton); 41 shareButton.setOnClickListener(this); 42 } 43 44 @Override 45 public void onClick(View v) { 46 switch (v.getId()) { 47 case R.id.shareButton: 48 shareDialog = new ShareDialog(this); 49 shareDialog.setCancelButtonOnClickListener(new View.OnClickListener() { 50 51 @Override 52 public void onClick(View v) { 53 shareDialog.dismiss(); 54 55 } 56 }); 57 shareDialog.setOnItemClickListener(new AdapterView.OnItemClickListener() { 58 59 @Override 60 public void onItemClick(AdapterView<?> arg0, View arg1, 61 int arg2, long arg3) { 62 HashMap<String, Object> item = (HashMap<String, Object>) arg0.getItemAtPosition(arg2); 63 if (item.get("ItemText").equals("微博")) { 64 65 //二、設置分享內容 66 ShareParams sp = new ShareParams(); 67 sp.setText("我是分享文本,啦啦啦~http://uestcbmi.com/"); //分享文本 68 sp.setImageUrl("http://7sby7r.com1.z0.glb.clouddn.com/CYSJ_02.jpg");//網絡圖片rul 69 70 //三、很是重要:獲取平臺對象 71 Platform sinaWeibo = ShareSDK.getPlatform(SinaWeibo.NAME); 72 sinaWeibo.setPlatformActionListener(MainActivity.this); // 設置分享事件回調 73 // 執行分享 74 sinaWeibo.share(sp); 75 76 } else if (item.get("ItemText").equals("微信好友")) { 77 Toast.makeText(MainActivity.this, "您點中了" + item.get("ItemText"), Toast.LENGTH_LONG).show(); 78 79 //二、設置分享內容 80 ShareParams sp = new ShareParams(); 81 sp.setShareType(Platform.SHARE_WEBPAGE);//很是重要:必定要設置分享屬性 82 sp.setTitle("我是分享標題"); //分享標題 83 sp.setText("我是分享文本,啦啦啦~http://uestcbmi.com/"); //分享文本 84 sp.setImageUrl("http://7sby7r.com1.z0.glb.clouddn.com/CYSJ_02.jpg");//網絡圖片rul 85 sp.setUrl("http://sharesdk.cn"); //網友點進連接後,能夠看到分享的詳情 86 87 //三、很是重要:獲取平臺對象 88 Platform wechat = ShareSDK.getPlatform(Wechat.NAME); 89 wechat.setPlatformActionListener(MainActivity.this); // 設置分享事件回調 90 // 執行分享 91 wechat.share(sp); 92 93 94 } else if (item.get("ItemText").equals("朋友圈")) { 95 //二、設置分享內容 96 ShareParams sp = new ShareParams(); 97 sp.setShareType(Platform.SHARE_WEBPAGE); //很是重要:必定要設置分享屬性 98 sp.setTitle("我是分享標題"); //分享標題 99 sp.setText("我是分享文本,啦啦啦~http://uestcbmi.com/"); //分享文本 100 sp.setImageUrl("http://7sby7r.com1.z0.glb.clouddn.com/CYSJ_02.jpg");//網絡圖片rul 101 sp.setUrl("http://sharesdk.cn"); //網友點進連接後,能夠看到分享的詳情 102 103 //三、很是重要:獲取平臺對象 104 Platform wechatMoments = ShareSDK.getPlatform(WechatMoments.NAME); 105 wechatMoments.setPlatformActionListener(MainActivity.this); // 設置分享事件回調 106 // 執行分享 107 wechatMoments.share(sp); 108 109 } else if (item.get("ItemText").equals("QQ")) { 110 //二、設置分享內容 111 ShareParams sp = new ShareParams(); 112 sp.setTitle("我是分享標題"); 113 sp.setText("我是分享文本,啦啦啦~http://uestcbmi.com/"); 114 sp.setImageUrl("http://7sby7r.com1.z0.glb.clouddn.com/CYSJ_02.jpg");//網絡圖片rul 115 sp.setTitleUrl("http://www.baidu.com"); //網友點進連接後,能夠看到分享的詳情 116 //三、很是重要:獲取平臺對象 117 Platform qq = ShareSDK.getPlatform(QQ.NAME); 118 qq.setPlatformActionListener(MainActivity.this); // 設置分享事件回調 119 // 執行分享 120 qq.share(sp); 121 122 } 123 124 125 shareDialog.dismiss(); 126 127 } 128 }); 129 130 break; 131 132 default: 133 break; 134 } 135 136 } 137 138 @Override 139 public void onCancel(Platform arg0, int arg1) {//回調的地方是子線程,進行UI操做要用handle處理 140 handler.sendEmptyMessage(5); 141 142 } 143 144 @Override 145 public void onComplete(Platform arg0, int arg1, HashMap<String, Object> arg2) {//回調的地方是子線程,進行UI操做要用handle處理 146 if (arg0.getName().equals(SinaWeibo.NAME)) {// 判斷成功的平臺是否是新浪微博 147 handler.sendEmptyMessage(1); 148 } else if (arg0.getName().equals(Wechat.NAME)) { 149 handler.sendEmptyMessage(1); 150 } else if (arg0.getName().equals(WechatMoments.NAME)) { 151 handler.sendEmptyMessage(3); 152 } else if (arg0.getName().equals(QQ.NAME)) { 153 handler.sendEmptyMessage(4); 154 } 155 156 } 157 158 @Override 159 public void onError(Platform arg0, int arg1, Throwable arg2) {//回調的地方是子線程,進行UI操做要用handle處理 160 arg2.printStackTrace(); 161 Message msg = new Message(); 162 msg.what = 6; 163 msg.obj = arg2.getMessage(); 164 handler.sendMessage(msg); 165 } 166 167 Handler handler = new Handler() { 168 169 @Override 170 public void handleMessage(Message msg) { 171 switch (msg.what) { 172 case 1: 173 Toast.makeText(getApplicationContext(), "微博分享成功", Toast.LENGTH_LONG).show(); 174 break; 175 176 case 2: 177 Toast.makeText(getApplicationContext(), "微信分享成功", Toast.LENGTH_LONG).show(); 178 break; 179 case 3: 180 Toast.makeText(getApplicationContext(), "朋友圈分享成功", Toast.LENGTH_LONG).show(); 181 break; 182 case 4: 183 Toast.makeText(getApplicationContext(), "QQ分享成功", Toast.LENGTH_LONG).show(); 184 break; 185 186 case 5: 187 Toast.makeText(getApplicationContext(), "取消分享", Toast.LENGTH_LONG).show(); 188 break; 189 case 6: 190 Toast.makeText(getApplicationContext(), "分享失敗啊" + msg.obj, Toast.LENGTH_LONG).show(); 191 break; 192 193 default: 194 break; 195 } 196 } 197 198 }; 199 200 }
若是是分享到微信和朋友圈,那麼第81行和第97行必定不能少哦,否則分享失敗。
運行效果:
【工程文件】
參考連接:
ShareSDK自定義界面+仿搜狐視頻彈窗分享詳解:http://bbs.mob.com/forum.php?mod=viewthread&tid=3374
2015-11-17-備註:
我開發的app已經上線了,可是客戶要求說app要更名字,難以置信。畢竟app涉及到分享功能,因此改起來比較麻煩。
分享這一起要作的修改是:
一、新浪平臺,能夠直接在原來的應用中修更名字,而後提交審覈。
二、微信平臺,須要從新新建應用,而後提交審覈。
三、騰訊平臺:若是在原來的應用中更名字比較麻煩,仍是從新新建應用吧。
想學習代碼以外的軟技能?不妨關注個人微信公衆號:生命團隊(id:vitateam)。
掃一掃,你將發現另外一個全新的世界,而這將是一場美麗的意外: