Android APP分享功能實現

【Android應用開發詳解】第01期:第三方受權認證(一)實現第三方受權登陸、分享以及獲取用戶資料html

 

        因爲公司項目的須要,要實如今項目中使用第三方受權登陸以及分享文字和圖片等這樣的效果,幾經波折,查閱了一番資料,作了一個Demo。實現起來的效果仍是不錯的,不敢獨享,決定寫一個總結的教程,供你們互相交流、學習和參考,博主只求能和你們共同進步。但願能多多支持!java

        這篇文章中,咱們使用到了Share SDK,它是爲iOS、Android、WP8的APP提供社會化功能的一個組件,目前支持如QQ、微信、新浪微博、騰訊微博、開心網、人人網、豆瓣、網易微博、搜狐微博、facebook、twitter、google+等國內外主流社交平臺。android

1、實現的效果圖json

               主界面效果圖                                                                         api

  

                           受權登陸頁面效果圖安全

  

                        點擊分享按鈕彈出分享分享界面                               微信

     

 

 

      

 

 

 

2、項目結構目錄網絡

 

 

3、編碼前的準備工做app

 

一、獲取Libs    ide

   

      Libs包含ShareSDK的類庫,具體包括三個文件夾,分別是ShareSDK的全局依賴庫、ShareSDK當前支持的全部平臺工具庫和ShareSDK可視化UI的一些支持庫。「全局依賴庫」是集成ShareSDK的基礎,ShareSDK的任何平臺都依賴於這個庫,而「ShareSDK-GUI」提供的是一個測欄控件和一個快捷分享工具,以方便讀者更快速地集成ShareSDK。Libs下載地址

 

二、導入Libs

       <1> 將「Libs\Global-Dependences」下的jar包複製到您的libs目錄下。

       <2> 從「Libs\Platforms」中選擇您感興趣的平臺,比方說「新浪微博」、「QQ空間」、「騰訊微博」等,複製相應的壓縮包到你項目的libs目錄下並解壓

       <3> 若是你決定使用shareSDK提供的快捷分享工具,還須要複製「Libs\ShareSDK-GUI」中複製「cn.sharesdk.onekeyshare.jar」到你的項目中。

       <4> 通常來講,ADT會自動將你添加到libs目錄下的jar包添加到「Android Dependencies」中。可是若是你的開發環境不能自動加載ShareSDK的jar包到你的項目中,那麼只能手動添加,以下圖所示:

 

4、詳細的編碼實現

 

一、ShareSdK使用統一的格式管理你在不一樣平臺上註冊的開發者信息。這些信息都存放在項目的「assets/ShareSDKDevInfor.xml」中,ShareSDKDevInfor.xml:

[html]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <DevInfor>  
  3.     <!--說明:        
  4.         一、表格中的第一項  
  5.             <ShareSDK AppKey="api20" />  
  6.         是必須的,其中的AppKey是你在Share SDK上註冊的開發者賬號的AppKey  
  7.           
  8.         二、全部集成到你項目的平臺都應該爲其在表格中填寫相對應的開發者信息,以新浪微博爲例:  
  9.             <SinaWeibo  
  10.                 SortId="此平臺在分享列表中的位置,由開發者自行定義,能夠是任何整型數字,數值越大越靠後"  
  11.                 AppKey="填寫你在新浪微博上註冊的AppKey"  
  12.                 AppSecret="填寫你在新浪微博上註冊到的AppKey"  
  13.                 Id="自定義字段,整形,用於你項目中對此平臺的識別符"  
  14.                 RedirectUrl="填寫你在新浪微博上註冊的RedirectUrl" />         
  15.           
  16.         各個平臺註冊應用信息的地址以下:  
  17.             新浪微博:http://open.weibo.com  
  18.             騰訊微博:http://dev.t.qq.com  
  19.             QQ空間:http://connect.qq.com/intro/login/  
  20.             網易微博:http://open.t.163.com  
  21.             搜狐微博:http://open.t.sohu.com  
  22.             豆瓣:http://developers.douban.com  
  23.             人人網:http://dev.renren.com  
  24.             開心網:http://open.kaixin001.com  
  25.             Instapaper:http://www.instapaper.com/main/request_oauth_consumer_token  
  26.             有道雲筆記:http://note.youdao.com/open/developguide.html#app  
  27.             facebook:https://developers.facebook.com  
  28.             twitter:https://dev.twitter.com  
  29.             搜狐隨身看:https://open.sohu.com  
  30.             QQ好友分享:http://mobile.qq.com/api/  
  31.             微信:http://open.weixin.qq.com-->  
  32.                 
  33.     <ShareSDK   
  34.         AppKey = "api20"/> <!-- AppKey="104972cdd48" "23a9371d3a8"-->  
  35.       
  36.     <SinaWeibo  
  37.         SortId="1"  
  38.         AppKey="3201194191"  
  39.         AppSecret="0334252914651e8f76bad63337b3b78f"  
  40.         Id="1"  
  41.         RedirectUrl="http://appgo.cn" />  
  42.   
  43.     <TencentWeibo  
  44.         SortId="2"  
  45.         AppKey="801307650"  
  46.         AppSecret="ae36f4ee3946e1cbb98d6965b0b2ff5c"  
  47.         RedirectUri="http://sharesdk.cn"  
  48.         Id="2" />  
  49.   
  50.     <QZone  
  51.         SortId="3"  
  52.         AppId="100371282"  
  53.         AppKey="aed9b0303e3ed1e27bae87c33761161d"  
  54.         Id="3"  
  55.         RedirectUrl="http://www.shareSDK.cn" />  
  56.          
  57.     <Renren  
  58.         SortId="4"  
  59.         AppId="226427"  
  60.         ApiKey="fc5b8aed373c4c27a05b712acba0f8c3"  
  61.         Id="4"  
  62.         SecretKey="f29df781abdd4f49beca5a2194676ca4" />    
  63.          
  64. </DevInfor>  

二、配置AndroidManifest.xml,不一樣的集成度須要在AndroidManifest.xml中添加的內容也不同。可是首先你須要添加下面的權限列表:

[html]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. <uses-permission android:name="android.permission.INTERNET" />  
  2.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
  3.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
  4.     <uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />  
  5.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />  
  6.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
  7.     <uses-permission android:name="android.permission.READ_PHONE_STATE" />  


      這些權限將容許你的項目和ShareSDK獲取鏈接網絡的權限、獲取你的設備網絡狀態的權限、實現https安全鏈接的權限、讀取手機設備狀態的權限和保存必要配置的權限。通常來講,即使不集成ShareSDK,大部分的項目也都會註冊申請這些權限。

        注意:你們在加入這個"android.permission.WRITE_APN_SETTINGS"權限的時候,可能有些讀者的編譯器會報錯,博主就遇到了這樣的狀況,這個是ADT Lint工具的問題。

       解決的辦法是:依照下面的路徑「Window —> Preferences —> android—> lint error checking」打開lint的配置頁面,而後去掉頁面頂部的兩個勾選,以後再clean項目就能處理。以下圖所示:



三、其次,爲了受權操做能夠順利完成,須要在application下注冊下面的Activity:

[html]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. <activity  
  2.             android:name="cn.sharesdk.framework.AuthorizeActivity"  
  3.             android:configChanges="keyboardHidden|orientation"  
  4.             android:screenOrientation="portrait"  
  5.             android:theme="@android:style/Theme.Translucent.NoTitleBar"  
  6.             android:windowSoftInputMode="stateHidden|adjustResize" >            
  7.         </activity>  

