在Android Studio中使用shareSDK進行社會化分享

生命壹號:http://www.cnblogs.com/smyhvae/

文章來源:http://www.cnblogs.com/smyhvae/p/4585340.html

 

【前言】

如今的app當中,幾乎都包含了社會化分享的功能,來兩張圖see 一 see:

好在這種分享功能已經有第三方平臺幫我們做好了,我們直接調用其SDK即可。市面上做社會化分享平臺的比較好平臺的有:mob等。

今天我們就用mob的平臺做分享吧,官網地址是:http://www.mob.com/

585d5735-c6b8-4303-a296-bcf17485df75[4]

怎麼樣?光看這個網站的首頁就碉堡了吧?好了不廢話,進入正題。

 

開發環境:

IDE版本:Android Studio 1.2

物理機版本:Win7旗艦版(64位)

 

一、獲取SDK並解壓:

打開網站首頁後,上圖中的箭頭處正是我們所需要的shareSDK。那我們就先將SDK下載下來吧。

7d868e3f-eae7-44ff-93e0-6bcb51b0d289[4]

上圖中,點擊箭頭處,進行下載。

56e44d59-dd50-4094-8c02-c4db4f3db99d[4]

上圖中的箭頭處所示,我們需要的是Android的SDK,所以將其下載下來。

a22185c4-4829-4574-8e4a-569a91313958[4]

上圖中,單機箭頭處正式下載,彈出如下界面:

6e5b1e3f-554a-4bc8-84f3-5812e31d1d5c[4]

上圖中,選擇我們所需要的社交平臺進行下載吧,這裏面,我選擇:新浪微博、微信、QQ、QQ空間。

下載完了之後,解壓,就是下面這個樣子:

8fbed54d-1f26-4790-88fe-4400b17c5383[4]

ShareSDK在“ShareSDK for Android”目錄下,此目錄中的“Libs”包含了“MainLibs”文件夾(核心庫)和“OnekeyShare”文件夾(快捷分享庫)。截圖如下:

9341ccea-2061-41d7-833a-75021393647e[4]

“ShareSDK for Android Services”包含ShareSDK已經發布的“插件服務”,暫時只提供了“評論與贊”服務,我們不需要這個哈。

 

二、在ShareSDK官網進行註冊:

在官網註冊賬號獲得ShareSDK的Appkey:

a83e7f98-3be2-44cc-9360-3e177012505c[4]

然後選擇應用名稱和平臺:

e8ccd9cc-2dd2-417d-b979-8b2070d2ed05[4]

應用創建成功後,效果如下:

45bf042e-1168-4c77-9053-18c6fc097bed[4]

上圖中的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/

圖文操作如下:

5295de36-0937-45f0-9f56-e2c786a050cf[4]

7ec1f587-a9d2-4f66-87ec-d3e7e52faa8b[4]

73146915-d871-4471-af49-da804dcb8670[4]

f4ed95e7-5302-419f-a27f-e51d1c5f3093[4]

上圖中,填好應用名稱,選好“應用平臺”(當然也可以同時勾選"iPhone",這樣的話,android平臺和ios平臺就可以共用同一個appId了),然後單擊“創建”即可。

6e0822fb-d615-47d2-b7bb-e05a5242e44b[4]

上圖中,單擊左側的“基本信息”,可以看到新浪微博的App Key、App Secret(紅框部分),這個信息稍後需要填到我們工程中的ShareSDK.xml中對應的<SinaWeibo>標籤中去。

上圖中,單擊左側的“高級信息”,然後填寫紅框部分的網址,填的這個網址稍後需要填到我們工程中的ShareSDK.xml中對應的<SinaWeibo>標籤的RedirectUrl屬性中去。

上圖的網址中,需要填寫一個可以打開的網址即可,比如這個:http://www.baidu.com/

,不然分享的時候很可能會報下面的錯誤:

bb12bc37-fc47-4044-8233-b5cc7c873f16[4]

這個錯誤可以參考下面這個鏈接:

  新浪微博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/

