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:
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:
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:
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:
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:
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:
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中插入下面的代碼:
//初始化ShareSDK
AbstractWeibo.initSDK(this);
這行代碼會初始化ShareSDK,此後對ShareSDK的操做都依次爲基礎。若是不在全部ShareSDK的操做以前調用這行代碼,會拋出空指針異常。
<2> 在項目的出口Activity的onDestroy方法的第一行插入下面的代碼:
protected void onDestroy() {
//結束ShareSDK的統計功能並釋放資源
AbstractWeibo.stopSDK(this);
super.onDestroy();
}
這行代碼會結束ShareSDK的統計功能並釋放資源。若是這行代碼沒有被調用,那麼「應用啓動次數」的統計將不會準確,由於應用可能歷來沒有被關閉。
InitSDK是能夠重複調用的,其實ShareSDK建議在你不肯定的時候調用這個方法,來保證ShareSDK被正確初始化。而stopSDK一旦調用了,就必須從新調用InitSDK才能使用ShareSDK的功能,不然會出現空指針異常。
在這段代碼中,還使用到了快捷分享,以下圖所示,點擊按鈕彈出快捷分享界面:

什麼是快捷分享呢?快捷分享是ShareSDK提供的一套基於其接口的GUI。經過簡單的配置,能夠在不考慮平臺的狀況下,調用不多的代碼,就完成分享的操做。快捷分享的jar包放在SDK解壓目錄的"Libs\ShareSDK-GUI"中,叫作"cn.sharesdk.oneshare.jar"。快捷分享使用了兩個Activity,須要在AndroidManifest.xml中註冊這兩個Activity:
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:
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:
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
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:
package com.yangyu.activity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* @author yangyu
* 功能描述:這是一個簡易的Json-HashMap轉換工具,能夠將普通的json數據(字符串)
* 轉換爲一個HashMap<Srting, Object>表格,也能夠反過來操做。此外還支
* 持將json數據格式化。
*/
public class JsonUtils {
/**
* 將指定的json數據轉成 HashMap<String, Object>對象
*/
public HashMap<String, Object> fromJson(String jsonStr) {
try {
if (jsonStr.startsWith("[")
&& jsonStr.endsWith("]")) {
jsonStr = "{\"fakelist\":" + jsonStr + "}";
}
JSONObject json = new JSONObject(jsonStr);
return fromJson(json);
} catch (Throwable t) {
t.printStackTrace();
}
return new HashMap<String, Object>();
}
private HashMap<String, Object> fromJson(JSONObject json) throws JSONException {
HashMap<String, Object> map = new HashMap<String, Object>();
@SuppressWarnings("unchecked")
Iterator<String> iKey = json.keys();
while(iKey.hasNext()) {
String key = iKey.next();
Object value = json.opt(key);
if (JSONObject.NULL.equals(value)) {
value = null;
}
if (value != null) {
if (value instanceof JSONObject) {
value = fromJson((JSONObject)value);
}
else if (value instanceof JSONArray) {
value = fromJson((JSONArray)value);
}
map.put(key, value);
}
}
return map;
}
private ArrayList<Object> fromJson(JSONArray array)
throws JSONException {
ArrayList<Object> list = new ArrayList<Object>();
for (int i = 0, size = array.length(); i < size; i++) {
Object value = array.opt(i);
if (value instanceof JSONObject) {
value = fromJson((JSONObject)value);
}
else if (value instanceof JSONArray) {
value = fromJson((JSONArray)value);
}
list.add(value);
}
return list;
}
/**
* 將指定的HashMap<String, Object>對象轉成json數據
*/
public String fromHashMap(HashMap<String, Object> map) {
try {
return getJSONObject(map).toString();
} catch (Throwable t) {
t.printStackTrace();
}
return "";
}
@SuppressWarnings("unchecked")
private JSONObject getJSONObject(HashMap<String, Object> map)
throws JSONException {
JSONObject json = new JSONObject();
for (Entry<String, Object> entry : map.entrySet()) {
Object value = entry.getValue();
if (value instanceof HashMap<?, ?>) {
value = getJSONObject((HashMap<String, Object>)value);
}
else if (value instanceof ArrayList<?>) {
value = getJSONArray((ArrayList<Object>)value);
}
json.put(entry.getKey(), value);
}
return json;
}
@SuppressWarnings("unchecked")
private JSONArray getJSONArray(ArrayList<Object> list)
throws JSONException {
JSONArray array = new JSONArray();
for (Object value : list) {
if (value instanceof HashMap<?, ?>) {
value = getJSONObject((HashMap<String, Object>)value);
}
else if (value instanceof ArrayList<?>) {
value = getJSONArray((ArrayList<Object>)value);
}
array.put(value);
}
return array;
}
/**
* 格式化一個json串
*/
public String format(String jsonStr) {
try {
return format("", fromJson(jsonStr));
} catch (Throwable t) {
t.printStackTrace();
}
return "";
}
@SuppressWarnings("unchecked")
private String format(String sepStr, HashMap<String, Object> map) {
StringBuffer sb = new StringBuffer();
sb.append("{\n");
String mySepStr = sepStr + "\t";
int i = 0;
for (Entry<String, Object> entry : map.entrySet()) {
if (i > 0) {
sb.append(",\n");
}
sb.append(mySepStr).append('\"').append(entry.getKey()).append("\":");
Object value = entry.getValue();
if (value instanceof HashMap<?, ?>) {
sb.append(format(mySepStr, (HashMap<String, Object>)value));
}
else if (value instanceof ArrayList<?>) {
sb.append(format(mySepStr, (ArrayList<Object>)value));
}
else if (value instanceof String) {
sb.append('\"').append(value).append('\"');
}
else {
sb.append(value);
}
i++;
}
sb.append('\n').append(sepStr).append('}');
return sb.toString();
}
@SuppressWarnings("unchecked")
private String format(String sepStr, ArrayList<Object> list) {
StringBuffer sb = new StringBuffer();
sb.append("[\n");
String mySepStr = sepStr + "\t";
int i = 0;
for (Object value : list) {
if (i > 0) {
sb.append(",\n");
}
sb.append(mySepStr);
if (value instanceof HashMap<?, ?>) {
sb.append(format(mySepStr, (HashMap<String, Object>)value));
}
else if (value instanceof ArrayList<?>) {
sb.append(format(mySepStr, (ArrayList<Object>)value));
}
else if (value instanceof String) {
sb.append('\"').append(value).append('\"');
}
else {
sb.append(value);
}
i++;
}
sb.append('\n').append(sepStr).append(']');
return sb.toString();
}
}
以上就是本文的所有內容,但願對你們的學習有所幫助,也但願你們多多支持腳本之家。