AuthorizeActivity的路徑是固定的,必定要在「cn.sharesdk.framework」下,由於他在Share-Core包中。

四、添加布局頁面,首先是主界面的佈局頁面,activity_main.xml:

[html]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <Button  
  7.         android:id="@+id/btnLogin"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="44dp"  
  10.         android:layout_above="@+id/btnShareAllGui"  
  11.         android:layout_centerHorizontal="true"  
  12.         android:layout_margin="5dp"  
  13.         android:background="@drawable/btn_back"  
  14.         android:text="用戶受權登陸"   
  15.         android:textSize="16dp"/>  
  16.          
  17.     <Button  
  18.         android:id="@+id/btnShareAllGui"  
  19.         android:layout_width="fill_parent"  
  20.         android:layout_height="44dp"  
  21.         android:layout_above="@+id/btnShareAll"  
  22.         android:layout_margin="5dp"  
  23.         android:background="@drawable/btn_back"  
  24.         android:text="分享所有(有分享界面)"  
  25.         android:textSize="16dp" />  
  26.   
  27.     <Button  
  28.         android:id="@+id/btnShareAll"  
  29.         android:layout_width="fill_parent"  
  30.         android:layout_height="44dp"  
  31.         android:layout_alignParentRight="true"  
  32.         android:layout_centerVertical="true"  
  33.         android:layout_margin="5dp"  
  34.         android:background="@drawable/btn_back"  
  35.         android:text="分享所有(無界面,直接分享)"  
  36.         android:textSize="16dp" />  
  37.   
  38.     <Button  
  39.         android:id="@+id/btnUserInfo"  
  40.         android:layout_width="fill_parent"  
  41.         android:layout_height="44dp"  
  42.         android:layout_below="@+id/btnShareAll"  
  43.         android:layout_margin="5dp"  
  44.         android:layout_marginTop="41dp"  
  45.         android:background="@drawable/btn_back"  
  46.         android:text="獲取受權用戶資料"   
  47.         android:textSize="16dp" />  
  48.   
  49. </RelativeLayout>  

五、用戶受權登陸的佈局頁面,activity_auth.xml:

[html]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  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="fill_parent"  
  5.     android:background="#fff5f5f5"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <!--ShareSDK-Core包下封裝的一個標題欄-->  
  9.     <cn.sharesdk.framework.TitleLayout  
  10.         android:id="@+id/llTitle"  
  11.         android:layout_width="fill_parent"  
  12.         android:layout_height="wrap_content"  
  13.         android:background="@drawable/title_back" />  
  14.   
  15.     <LinearLayout  
  16.         android:id="@+id/llBody"  
  17.         android:layout_width="fill_parent"  
  18.         android:layout_height="wrap_content"  
  19.         android:layout_alignParentLeft="true"  
  20.         android:layout_alignParentTop="true"  
  21.         android:layout_marginTop="58dp"  
  22.         android:orientation="vertical"  
  23.         android:padding="10dp" >  
  24.   
  25.         <LinearLayout  
  26.             android:layout_width="fill_parent"  
  27.             android:layout_height="50dp"  
  28.             android:background="@drawable/list_item_first_normal"  
  29.             android:paddingLeft="10dp"  
  30.             android:paddingRight="10dp" >  
  31.   
  32.             <ImageView  
  33.                 android:layout_width="30dp"  
  34.                 android:layout_height="30dp"  
  35.                 android:layout_gravity="center_vertical"  
  36.                 android:layout_marginRight="10dp"  
  37.                 android:scaleType="centerInside"  
  38.                 android:src="@drawable/sina_weibo" />  
  39.   
  40.             <CheckedTextView  
  41.                 android:id="@+id/ctvSw"  
  42.                 android:layout_width="fill_parent"  
  43.                 android:layout_height="fill_parent"  
  44.                 android:layout_gravity="center_vertical"  
  45.                 android:drawablePadding="10dp"  
  46.                 android:drawableRight="@drawable/cb_drw"  
  47.                 android:gravity="center_vertical"  
  48.                 android:singleLine="true"  
  49.                 android:text="@string/not_yet_authorized"  
  50.                 android:textColor="#ff000000"  
  51.                 android:textSize="20dp" />  
  52.         </LinearLayout>  
  53.   
  54.         <LinearLayout  
  55.             android:layout_width="fill_parent"  
  56.             android:layout_height="50dp"  
  57.             android:background="@drawable/list_item_middle_normal"  
  58.             android:paddingLeft="10dp"  
  59.             android:paddingRight="10dp" >  
  60.   
  61.             <ImageView  
  62.                 android:layout_width="30dp"  
  63.                 android:layout_height="30dp"  
  64.                 android:layout_gravity="center_vertical"  
  65.                 android:layout_marginRight="10dp"  
  66.                 android:scaleType="centerInside"  
  67.                 android:src="@drawable/tencent_weibo" />  
  68.   
  69.             <CheckedTextView  
  70.                 android:id="@+id/ctvTc"  
  71.                 android:layout_width="fill_parent"  
  72.                 android:layout_height="fill_parent"  
  73.                 android:layout_gravity="center_vertical"  
  74.                 android:drawablePadding="10dp"  
  75.                 android:drawableRight="@drawable/cb_drw"  
  76.                 android:gravity="center_vertical"  
  77.                 android:singleLine="true"  
  78.                 android:text="@string/not_yet_authorized"  
  79.                 android:textColor="#ff000000"  
  80.                 android:textSize="20dp" />  
  81.         </LinearLayout>  
  82.   
  83.         <LinearLayout  
  84.             android:layout_width="fill_parent"  
  85.             android:layout_height="50dp"  
  86.             android:background="@drawable/list_item_middle_normal"  
  87.             android:paddingLeft="10dp"  
  88.             android:paddingRight="10dp" >  
  89.   
  90.             <ImageView  
  91.                 android:layout_width="30dp"  
  92.                 android:layout_height="30dp"  
  93.                 android:layout_gravity="center_vertical"  
  94.                 android:layout_marginRight="10dp"  
  95.                 android:scaleType="centerInside"  
  96.                 android:src="@drawable/renren" />  
  97.   
  98.             <CheckedTextView  
  99.                 android:id="@+id/ctvRr"  
  100.                 android:layout_width="fill_parent"  
  101.                 android:layout_height="fill_parent"  
  102.                 android:layout_gravity="center_vertical"  
  103.                 android:drawablePadding="10dp"  
  104.                 android:drawableRight="@drawable/cb_drw"  
  105.                 android:gravity="center_vertical"  
  106.                 android:singleLine="true"  
  107.                 android:text="@string/not_yet_authorized"  
  108.                 android:textColor="#ff000000"  
  109.                 android:textSize="20dp" />  
  110.         </LinearLayout>  
  111.   
  112.         <LinearLayout  
  113.             android:layout_width="fill_parent"  
  114.             android:layout_height="50dp"  
  115.             android:background="@drawable/list_item_last_normal"  
  116.             android:paddingLeft="10dp"  
  117.             android:paddingRight="10dp" >  
  118.   
  119.             <ImageView  
  120.                 android:layout_width="30dp"  
  121.                 android:layout_height="30dp"  
  122.                 android:layout_gravity="center_vertical"  
  123.                 android:layout_marginRight="10dp"  
  124.                 android:scaleType="centerInside"  
  125.                 android:src="@drawable/qzone" />  
  126.   
  127.             <CheckedTextView  
  128.                 android:id="@+id/ctvQz"  
  129.                 android:layout_width="fill_parent"  
  130.                 android:layout_height="fill_parent"  
  131.                 android:layout_gravity="center_vertical"  
  132.                 android:drawablePadding="10dp"  
  133.                 android:drawableRight="@drawable/cb_drw"  
  134.                 android:gravity="center_vertical"  
  135.                 android:singleLine="true"  
  136.                 android:text="@string/not_yet_authorized"  
  137.                 android:textColor="#ff000000"  
  138.                 android:textSize="20dp" />  
  139.         </LinearLayout>  
  140.     </LinearLayout>  
  141.   
  142. </RelativeLayout>  