b5b07a82-625e-42a9-bd98-ca82419e210d[4]

參考鏈接:

  微信開放平臺申請流程:http://bbs.mob.com/thread-95-1-4.html

核心是要填“應用簽名”,也就是下面這張圖:(簽名工具的apk安裝包見附件)

2079af9f-2394-45a8-8063-f06afe1d4076[4]

 

3、騰訊開放平臺的註冊:

參考鏈接:

  騰訊開放平臺申請流程:http://bbs.mob.com/thread-98-1-4.html

申請網址:http://open.qq.com/

bbfdd220-c5f2-4708-93f7-ddd4a2b87010[4]

 

四、各種配置:

1、導入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,刪掉這個module中src/main目錄裏面的所有文件(包括刪掉java、res、AndroidManifest.xml)
  • 複製第三方庫的AndroidMainfest.xml、res、src文件(夾)到庫目錄的src/main目錄中
  • 將src/main目錄下的src目錄重命名(Shift+F6)爲java

32eb7329-2f08-41ad-8bf7-e72ab1544f50[4]

我們將上圖中的兩個工程文件新建爲兩個Library module:ShareSDK和OneKeyShare,記得要將下面的這個文件夾中的東西也要拷到MainLibs這個module的libs文件夾下:

87a774b6-8494-4173-81ec-8cad4cf9e474[4]

然後,需要注意的是,OneKeyShare這個module是依賴於ShareSDK這個module;而app這個module是依賴於OneKeyShare這個module

 

2、添加應用信息:

先在app這個module(即我們這個項目的module)下新建一個assets文件夾(即第三方資產目錄),操作如下:

3069e4d8-d8d3-4774-88c7-7bf637de2059[4]

d4c688b3-ab70-4831-beba-b2ab08108b27[4]

然後,我們將上圖中的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無法完成授權,則後續的其它操作也將無法執行。

 

3、配置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中。

之後,需要對上面的代碼進行以下修改:

0908fcd5-ac2d-46e0-9087-695df8cebbc9[4]

上圖中,將紅框部分的數字改成在騰訊開放平臺申請到的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"/>
複製代碼

 

如果項目繼承了易信,方法類似,這裏就不貼出來了,現在誰還用易信啊,哈哈哈···

 

4、添加代碼:

集成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)

五、正式開始寫代碼:

(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地址,並且與新浪開放平臺的授權回調頁的網址一致,也就是下面這個:(在第三段中已經強調過了)

d8700905-0252-4748-b865-4f0e56947773[4]

 

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將被忽略。

 

六、運行效果:

1、分享到新浪微博:(不採用客戶端進行分享的方式)

運行效果如下:

 

 第一次分享時,系統會彈出頁面讓你填寫你自己的新浪微博賬號,我第一次運行的時候已經填寫過了。

現在打開新浪微博,分享成功了:

什麼?你覺得分享的圖片太小了不夠刺激?那點開大圖爽一下吧:(確實是分享成功了滴)

  • setText屬性對應的是:“我是分享文本,啦啦啦~”
  • setImagePath屬性對應的是需要分享的圖片,也就是上圖中的大美女。

 

2、分享到新浪微博:(採用客戶端進行分享的方式)

運行之後,進行分享操作的界面如下:

分享成功之後的效果如下:

91e82619-eb6d-4677-8f25-c2cce79bbc45[4]

上圖的左下角顯示的是說“來自未通過審覈應用”,但有時候會顯示手機的名字,很奇怪吧?諮詢了一下官方客服(官方客服的解答太耐心了,感激涕零),情況是這樣的:

如果不用客戶端進行分享(即ShareByAppClient="false"):

  app在新浪開放平臺沒通過審覈,就會顯示“未通過審覈應用”

  app在新浪開放平臺通過了審覈,就會顯示具體的app的名字

如果用客戶端進行分享(即ShareByAppClient="true"):

  app在新浪開放平臺沒通過審覈,就會顯示“未通過審覈應用”或者手機型號

  app在新浪開放平臺通過了審覈,顯示的是手機型號。效果如下:

a2b27bca-b9f5-4421-ae27-63c27644e305[4]

3、分享到微信:

我這裏採用的是不繞過審覈的方式來進行分享(即ShareSDK.xml中關於微信的部分中,BypassApproval="false")。一般也是採取這種方式進行分享的吧。到底要不要繞過,看官網博客便知:

   微信分享(對比及配置):http://mob.com/index.php/share/index/mediaItem/id/112

提示:記得要將生成簽名的apk安裝到手機,不然無法分享到微信哦(好吧,仔細看微信開放平臺的註冊流程就行了)。

3.1  分享到微信好友:

dceaa580-dfb6-4bee-b562-6e91cc86d305[4]

留在微信後,效果如下:

3.2 分享到微信朋友圈:

6679104a-be92-4f28-9cb7-7ddbe23f8453[4]

9a4b5987-d7e6-4b10-a53d-d5ed2a9955bc[4]

4、分享到QQ、QQ空間:(和分享到微信的過程和界面一致)

運行效果:

4.1、分享到QQ好友:

9d3b9b3b-9d67-481a-8553-9f013dcb4c63[4]

06cc8259-468d-44a2-a00e-3684bbb05d2e[4]

64c3b136-064c-40c4-9252-b461d46f09a2[4]

62f9492a-c2f8-4646-8d9a-dbb14bc54c20[4]

4.2、分享到QQ空間:

b4821cae-bcb4-4bc9-b52d-1dec4a3843d3[4]

1cfa0b6d-fe9c-493f-affc-3cde14cd3124[4]

a04c9cd8-2d06-407c-bfdf-fcd87b77d042[4]

動態效果圖如下:

 

 

如果你還需要做一些細微的調整,那就需要多看官方的東西了,這裏貼出兩個鏈接:

官網博客: http://mob.com/index.php/share/index/media/cid/11

【ShareSDK】常見問題彙總:http://bbs.mob.com/forum.php?mod=viewthread&tid=30&extra=page%3D1

 

【工程文件】

2015-06-18-ShareSDK做分享功能.rar

 

七、在onekeyshare這個Module中對分享界面進行略微修改:

由於我們使用的是onekeyshare一鍵分享功能,於是分享界面在onekeyshare這個module中已經定製好了,現在可以進行略微的修改:

1、將每行多個分享按鈕改爲每行兩個分享按鈕:

這樣的話,每排就是固定爲兩個分享按鈕:

 

2、修改分享界面的背景:

可以在下面這個位置加背景:

上圖中, 添加紅框部分的代碼即可。

 

八、完全自定義分享界面:

現在我想自定義成下面的這樣的界面:

 

此時,由於我們是完全自定義界面,所以我們在集成的時候不需要集成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         //1、分享的初始化
 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                             //2、設置分享內容
 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                             //3、非常重要:獲取平臺對象
 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                             //2、設置分享內容
 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                             //3、非常重要:獲取平臺對象
 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                             //2、設置分享內容
 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                             //3、非常重要:獲取平臺對象
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                             //2、設置分享內容
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                             //3、非常重要:獲取平臺對象
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行一定不能少哦,不然分享失敗。

運行效果:

【工程文件】

2015-06-20-ShareDemo.rar

 

參考鏈接:

  ShareSDK自定義界面+仿搜狐視頻彈窗分享詳解:http://bbs.mob.com/forum.php?mod=viewthread&tid=3374

 

2015-11-17-備註:

我開發的app已經上線了,但是客戶要求說app要改名字,難以置信。畢竟app涉及到分享功能,所以改起來比較麻煩。

分享這一塊兒要做的修改是:

1、新浪平臺,可以直接在原來的應用中修改名字,然後提交審覈。

2、微信平臺,需要重新新建應用,然後提交審覈。

3、騰訊平臺:如果在原來的應用中改名字比較麻煩,還是重新新建應用吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章