六、得到用戶信息佈局界面,activity_userinfo.xml:

[html]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  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="fill_parent"  
  5.     android:background="#fff5f5f5"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <!--ShareSDK-Core包下封裝的一個標題欄-->  
  9.     <cn.sharesdk.framework.TitleLayout  
  10.         android:id="@+id/llTitle"  
  11.         android:layout_width="fill_parent"  
  12.         android:layout_height="wrap_content"  
  13.         android:background="@drawable/title_back" />  
  14.   
  15.             <Button  
  16.                 android:id="@+id/btnQz"  
  17.                 android:layout_width="fill_parent"  
  18.                 android:layout_height="44dp"  
  19.                 android:layout_centerVertical="true"  
  20.                 android:layout_margin="5dp"  
  21.                 android:background="@drawable/btn_back"  
  22.                 android:text="@string/get_user_info_qz"  
  23.                 android:textSize="16dp" />  
  24.   
  25.             <Button  
  26.                 android:id="@+id/btnRr"  
  27.                 android:layout_width="fill_parent"  
  28.                 android:layout_height="44dp"  
  29.                 android:layout_above="@+id/btnQz"  
  30.                 android:layout_margin="5dp"  
  31.                 android:background="@drawable/btn_back"  
  32.                 android:text="@string/get_user_info_rr"  
  33.                 android:textSize="16dp" />  
  34.   
  35.             <Button  
  36.                 android:id="@+id/btnSw"  
  37.                 android:layout_width="fill_parent"  
  38.                 android:layout_height="44dp"  
  39.                 android:layout_above="@+id/btnRr"  
  40.                 android:layout_margin="5dp"  
  41.                 android:background="@drawable/btn_back"  
  42.                 android:text="@string/get_user_info_sw"  
  43.                 android:textSize="16dp" />  
  44.   
  45.             <Button  
  46.                 android:id="@+id/btnTc"  
  47.                 android:layout_width="fill_parent"  
  48.                 android:layout_height="44dp"  
  49.                 android:layout_below="@+id/btnQz"  
  50.                 android:layout_centerHorizontal="true"  
  51.                 android:layout_margin="5dp"  
  52.                 android:background="@drawable/btn_back"  
  53.                 android:text="@string/get_user_info_tc"  
  54.                 android:textSize="16dp" />  
  55.   
  56. </RelativeLayout>  


七、顯示用戶得到的信息佈局界面,activity_userinfo.xml:

[html]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  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="fill_parent"  
  5.     android:background="#fff5f5f5"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <!--ShareSDK-Core包下封裝的一個標題欄-->  
  9.     <cn.sharesdk.framework.TitleLayout  
  10.         android:id="@+id/llTitle"  
  11.         android:layout_width="fill_parent"  
  12.         android:layout_height="wrap_content"  
  13.         android:background="@drawable/title_back" />  
  14.   
  15.     <ScrollView  
  16.         android:layout_width="fill_parent"  
  17.         android:layout_height="wrap_content"  
  18.         android:layout_alignParentBottom="true"  
  19.         android:layout_below="@id/llTitle"  
  20.         android:paddingBottom="10dp"  
  21.         android:paddingLeft="10dp"  
  22.         android:paddingTop="10dp" >  
  23.   
  24.         <TextView  
  25.             android:id="@+id/tvJson"  
  26.             android:layout_width="fill_parent"  
  27.             android:layout_height="wrap_content"  
  28.             android:layout_marginRight="10dp"  
  29.             android:autoLink="all"  
  30.             android:background="@drawable/list_item_single_normal"  
  31.             android:textColor="#ff000000" />  
  32.     </ScrollView>  
  33.   
  34. </RelativeLayout>  

 

八、主界面入口Activity類,MainActivity.java:

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. package com.yangyu.activity;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileOutputStream;  
  5.   
  6. import android.app.Activity;  
  7. import android.content.Intent;  
  8. import android.graphics.Bitmap;  
  9. import android.graphics.Bitmap.CompressFormat;  
  10. import android.graphics.BitmapFactory;  
  11. import android.os.Bundle;  
  12. import android.os.Environment;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16. import cn.sharesdk.framework.AbstractWeibo;  
  17. import cn.sharesdk.onekeyshare.ShareAllGird;  
  18.   
  19. import com.yangyu.mysharethings.R;  
  20.   
  21. /** 
  22.  * @author yangyu 
  23.  *  功能描述:主Activity類,程序的入口類 
  24.  */  
  25. public class MainActivity extends Activity implements OnClickListener {  
  26.     //定義圖片存放的地址  
  27.     public static String TEST_IMAGE;  
  28.   
  29.     //定義"帳號登錄"按鈕,"有分享界面按鈕","無分享界面"按鈕,"獲得用戶資料"按鈕  
  30.     private Button authLoginBtn,shareGuiBtn,shareBtn,getInfoBtn;  
  31.       
  32.     @Override  
  33.     protected void onCreate(Bundle savedInstanceState) {  
  34.         super.onCreate(savedInstanceState);  
  35.         setContentView(R.layout.activity_main);  
  36.           
  37.         //初始化ShareSDK  
  38.         AbstractWeibo.initSDK(this);      
  39.           
  40.         initImagePath();                      
  41.           
  42.         initView();  
  43.           
  44.         initData();  
  45.     }  
  46.   
  47.     /** 
  48.      * 初始化組件 
  49.      */  
  50.     private void initView(){  
  51.         authLoginBtn = (Button)findViewById(R.id.btnLogin);  
  52.         shareGuiBtn = (Button)findViewById(R.id.btnShareAllGui);  
  53.         shareBtn = (Button)findViewById(R.id.btnShareAll);  
  54.         getInfoBtn = (Button)findViewById(R.id.btnUserInfo);  
  55.     }  
  56.       
  57.     /** 
  58.      * 初始化數據 
  59.      */  
  60.     private void initData(){  
  61.         //設置按鈕監聽事件  
  62.         authLoginBtn.setOnClickListener(this);  
  63.         shareGuiBtn.setOnClickListener(this);  
  64.         shareBtn.setOnClickListener(this);  
  65.         getInfoBtn.setOnClickListener(this);  
  66.     }  
  67.       
  68.     /** 
  69.      * 初始化分享的圖片 
  70.      */  
  71.     private void initImagePath() {  
  72.         try {//判斷SD卡中是否存在此文件夾  
  73.             if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())  
  74.                     && Environment.getExternalStorageDirectory().exists()) {  
  75.                 TEST_IMAGE = Environment.getExternalStorageDirectory().getAbsolutePath() + "/pic.png";  
  76.             }  
  77.             else {  
  78.                 TEST_IMAGE = getApplication().getFilesDir().getAbsolutePath() + "/pic.png";  
  79.             }  
  80.             File file = new File(TEST_IMAGE);  
  81.             //判斷圖片是否存此文件夾中  
  82.             if (!file.exists()) {  
  83.                 file.createNewFile();  
  84.                 Bitmap pic = BitmapFactory.decodeResource(getResources(), R.drawable.pic);  
  85.                 FileOutputStream fos = new FileOutputStream(file);  
  86.                 pic.compress(CompressFormat.JPEG, 100, fos);  
  87.                 fos.flush();  
  88.                 fos.close();  
  89.             }  
  90.         } catch(Throwable t) {  
  91.             t.printStackTrace();  
  92.             TEST_IMAGE = null;  
  93.         }  
  94.     }  
  95.       
  96.     /** 
  97.      * 按鈕監聽事件 
  98.      */  
  99.     @Override  
  100.     public void onClick(View v) {  
  101.         switch (v.getId()) {  
  102.         case R.id.btnLogin:  
  103.             startActivity(new Intent(MainActivity.this,AuthActivity.class));  
  104.             break;  
  105.         case R.id.btnShareAllGui:  
  106.             showGrid(false);  
  107.             break;  
  108.         case R.id.btnShareAll:  
  109.             showGrid(true);  
  110.             break;  
  111.         case R.id.btnUserInfo:  
  112.             // 獲取本身的資料  
  113.             Intent i = new Intent(this, GetInforActivity.class);  
  114.             startActivity(i);  
  115.             break;  
  116.         default:  
  117.             break;  
  118.         }  
  119.           
  120.     }  
  121.   
  122.     /** 
  123.      * 使用快捷分享完成圖文分享 
  124.      */  
  125.     private void showGrid(boolean silent) {  
  126.         Intent i = new Intent(this, ShareAllGird.class);  
  127.         // 分享時Notification的圖標  
  128.         i.putExtra("notif_icon", R.drawable.ic_launcher);  
  129.         // 分享時Notification的標題  
  130.         i.putExtra("notif_title", this.getString(R.string.app_name));  
  131.   
  132.         // title標題,在印象筆記、郵箱、信息、微信(包括好友和朋友圈)、人人網和QQ空間使用,不然能夠不提供  
  133.         i.putExtra("title", this.getString(R.string.share));  
  134.         // titleUrl是標題的網絡連接,僅在人人網和QQ空間使用,不然能夠不提供  
  135.         i.putExtra("titleUrl", "http://sharesdk.cn");  
  136.         // text是分享文本,全部平臺都須要這個字段  
  137.         i.putExtra("text", this.getString(R.string.share_content));  
  138.         // imagePath是本地的圖片路徑,全部平臺都支持這個字段,不提供,則表示不分享圖片  
  139.         i.putExtra("imagePath", MainActivity.TEST_IMAGE);  
  140.         // url僅在微信(包括好友和朋友圈)中使用,不然能夠不提供  
  141.         i.putExtra("url", "http://sharesdk.cn");  
  142.         // thumbPath是縮略圖的本地路徑,僅在微信(包括好友和朋友圈)中使用,不然能夠不提供  
  143.         i.putExtra("thumbPath", MainActivity.TEST_IMAGE);  
  144.         // appPath是待分享應用程序的本地路勁,僅在微信(包括好友和朋友圈)中使用,不然能夠不提供  
  145.         i.putExtra("appPath", MainActivity.TEST_IMAGE);  
  146.         // comment是我對這條分享的評論,僅在人人網和QQ空間使用,不然能夠不提供  
  147.         i.putExtra("comment", this.getString(R.string.share));  
  148.         // site是分享此內容的網站名稱,僅在QQ空間使用,不然能夠不提供  
  149.         i.putExtra("site", this.getString(R.string.app_name));  
  150.         // siteUrl是分享此內容的網站地址,僅在QQ空間使用,不然能夠不提供  
  151.         i.putExtra("siteUrl", "http://sharesdk.cn");  
  152.   
  153.         // 是否直接分享  
  154.         i.putExtra("silent", silent);  
  155.         this.startActivity(i);  
  156.     }  
  157.       
  158.     /** 
  159.      * 將action轉換爲String 
  160.      */  
  161.     public static String actionToString(int action) {  
  162.         switch (action) {  
  163.             case AbstractWeibo.ACTION_AUTHORIZING: return "ACTION_AUTHORIZING";  
  164.             case AbstractWeibo.ACTION_GETTING_FRIEND_LIST: return "ACTION_GETTING_FRIEND_LIST";  
  165.             case AbstractWeibo.ACTION_FOLLOWING_USER: return "ACTION_FOLLOWING_USER";  
  166.             case AbstractWeibo.ACTION_SENDING_DIRECT_MESSAGE: return "ACTION_SENDING_DIRECT_MESSAGE";  
  167.             case AbstractWeibo.ACTION_TIMELINE: return "ACTION_TIMELINE";  
  168.             case AbstractWeibo.ACTION_USER_INFOR: return "ACTION_USER_INFOR";  
  169.             case AbstractWeibo.ACTION_SHARE: return "ACTION_SHARE";  
  170.             default: {  
  171.                 return "UNKNOWN";  
  172.             }  
  173.         }  
  174.     }  
  175.       
  176.     protected void onDestroy() {  
  177.         //結束ShareSDK的統計功能並釋放資源  
  178.         AbstractWeibo.stopSDK(this);  
  179.         super.onDestroy();  
  180.     }  
  181. }  

 集成ShareSDK須要至少在兩個地方添加代碼,包括:

<1>  在onCreate中插入下面的代碼:

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. //初始化ShareSDK  
  2.         AbstractWeibo.initSDK(this);  

      這行代碼會初始化ShareSDK,此後對ShareSDK的操做都依次爲基礎。若是不在全部ShareSDK的操做以前調用這行代碼,會拋出空指針異常。

<2> 在項目的出口Activity的onDestroy方法的第一行插入下面的代碼:

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. protected void onDestroy() {  
  2.         //結束ShareSDK的統計功能並釋放資源  
  3.         AbstractWeibo.stopSDK(this);  
  4.         super.onDestroy();  
  5.     }  

        這行代碼會結束ShareSDK的統計功能並釋放資源。若是這行代碼沒有被調用,那麼

「應用啓動次數」的統計將不會準確,由於應用可能歷來沒有被關閉。

          InitSDK是能夠重複調用的,其實ShareSDK建議在你不肯定的時候調用這個方法,

來保證ShareSDK被正確初始化。而stopSDK一旦調用了,就必須從新調用InitSDK才能使

用ShareSDK的功能,不然會出現空指針異常。

 

 在這段代碼中,還使用到了快捷分享,以下圖所示,點擊按鈕彈出快捷分享界面:

           

 

      什麼是快捷分享呢?快捷分享是ShareSDK提供的一套基於其接口的GUI。經過簡單的配置,能夠在不考慮平臺的狀況下,調用不多的代碼,就完成分享的操做。快捷分享的jar包放在SDK解壓目錄的"Libs\ShareSDK-GUI"中,叫作"cn.sharesdk.oneshare.jar"。快捷分享使用了兩個Activity,須要在AndroidManifest.xml中註冊這兩個Activity:

[html]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. <activity  
  2.             android:name="cn.sharesdk.onekeyshare.ShareAllGird"  
  3.             android:configChanges="keyboardHidden|orientation"  
  4.             android:screenOrientation="portrait"  
  5.             android:theme="@android:style/Theme.Translucent.NoTitleBar"  
  6.             android:windowSoftInputMode="adjustPan|stateHidden" />  
  7.         <activity  
  8.             android:name="cn.sharesdk.onekeyshare.SharePage"  
  9.             android:configChanges="keyboardHidden|orientation"  
  10.             android:screenOrientation="portrait"  
  11.             android:windowSoftInputMode="stateHidden|adjustResize" />  

  

九、賬號受權登陸界面,AuthActivity.java:

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. package com.yangyu.activity;  
  2.   
  3. import java.util.HashMap;  
  4.   
  5. import android.app.Activity;  
  6. import android.os.Bundle;  
  7. import android.os.Handler;  
  8. import android.os.Handler.Callback;  
  9. import android.os.Message;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.CheckedTextView;  
  13. import android.widget.Toast;  
  14. import cn.sharesdk.framework.AbstractWeibo;  
  15. import cn.sharesdk.framework.TitleLayout;  
  16. import cn.sharesdk.framework.WeiboActionListener;  
  17. import cn.sharesdk.renren.Renren;  
  18. import cn.sharesdk.sina.weibo.SinaWeibo;  
  19. import cn.sharesdk.tencent.qzone.QZone;  
  20. import cn.sharesdk.tencent.weibo.TencentWeibo;  
  21.   
  22. import com.yangyu.mysharethings.R;  
  23.   
  24. /** 
  25.  * @author yangyu 
  26.  *  功能描述:受權和取消受權Activity,因爲UI顯示須要受權過的平臺顯示帳戶的名稱, 
  27.  *    所以此頁面事實上展現的是「獲取用戶資料」和「取消受權」兩個功能。 
  28.  */  
  29. public class AuthActivity extends Activity implements Callback, OnClickListener, WeiboActionListener {  
  30.     //定義CheckedTextView對象  
  31.     private CheckedTextView  sinaCt,qzoneCt,tengxunCt,renrenCt;  
  32.       
  33.     //定義Handler對象  
  34.     private Handler handler;  
  35.   
  36.     //定義標題欄對象  
  37.     private TitleLayout llTitle;  
  38.   
  39.     @Override  
  40.     protected void onCreate(Bundle savedInstanceState) {  
  41.         super.onCreate(savedInstanceState);  
  42.         setContentView(R.layout.activity_auth);  
  43.           
  44.         initView();  
  45.           
  46.         initData();  
  47.     }  
  48.   
  49.     /** 
  50.      * 初始化組件 
  51.      */  
  52.     private void initView(){  
  53.         //實例化Handler對象並設置信息回調監聽接口  
  54.         handler = new Handler(this);  
  55.   
  56.         //獲得標題欄對象  
  57.         llTitle = (TitleLayout) findViewById(R.id.llTitle);       
  58.           
  59.         //獲得組件對象  
  60.         sinaCt    = (CheckedTextView)findViewById(R.id.ctvSw);  
  61.         qzoneCt   = (CheckedTextView)findViewById(R.id.ctvQz);  
  62.         tengxunCt = (CheckedTextView)findViewById(R.id.ctvTc);  
  63.         renrenCt  = (CheckedTextView)findViewById(R.id.ctvRr);        
  64.     }  
  65.       
  66.     /** 
  67.      * 初始化數據 
  68.      */  
  69.     private void initData(){  
  70.         llTitle.getBtnBack().setOnClickListener(new OnClickListener() {           
  71.             @Override  
  72.             public void onClick(View v) {  
  73.                 finish();                 
  74.             }  
  75.         });  
  76.         llTitle.getTvTitle().setText("用戶受權登陸");  
  77.           
  78.         //設置監聽  
  79.         sinaCt.setOnClickListener(this);  
  80.         qzoneCt.setOnClickListener(this);  
  81.         tengxunCt.setOnClickListener(this);  
  82.         renrenCt.setOnClickListener(this);  
  83.   
  84.         //獲取平臺列表  
  85.         AbstractWeibo[] weibos = AbstractWeibo.getWeiboList(this);  
  86.           
  87.         for(int i = 0;i < weibos.length;i++){  
  88.             if (!weibos[i].isValid()) {  
  89.                 continue;  
  90.             }  
  91.               
  92.             CheckedTextView ctv = getView(weibos[i]);  
  93.             if (ctv != null) {  
  94.                 ctv.setChecked(true);  
  95.                 // 獲得受權用戶的用戶名稱  
  96.                 String userName = weibos[i].getDb().get("nickname");   
  97.                 if (userName == null || userName.length() <= 0 || "null".equals(userName)) {  
  98.                     // 若是平臺已經受權卻沒有拿到賬號名稱,則自動獲取用戶資料,以獲取名稱  
  99.                     userName = getWeiboName(weibos[i]);  
  100.                     //添加平臺事件監聽  
  101.                     weibos[i].setWeiboActionListener(this);  
  102.                     //顯示用戶資料,null表示顯示本身的資料  
  103.                     weibos[i].showUser(null);  
  104.                 }  
  105.                 ctv.setText(userName);  
  106.             }  
  107.         }  
  108.     }  
  109.       
  110.     /** 
  111.      * 在CheckedTextView組件中顯示受權用戶的名稱 
  112.      */  
  113.     private CheckedTextView getView(AbstractWeibo weibo) {  
  114.         if (weibo == null) {  
  115.             return null;  
  116.         }  
  117.           
  118.         String name = weibo.getName();  
  119.         if (name == null) {  
  120.             return null;  
  121.         }  
  122.           
  123.         View v = null;  
  124.         if (SinaWeibo.NAME.equals(name)) {  
  125.             v = findViewById(R.id.ctvSw);  
  126.         }  
  127.         else if (TencentWeibo.NAME.equals(name)) {  
  128.             v = findViewById(R.id.ctvTc);  
  129.         }         
  130.         else if (Renren.NAME.equals(name)) {  
  131.             v = findViewById(R.id.ctvRr);  
  132.         }  
  133.         else if (QZone.NAME.equals(name)) {  
  134.             v = findViewById(R.id.ctvQz);  
  135.         }         
  136.           
  137.         if (v == null) {  
  138.             return null;  
  139.         }  
  140.           
  141.         if (! (v instanceof CheckedTextView)) {  
  142.             return null;  
  143.         }  
  144.           
  145.         return (CheckedTextView) v;  
  146.     }  
  147.       
  148.     /** 
  149.      * 獲得受權用戶的用戶名稱 
  150.      */  
  151.     private String getWeiboName(AbstractWeibo weibo) {  
  152.         if (weibo == null) {  
  153.             return null;  
  154.         }  
  155.           
  156.         String name = weibo.getName();  
  157.         if (name == null) {  
  158.             return null;  
  159.         }  
  160.           
  161.         int res = 0;  
  162.         if (SinaWeibo.NAME.equals(name)) {  
  163.             res = R.string.sinaweibo;  
  164.         }  
  165.         else if (TencentWeibo.NAME.equals(name)) {  
  166.             res = R.string.tencentweibo;  
  167.         }         
  168.         else if (Renren.NAME.equals(name)) {  
  169.             res = R.string.renren;  
  170.         }  
  171.         else if (QZone.NAME.equals(name)) {  
  172.             res = R.string.qzone;  
  173.         }         
  174.           
  175.         if (res == 0) {  
  176.             return name;  
  177.         }         
  178.         return this.getResources().getString(res);  
  179.     }  
  180.       
  181.     /** 
  182.      * 受權和取消受權的按鈕點擊監聽事件 
  183.      */  
  184.     @Override  
  185.     public void onClick(View v) {                 
  186.         AbstractWeibo weibo = getWeibo(v.getId());  
  187.           
  188.         CheckedTextView ctv = (CheckedTextView) v;  
  189.         if (weibo == null) {  
  190.             ctv.setChecked(false);  
  191.             ctv.setText(R.string.not_yet_authorized);  
  192.             return;  
  193.         }  
  194.           
  195.         if (weibo.isValid()) {  
  196.             weibo.removeAccount();  
  197.             ctv.setChecked(false);  
  198.             ctv.setText(R.string.not_yet_authorized);  
  199.             return;  
  200.         }  
  201.           
  202.         weibo.setWeiboActionListener(this);  
  203.         weibo.showUser(null);         
  204.     }  
  205.   
  206.     /** 
  207.      * 得到受權 
  208.      */  
  209.     private AbstractWeibo getWeibo(int vid) {  
  210.         String name = null;  
  211.         switch (vid) {  
  212.         // 進入新浪微博的受權頁面  
  213.         case R.id.ctvSw:  
  214.             name = SinaWeibo.NAME;  
  215.             break;  
  216.         // 進入騰訊微博的受權頁面  
  217.         case R.id.ctvTc:  
  218.             name = TencentWeibo.NAME;  
  219.             break;  
  220.         // 進入人人網的受權頁面  
  221.         case R.id.ctvRr:  
  222.             name = Renren.NAME;  
  223.             break;  
  224.         // 進入QQ空間的受權頁面  
  225.         case R.id.ctvQz:  
  226.             name = QZone.NAME;  
  227.             break;  
  228.         }  
  229.           
  230.         if (name != null) {  
  231.             return AbstractWeibo.getWeibo(this, name);  
  232.         }  
  233.         return null;  
  234.     }         
  235.   
  236.     /** 
  237.      * 受權成功的回調 
  238.      *  weibo - 回調的平臺 
  239.      *  action - 操做的類型 
  240.      *  res - 請求的數據經過res返回 
  241.      */  
  242.     @Override  
  243.     public void onComplete(AbstractWeibo weibo, int action,HashMap<String, Object> res) {  
  244.         Message msg = new Message();  
  245.         msg.arg1 = 1;  
  246.         msg.arg2 = action;  
  247.         msg.obj = weibo;  
  248.         handler.sendMessage(msg);         
  249.     }  
  250.   
  251.     /** 
  252.      * 受權失敗的回調 
  253.      */  
  254.     @Override  
  255.     public void onError(AbstractWeibo weibo, int action, Throwable t) {  
  256.         t.printStackTrace();  
  257.           
  258.         Message msg = new Message();  
  259.         msg.arg1 = 2;  
  260.         msg.arg2 = action;  
  261.         msg.obj = weibo;  
  262.         handler.sendMessage(msg);     
  263.     }  
  264.       
  265.     /** 
  266.      * 取消受權的回調 
  267.      */  
  268.     @Override  
  269.     public void onCancel(AbstractWeibo weibo, int action) {  
  270.         Message msg = new Message();  
  271.         msg.arg1 = 3;  
  272.         msg.arg2 = action;  
  273.         msg.obj = weibo;  
  274.         handler.sendMessage(msg);     
  275.     }  
  276.   
  277.     /**  
  278.      * 處理從受權頁面返回的結果 
  279.      *  
  280.      * 若是獲取到用戶的名稱,則顯示名稱;不然若是已經受權,則顯示平臺名稱 
  281.      */  
  282.     @Override  
  283.     public boolean handleMessage(Message msg) {  
  284.         AbstractWeibo weibo = (AbstractWeibo) msg.obj;  
  285.         String text = MainActivity.actionToString(msg.arg2);  
  286.   
  287.         switch (msg.arg1) {  
  288.             case 1: { // 成功  
  289.                 text = weibo.getName() + " completed at " + text;  
  290.                 Toast.makeText(this, text, Toast.LENGTH_SHORT).show();  
  291.             }  
  292.             break;  
  293.             case 2: { // 失敗  
  294.                 text = weibo.getName() + " caught error at " + text;  
  295.                 Toast.makeText(this, text, Toast.LENGTH_SHORT).show();  
  296.                 return false;  
  297.             }  
  298.             case 3: { // 取消  
  299.                 text = weibo.getName() + " canceled at " + text;  
  300.                 Toast.makeText(this, text, Toast.LENGTH_SHORT).show();  
  301.                 return false;  
  302.             }  
  303.         }  
  304.   
  305.         CheckedTextView ctv = getView(weibo);  
  306.         if (ctv != null) {  
  307.             ctv.setChecked(true);  
  308.             String userName = weibo.getDb().get("nickname"); // getAuthedUserName();  
  309.             if (userName == null || userName.length() <= 0  
  310.                     || "null".equals(userName)) {  
  311.                 userName = getWeiboName(weibo);  
  312.             }  
  313.             ctv.setText(userName);  
  314.         }  
  315.         return false;  
  316.     }  
  317. }  

十、獲取用戶信息界面,GetInfoActivity.java:

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. package com.yangyu.activity;  
  2.   
  3. import java.util.HashMap;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.Intent;  
  7. import android.os.Bundle;  
  8. import android.os.Handler;  
  9. import android.os.Handler.Callback;  
  10. import android.os.Message;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.widget.Button;  
  14. import android.widget.Toast;  
  15. import cn.sharesdk.framework.AbstractWeibo;  
  16. import cn.sharesdk.framework.TitleLayout;  
  17. import cn.sharesdk.framework.WeiboActionListener;  
  18. import cn.sharesdk.renren.Renren;  
  19. import cn.sharesdk.sina.weibo.SinaWeibo;  
  20. import cn.sharesdk.tencent.qzone.QZone;  
  21. import cn.sharesdk.tencent.weibo.TencentWeibo;  
  22.   
  23. import com.yangyu.mysharethings.R;  
  24.   
  25. /** 
  26.  * @author yangyu 
  27.  *  功能描述:獲取用戶資料 
  28.  *  
  29.  * 啓動頁面時傳遞一個int類型的字段type,用於標記獲取本身的資料(type = 0)仍是別人的資料(type = 1)。 
  30.  * 若是嘗試獲取別人的資料,示例代碼會獲取不一樣平臺Share SDK的官方賬號的資料。 
  31.  *  
  32.  * 若是資料獲取成功,會經過{@link ShowInforPage}展現 
  33.  */  
  34. public class GetInforActivity  extends Activity implements Callback, OnClickListener, WeiboActionListener {  
  35.       
  36.     //定義標題欄佈局對象  
  37.     private TitleLayout llTitle;  
  38.       
  39.     private Button sinaBt,renrenBt,qzoneBt,tengxunBt;  
  40.       
  41.     private Handler handler;  
  42.   
  43.     protected void onCreate(Bundle savedInstanceState) {  
  44.         super.onCreate(savedInstanceState);  
  45.                   
  46.         handler = new Handler(this);  
  47.           
  48.         setContentView(R.layout.activity_userinfo);  
  49.                       
  50.         initView();  
  51.           
  52.         initData();  
  53.                       
  54.     }  
  55.       
  56.     /** 
  57.      * 初始化組件 
  58.      */  
  59.     private void initView(){  
  60.         //獲得標題欄對象  
  61.         llTitle = (TitleLayout) findViewById(R.id.llTitle);  
  62.   
  63.         //獲得按鈕對象  
  64.         sinaBt    = (Button) findViewById(R.id.btnSw);  
  65.         renrenBt  = (Button) findViewById(R.id.btnRr);  
  66.         qzoneBt   = (Button) findViewById(R.id.btnQz);  
  67.         tengxunBt = (Button) findViewById(R.id.btnTc);  
  68.           
  69.           
  70.     }  
  71.       
  72.     /** 
  73.      * 初始化數據 
  74.      */  
  75.     private void initData(){  
  76.         //標題欄設置返回按鈕監聽  
  77.         llTitle.getBtnBack().setOnClickListener(this);  
  78.         //設置標題欄的標題文本  
  79.         llTitle.getTvTitle().setText(R.string.get_my_info);  
  80.           
  81.         //設置監聽  
  82.         sinaBt.setOnClickListener(this);  
  83.         renrenBt.setOnClickListener(this);  
  84.         qzoneBt.setOnClickListener(this);  
  85.         tengxunBt.setOnClickListener(this);  
  86.     }  
  87.       
  88.     /** 
  89.      * 點擊按鈕獲取受權用戶的資料 
  90.      */  
  91.     @Override  
  92.     public void onClick(View v) {  
  93.         if (v.equals(llTitle.getBtnBack())) {  
  94.             finish();  
  95.             return;  
  96.         }  
  97.           
  98.         String name = null;       
  99.           
  100.         switch (v.getId()) {  
  101.         case R.id.btnSw:  
  102.             name = SinaWeibo.NAME;  
  103.             break;  
  104.         case R.id.btnTc:  
  105.             name = TencentWeibo.NAME;  
  106.             break;  
  107.         case R.id.btnRr:  
  108.             name = Renren.NAME;  
  109.             break;  
  110.         case R.id.btnQz:  
  111.             name = QZone.NAME;  
  112.             break;  
  113.         }     
  114.           
  115.         if (name != null) {  
  116.             AbstractWeibo weibo = AbstractWeibo.getWeibo(this, name);  
  117.             weibo.setWeiboActionListener(this);  
  118.             String account = null;  
  119.               
  120.             weibo.showUser(account);  
  121.         }  
  122.     }  
  123.   
  124.     public void onComplete(AbstractWeibo weibo, int action,HashMap<String, Object> res) {  
  125.         Message msg = new Message();  
  126.         msg.arg1 = 1;  
  127.         msg.arg2 = action;  
  128.         msg.obj = weibo;  
  129.         handler.sendMessage(msg);  
  130.           
  131.         Message msg2 = new Message();  
  132.         msg2.what = 1;  
  133.         JsonUtils ju = new JsonUtils();  
  134.         String json = ju.fromHashMap(res);  
  135.         msg2.obj = ju.format(json);  
  136.         handler.sendMessage(msg2);  
  137.     }  
  138.   
  139.     public void onError(AbstractWeibo weibo, int action, Throwable t) {  
  140.         t.printStackTrace();  
  141.           
  142.         Message msg = new Message();  
  143.         msg.arg1 = 2;  
  144.         msg.arg2 = action;  
  145.         msg.obj = weibo;  
  146.         handler.sendMessage(msg);  
  147.     }  
  148.   
  149.     public void onCancel(AbstractWeibo weibo, int action) {  
  150.         Message msg = new Message();  
  151.         msg.arg1 = 3;  
  152.         msg.arg2 = action;  
  153.         msg.obj = weibo;  
  154.         handler.sendMessage(msg);  
  155.     }  
  156.   
  157.     /** 處理操做結果 */  
  158.     public boolean handleMessage(Message msg) {  
  159.         switch(msg.what) {  
  160.             case 1: {  
  161.                 Intent i = new Intent(this, ShowInforActivity.class);  
  162.                 i.putExtra("data", String.valueOf(msg.obj));  
  163.                 startActivity(i);  
  164.             }  
  165.             break;  
  166.             default: {  
  167.                 AbstractWeibo weibo = (AbstractWeibo) msg.obj;  
  168.                 String text = MainActivity.actionToString(msg.arg2);  
  169.                 switch (msg.arg1) {  
  170.                     case 1: { // 成功  
  171.                         text = weibo.getName() + " completed at " + text;  
  172.                     }  
  173.                     break;  
  174.                     case 2: { // 失敗  
  175.                         text = weibo.getName() + " caught error at " + text;  
  176.                     }  
  177.                     break;  
  178.                     case 3: { // 取消  
  179.                         text = weibo.getName() + " canceled at " + text;  
  180.                     }  
  181.                     break;  
  182.                 }  
  183.                   
  184.                 Toast.makeText(this, text, Toast.LENGTH_SHORT).show();  
  185.             }  
  186.             break;  
  187.         }  
  188.         return false;  
  189.     }  
  190.   
  191.       
  192. }  

十一、顯示用戶信息界面,ShowInfoActivity.java:

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. package com.yangyu.activity;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.widget.TextView;  
  8. import cn.sharesdk.framework.TitleLayout;  
  9.   
  10. import com.yangyu.mysharethings.R;  
  11.   
  12. /** 
  13.  * @author yangyu 
  14.  *  功能描述:顯示用戶信息資料 
  15.  */  
  16. public class ShowInforActivity  extends Activity implements OnClickListener {  
  17.     private TitleLayout llTitle;  
  18.   
  19.     protected void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.activity_show_userinfo);  
  22.           
  23.         llTitle = (TitleLayout) findViewById(R.id.llTitle);  
  24.         llTitle.getBtnBack().setOnClickListener(this);  
  25.         llTitle.getTvTitle().setText("用戶資料");  
  26.           
  27.         TextView tvJson = (TextView) findViewById(R.id.tvJson);  
  28.         tvJson.setText(getIntent().getStringExtra("data"));  
  29.     }  
  30.       
  31.     @Override  
  32.     public void onClick(View v) {  
  33.         if (v.equals(llTitle.getBtnBack())) {  
  34.             finish();  
  35.         }     
  36.     }  
  37.   
  38. }  

十二、這裏還定義了一個Json解析類去讀取受權用戶的信息,JsonUtils.java:

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. package com.yangyu.activity;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.Iterator;  
  6. import java.util.Map.Entry;  
  7. import org.json.JSONArray;  
  8. import org.json.JSONException;  
  9. import org.json.JSONObject;  
  10.   
  11. /** 
  12.  * @author yangyu 
  13.  *  功能描述:這是一個簡易的Json-HashMap轉換工具,能夠將普通的json數據(字符串) 
  14.  *  轉換爲一個HashMap<Srting, Object>表格,也能夠反過來操做。此外還支 
  15.  *  持將json數據格式化。 
  16.  */  
  17. public class JsonUtils {  
  18.       
  19.     /** 
  20.      * 將指定的json數據轉成 HashMap<String, Object>對象 
  21.      */  
  22.     public HashMap<String, Object> fromJson(String jsonStr) {  
  23.         try {  
  24.             if (jsonStr.startsWith("[")  
  25.                     && jsonStr.endsWith("]")) {  
  26.                 jsonStr = "{\"fakelist\":" + jsonStr + "}";  
  27.             }  
  28.               
  29.             JSONObject json = new JSONObject(jsonStr);  
  30.             return fromJson(json);  
  31.         } catch (Throwable t) {  
  32.             t.printStackTrace();  
  33.         }  
  34.         return new HashMap<String, Object>();  
  35.     }  
  36.       
  37.     private HashMap<String, Object> fromJson(JSONObject json) throws JSONException {  
  38.         HashMap<String, Object> map = new HashMap<String, Object>();  
  39.         @SuppressWarnings("unchecked")  
  40.         Iterator<String> iKey = json.keys();  
  41.         while(iKey.hasNext()) {  
  42.             String key = iKey.next();  
  43.             Object value = json.opt(key);  
  44.             if (JSONObject.NULL.equals(value)) {  
  45.                 value = null;  
  46.             }  
  47.             if (value != null) {  
  48.                 if (value instanceof JSONObject) {  
  49.                     value = fromJson((JSONObject)value);  
  50.                 }  
  51.                 else if (value instanceof JSONArray) {  
  52.                     value = fromJson((JSONArray)value);  
  53.                 }  
  54.                 map.put(key, value);  
  55.             }  
  56.         }  
  57.         return map;  
  58.     }  
  59.   
  60.     private ArrayList<Object> fromJson(JSONArray array)   
  61.             throws JSONException {  
  62.         ArrayList<Object> list = new ArrayList<Object>();  
  63.         for (int i = 0, size = array.length(); i < size; i++) {  
  64.             Object value = array.opt(i);  
  65.             if (value instanceof JSONObject) {  
  66.                 value = fromJson((JSONObject)value);  
  67.             }  
  68.             else if (value instanceof JSONArray) {  
  69.                 value = fromJson((JSONArray)value);  
  70.             }  
  71.             list.add(value);  
  72.         }  
  73.         return list;  
  74.     }  
  75.   
  76.     /** 
  77.      * 將指定的HashMap<String, Object>對象轉成json數據  
  78.      */  
  79.     public String fromHashMap(HashMap<String, Object> map) {  
  80.         try {  
  81.             return getJSONObject(map).toString();  
  82.         } catch (Throwable t) {  
  83.             t.printStackTrace();  
  84.         }  
  85.         return "";  
  86.     }  
  87.       
  88.     @SuppressWarnings("unchecked")  
  89.     private JSONObject getJSONObject(HashMap<String, Object> map)   
  90.             throws JSONException {  
  91.         JSONObject json = new JSONObject();  
  92.         for (Entry<String, Object> entry : map.entrySet()) {  
  93.             Object value = entry.getValue();  
  94.             if (value instanceof HashMap<?, ?>) {  
  95.                 value = getJSONObject((HashMap<String, Object>)value);  
  96.             }  
  97.             else if (value instanceof ArrayList<?>) {  
  98.                 value = getJSONArray((ArrayList<Object>)value);  
  99.             }  
  100.             json.put(entry.getKey(), value);  
  101.         }  
  102.         return json;  
  103.     }  
  104.       
  105.     @SuppressWarnings("unchecked")  
  106.     private JSONArray getJSONArray(ArrayList<Object> list)   
  107.             throws JSONException {  
  108.         JSONArray array = new JSONArray();  
  109.         for (Object value : list) {  
  110.             if (value instanceof HashMap<?, ?>) {  
  111.                 value = getJSONObject((HashMap<String, Object>)value);  
  112.             }  
  113.             else if (value instanceof ArrayList<?>) {  
  114.                 value = getJSONArray((ArrayList<Object>)value);  
  115.             }  
  116.             array.put(value);  
  117.         }  
  118.         return array;  
  119.     }  
  120.       
  121.     /** 
  122.      * 格式化一個json串 
  123.      */  
  124.     public String format(String jsonStr) {  
  125.         try {  
  126.             return format("", fromJson(jsonStr));  
  127.         } catch (Throwable t) {  
  128.             t.printStackTrace();  
  129.         }  
  130.         return "";  
  131.     }  
  132.       
  133.     @SuppressWarnings("unchecked")  
  134.     private String format(String sepStr, HashMap<String, Object> map) {  
  135.         StringBuffer sb = new StringBuffer();  
  136.         sb.append("{\n");  
  137.         String mySepStr = sepStr + "\t";  
  138.         int i = 0;  
  139.         for (Entry<String, Object> entry : map.entrySet()) {  
  140.             if (i > 0) {  
  141.                 sb.append(",\n");  
  142.             }  
  143.             sb.append(mySepStr).append('\"').append(entry.getKey()).append("\":");  
  144.             Object value = entry.getValue();  
  145.             if (value instanceof HashMap<?, ?>) {  
  146.                 sb.append(format(mySepStr, (HashMap<String, Object>)value));  
  147.             }  
  148.             else if (value instanceof ArrayList<?>) {  
  149.                 sb.append(format(mySepStr, (ArrayList<Object>)value));  
  150.             }  
  151.             else if (value instanceof String) {  
  152.                 sb.append('\"').append(value).append('\"');  
  153.             }  
  154.             else {  
  155.                 sb.append(value);  
  156.             }  
  157.             i++;  
  158.         }  
  159.         sb.append('\n').append(sepStr).append('}');  
  160.         return sb.toString();  
  161.     }  
  162.       
  163.     @SuppressWarnings("unchecked")  
  164.     private String format(String sepStr, ArrayList<Object> list) {  
  165.         StringBuffer sb = new StringBuffer();  
  166.         sb.append("[\n");  
  167.         String mySepStr = sepStr + "\t";  
  168.         int i = 0;  
  169.         for (Object value : list) {  
  170.             if (i > 0) {  
  171.                 sb.append(",\n");  
  172.             }  
  173.             sb.append(mySepStr);  
  174.             if (value instanceof HashMap<?, ?>) {  
  175.                 sb.append(format(mySepStr, (HashMap<String, Object>)value));  
  176.             }  
  177.             else if (value instanceof ArrayList<?>) {  
  178.                 sb.append(format(mySepStr, (ArrayList<Object>)value));  
  179.             }  
  180.             else if (value instanceof String) {  
  181.                 sb.append('\"').append(value).append('\"');  
  182.             }  
  183.             else {  
  184.                 sb.append(value);  
  185.             }  
  186.             i++;  
  187.         }  
  188.         sb.append('\n').append(sepStr).append(']');  
  189.         return sb.toString();  
  190.     }  
  191.       
  192. }  


             講到這裏關於這一篇的內容就差很少已經講完了,下一篇是關於微信開放平臺的受權以及分享,由於微信平臺不一樣於其它第三方平臺,實現起來稍微複雜一點,因此博主打算在下一篇的文章中詳細講解。這個下一篇文章估計要等到三天後了吧,博主和女朋友早就商量好趁着三天小長假出去散散心了,在這裏祝你們端午節快樂!博主將會長期堅持更新關於Android、Java、Cocos2d-x、Unity3d等各個不一樣知識領域的實例講解和開發!但願你們繼續支持!

源碼下載地址 

相關文章
相關標籤/搜索