使用share SDK实现QQ空间授权登录、分享(1.x版本)

操作步骤:

1、在share官网注册应用生成AppKey并下载SDK     网址:http://www.shareSDK.cn

2、在QQ空间平台注册应用生成AppId和AppKey    网址:http://connect.qq.com/intro/login/

3、导入SDK包。只实现QQ空间登录分享的话只需要导入ShareSDK-Core.jar(核心包)、ShareSDK-QZone.jar(QQ空间)、cn.sharesdk.onekeyshare.jar(快捷分享)

4、配置:需要配置assets里面的ShareSDKDevInfor.xml和AndroidManifest.xml(后面有示例介绍)

5、添加代码实现登录、获取信息、分享等功能(见下面示例)。

ShareSDKDevInfor.xml:

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <DevInfor>  
  3.     <!--说明:        
  4.         1、表格中的第一项  
  5.             <ShareSDK AppKey="api20" />  
  6.         是必须的,其中的AppKey是你在Share SDK上注册的开发者帐号的AppKey  
  7.           
  8.         2、所有集成到你项目的平台都应该为其在表格中填写相对应的开发者信息,以新浪微博为例:  
  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 = "123d2e98bef8"/> <!-- AppKey="104972cdd48" "23a9371d3a8"-->  
  35.      
  36.     <QZone  
  37.         SortId="1"  
  38.         AppId="100371282"  
  39.         AppKey="aed9b0303e3ed1e27bae87c33761161d"  
  40.         Id="1"  
  41.         RedirectUrl="http://www.shareSDK.cn" />  
  42.                
  43. </DevInfor>  

AndroidManifest.xml:

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.home.testqqshare"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="8"  
  9.         android:targetSdkVersion="17" />  
  10.   
  11.     <uses-permission android:name="android.permission.INTERNET" />  
  12.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
  13.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
  14.     <uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />  
  15.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />  
  16.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
  17.     <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
  18.     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />  
  19.   
  20.     <application  
  21.         android:allowBackup="true"  
  22.         android:icon="@drawable/ic_launcher"  
  23.         android:label="@string/app_name"  
  24.         android:theme="@style/AppTheme" >  
  25.         <activity  
  26.             android:name="com.home.testqqshare.LoginActivity"  
  27.             android:label="@string/app_name" >  
  28.             <intent-filter>  
  29.                 <action android:name="android.intent.action.MAIN" />  
  30.   
  31.                 <category android:name="android.intent.category.LAUNCHER" />  
  32.             </intent-filter>  
  33.         </activity>  
  34.         <activity android:name="com.home.testqqshare.MainActivity" />  
  35.         <activity android:name="com.home.testqqshare.ShowInfoActivity" />  
  36.   
  37.         <!-- share SDK 里面的组件 -->  
  38.         <activity  
  39.             android:name="cn.sharesdk.framework.AuthorizeActivity"  
  40.             android:configChanges="keyboardHidden|orientation"  
  41.             android:screenOrientation="portrait"  
  42.             android:theme="@android:style/Theme.Translucent.NoTitleBar"  
  43.             android:windowSoftInputMode="stateHidden|adjustResize" >  
  44.         </activity>  
  45.         <activity  
  46.             android:name="cn.sharesdk.onekeyshare.ShareAllGird"  
  47.             android:configChanges="keyboardHidden|orientation"  
  48.             android:screenOrientation="portrait"  
  49.             android:theme="@android:style/Theme.Translucent.NoTitleBar"  
  50.             android:windowSoftInputMode="adjustPan|stateHidden" />  
  51.         <activity  
  52.             android:name="cn.sharesdk.onekeyshare.SharePage"  
  53.             android:configChanges="keyboardHidden|orientation"  
  54.             android:screenOrientation="portrait"  
  55.             android:windowSoftInputMode="stateHidden|adjustResize" />  
  56.     </application>  
  57.   
  58. </manifest>  

LoginActivity:

[java]  view plain copy
  1. package com.home.testqqshare;  
  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.WeiboActionListener;  
  17. import cn.sharesdk.tencent.qzone.QZone;  
  18.   
  19. public class LoginActivity extends Activity implements OnClickListener,  
  20.         WeiboActionListener, Callback {  
  21.     private Button loginBtn;  
  22.     private Handler handler;  
  23.   
  24.     @Override  
  25.     protected void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.         setContentView(R.layout.login);  
  28.         // 初始化ShareSDK  
  29.         AbstractWeibo.initSDK(this);  
  30.         loginBtn = (Button) findViewById(R.id.login_btn_QQ);  
  31.         loginBtn.setOnClickListener(this);  
  32.         handler = new Handler(this);  
  33.     }  
  34.   
  35.     @Override  
  36.     public void onClick(View v) {  
  37.         if (v == loginBtn) {  
  38.             AbstractWeibo weibo = AbstractWeibo.getWeibo(this, QZone.NAME);  
  39.             weibo.setWeiboActionListener(this);  
  40.             weibo.showUser(null);  
  41.         }  
  42.     }  
  43.   
  44.     @Override  
  45.     public void onComplete(AbstractWeibo weibo, int arg1,  
  46.             HashMap<String, Object> arg2) {  
  47.         Message msg = new Message();  
  48.         msg.arg1 = 1;  
  49.         msg.obj = weibo;  
  50.         handler.sendMessage(msg);  
  51.     }  
  52.   
  53.     @Override  
  54.     public void onError(AbstractWeibo weibo, int arg1, Throwable t) {  
  55.         t.printStackTrace();  
  56.         Message msg = new Message();  
  57.         msg.arg1 = 2;  
  58.         msg.obj = weibo;  
  59.         handler.sendMessage(msg);  
  60.     }  
  61.   
  62.     @Override  
  63.     public void onCancel(AbstractWeibo weibo, int arg1) {  
  64.         Message msg = new Message();  
  65.         msg.arg1 = 3;  
  66.         msg.obj = weibo;  
  67.         handler.sendMessage(msg);  
  68.     }  
  69.   
  70.     @Override  
  71.     protected void onDestroy() {  
  72.         // 结束ShareSDK的统计功能并释放资源  
  73.         AbstractWeibo.stopSDK(this);  
  74.         super.onDestroy();  
  75.     }  
  76.   
  77.     /** 
  78.      * 处理从授权页面返回的结果:异常则给出提示,正常则跳转页面 
  79.      *  
  80.      */  
  81.     @Override  
  82.     public boolean handleMessage(Message msg) {  
  83.         AbstractWeibo weibo = (AbstractWeibo) msg.obj;  
  84.         switch (msg.arg1) {  
  85.         case 1: { // 成功  
  86.             Toast.makeText(this, weibo.getName() + "授权成功", Toast.LENGTH_SHORT)  
  87.                     .show();  
  88.         }  
  89.             break;  
  90.         case 2: { // 失败  
  91.             Toast.makeText(this, weibo.getName() + "授权失败", Toast.LENGTH_SHORT)  
  92.                     .show();  
  93.             return false;  
  94.         }  
  95.         case 3: { // 取消  
  96.             Toast.makeText(this, weibo.getName() + "授权取消", Toast.LENGTH_SHORT)  
  97.                     .show();  
  98.             return false;  
  99.         }  
  100.         }  
  101.         Intent intent = new Intent(LoginActivity.this, MainActivity.class);  
  102.         startActivity(intent);  
  103.         return false;  
  104.     }  
  105. }  

MainActivity:

[java]  view plain copy
  1. package com.home.testqqshare;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileOutputStream;  
  5. import java.util.HashMap;  
  6.   
  7. import android.app.Activity;  
  8. import android.content.Intent;  
  9. import android.graphics.Bitmap;  
  10. import android.graphics.Bitmap.CompressFormat;  
  11. import android.graphics.BitmapFactory;  
  12. import android.os.Bundle;  
  13. import android.os.Environment;  
  14. import android.os.Handler;  
  15. import android.os.Handler.Callback;  
  16. import android.os.Message;  
  17. import android.view.View;  
  18. import android.view.View.OnClickListener;  
  19. import android.widget.Button;  
  20. import android.widget.Toast;  
  21. import cn.sharesdk.framework.AbstractWeibo;  
  22. import cn.sharesdk.framework.WeiboActionListener;  
  23. import cn.sharesdk.onekeyshare.ShareAllGird;  
  24. import cn.sharesdk.tencent.qzone.QZone;  
  25.   
  26. public class MainActivity extends Activity implements OnClickListener,  
  27.         WeiboActionListener, Callback {  
  28.     private Button getInfoBtn;  
  29.     private Button noUIShareBtn;  
  30.     private Button hasUIShareBtn;  
  31.     private Button logoutBtn;  
  32.     private Handler handler;  
  33.     // 定义图片存放的地址  
  34.     public static String TEST_IMAGE;  
  35.   
  36.     @Override  
  37.     protected void onCreate(Bundle savedInstanceState) {  
  38.         super.onCreate(savedInstanceState);  
  39.         setContentView(R.layout.main);  
  40.         AbstractWeibo.initSDK(this);  
  41.         initWidget();  
  42.         initImage();  
  43.     }  
  44.   
  45.     /** 
  46.      * 初始化UI相关组件 
  47.      */  
  48.     private void initWidget() {  
  49.         getInfoBtn = (Button) findViewById(R.id.main_get_userinfo);  
  50.         noUIShareBtn = (Button) findViewById(R.id.main_share_noUI);  
  51.         hasUIShareBtn = (Button) findViewById(R.id.main_share_hasUI);  
  52.         logoutBtn = (Button) findViewById(R.id.main_btn_logout);  
  53.         getInfoBtn.setOnClickListener(this);  
  54.         noUIShareBtn.setOnClickListener(this);  
  55.         hasUIShareBtn.setOnClickListener(this);  
  56.         logoutBtn.setOnClickListener(this);  
  57.         handler = new Handler(this);  
  58.     }  
  59.   
  60.     @Override  
  61.     public void onClick(View v) {  
  62.         if (v == getInfoBtn) {  
  63.             AbstractWeibo weibo = AbstractWeibo.getWeibo(this, QZone.NAME);  
  64.             weibo.setWeiboActionListener(this);  
  65.             weibo.showUser(null);  
  66.         } else if (v == noUIShareBtn) {  
  67.             showGrid(true);  
  68.         } else if (v == hasUIShareBtn) {  
  69.             showGrid(false);  
  70.         } else if (v == logoutBtn) {// 注销  
  71.             AbstractWeibo weibo = AbstractWeibo.getWeibo(this, QZone.NAME);  
  72.             if (weibo.isValid()) {  
  73.                 weibo.removeAccount();  
  74.                 finish();  
  75.             }  
  76.         }  
  77.     }  
  78.   
  79.     @Override  
  80.     public void onCancel(AbstractWeibo weibo, int arg1) {  
  81.         Message msg = new Message();  
  82.         msg.arg1 = 3;  
  83.         msg.obj = weibo;  
  84.         handler.sendMessage(msg);  
  85.     }  
  86.   
  87.     @Override  
  88.     public void onComplete(AbstractWeibo weibo, int arg1,  
  89.             HashMap<String, Object> res) {  
  90.         Message msg = new Message();  
  91.         msg.arg1 = 1;  
  92.         JsonUtils ju = new JsonUtils();  
  93.         String json = ju.fromHashMap(res);  
  94.         msg.obj = ju.format(json);  
  95.         handler.sendMessage(msg);  
  96.     }  
  97.   
  98.     @Override  
  99.     public void onError(AbstractWeibo weibo, int arg1, Throwable arg2) {  
  100.         Message msg = new Message();  
  101.         msg.arg1 = 2;  
  102.         msg.obj = weibo;  
  103.         handler.sendMessage(msg);  
  104.     }  
  105.   
  106.     /** 处理操作结果 */  
  107.     public boolean handleMessage(Message msg) {  
  108.         switch (msg.arg1) {  
  109.         case 1: { // 成功  
  110.             Intent intent = new Intent(MainActivity.this,  
  111.                     ShowInfoActivity.class);  
  112.             intent.putExtra("data", String.valueOf(msg.obj));  
  113.             startActivity(intent);  
  114.         }  
  115.             break;  
  116.         case 2: {// 失败  
  117.             AbstractWeibo weibo = (AbstractWeibo) msg.obj;  
  118.             Toast.makeText(this, weibo.getName() + "授权失败", Toast.LENGTH_SHORT)  
  119.                     .show();  
  120.         }  
  121.             break;  
  122.         case 3: {// 取消  
  123.             AbstractWeibo weibo = (AbstractWeibo) msg.obj;  
  124.             Toast.makeText(this, weibo.getName() + "授权取消", Toast.LENGTH_SHORT)  
  125.                     .show();  
  126.         }  
  127.             break;  
  128.         }  
  129.         return false;  
  130.     }  
  131.   
  132.     /** 
  133.      * 使用快捷分享完成图文分享 
  134.      *  
  135.      * @param silent 
  136.      *            是否直接分享 
  137.      */  
  138.     private void showGrid(boolean silent) {  
  139.         Intent i = new Intent(this, ShareAllGird.class);  
  140.         // 分享时Notification的图标  
  141.         i.putExtra("notif_icon", R.drawable.ic_launcher);  
  142.         // 分享时Notification的标题  
  143.         i.putExtra("notif_title"this.getString(R.string.app_name));  
  144.   
  145.         // title标题,在印象笔记、邮箱、信息、微信(包括好友和朋友圈)、人人网和QQ空间使用,否则可以不提供  
  146.         i.putExtra("title"this.getString(R.string.share));  
  147.         // titleUrl是标题的网络链接,仅在人人网和QQ空间使用,否则可以不提供  
  148.         i.putExtra("titleUrl""http://sharesdk.cn");  
  149.         // text是分享文本,所有平台都需要这个字段  
  150.         i.putExtra("text"this.getString(R.string.share_content));  
  151.         // imagePath是本地的图片路径,所有平台都支持这个字段,不提供,则表示不分享图片  
  152.         i.putExtra("imagePath", MainActivity.TEST_IMAGE);  
  153.         // url仅在微信(包括好友和朋友圈)中使用,否则可以不提供  
  154.         i.putExtra("url""http://sharesdk.cn");  
  155.         // thumbPath是缩略图的本地路径,仅在微信(包括好友和朋友圈)中使用,否则可以不提供  
  156.         i.putExtra("thumbPath", MainActivity.TEST_IMAGE);  
  157.         // appPath是待分享应用程序的本地路劲,仅在微信(包括好友和朋友圈)中使用,否则可以不提供  
  158.         i.putExtra("appPath", MainActivity.TEST_IMAGE);  
  159.         // comment是我对这条分享的评论,仅在人人网和QQ空间使用,否则可以不提供  
  160.         i.putExtra("comment"this.getString(R.string.share));  
  161.         // site是分享此内容的网站名称,仅在QQ空间使用,否则可以不提供  
  162.         i.putExtra("site"this.getString(R.string.app_name));  
  163.         // siteUrl是分享此内容的网站地址,仅在QQ空间使用,否则可以不提供  
  164.         i.putExtra("siteUrl""http://sharesdk.cn");  
  165.   
  166.         // 是否直接分享  
  167.         i.putExtra("silent", silent);  
  168.         this.startActivity(i);  
  169.     }  
  170.   
  171.     /** 
  172.      * 初始化分享的本地图片 
  173.      */  
  174.     private void initImage() {  
  175.         try {// 判断SD卡中是否存在此文件夹  
  176.             if (Environment.MEDIA_MOUNTED.equals(Environment  
  177.                     .getExternalStorageState())  
  178.                     && Environment.getExternalStorageDirectory().exists()) {  
  179.                 File baseFile = new File(  
  180.                         Environment.getExternalStorageDirectory(), "share");  
  181.                 if (!baseFile.exists()) {  
  182.                     baseFile.mkdir();  
  183.                 }  
  184.                 TEST_IMAGE = baseFile.getAbsolutePath() + "/picture.png";  
  185.             } else {  
  186.                 TEST_IMAGE = getApplication().getFilesDir().getAbsolutePath()  
  187.                         + "/picture.png";  
  188.             }  
  189.             File file = new File(TEST_IMAGE);  
  190.             // 判断图片是否存此文件夹中  
  191.             if (!file.exists()) {  
  192.                 file.createNewFile();  
  193.                 Bitmap pic = BitmapFactory.decodeResource(getResources(),  
  194.                         R.drawable.picture);  
  195.                 FileOutputStream fos = new FileOutputStream(file);  
  196.                 pic.compress(CompressFormat.JPEG, 100, fos);  
  197.                 fos.flush();  
  198.                 fos.close();  
  199.             }  
  200.         } catch (Throwable t) {  
  201.             t.printStackTrace();  
  202.             TEST_IMAGE = null;  
  203.         }  
  204.     }  
  205.   
  206. }  

显示信息ShowInfoActivity:

[java]  view plain copy
  1. package com.home.testqqshare;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.widget.TextView;  
  6.   
  7. public class ShowInfoActivity extends Activity {  
  8.     @Override  
  9.     protected void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.show_info);  
  12.         TextView show = (TextView) findViewById(R.id.show_info_tv);  
  13.         show.setText(getIntent().getStringExtra("data"));  
  14.   
  15.     }  
  16. }  

JsonUtils工具类:

[java]  view plain copy
  1. package com.home.testqqshare;  
  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. public class JsonUtils {  
  12.   
  13.     /** 
  14.      * 将指定的json数据转成 HashMap<String, Object>对象 
  15.      */  
  16.     public HashMap<String, Object> fromJson(String jsonStr) {  
  17.         try {  
  18.             if (jsonStr.startsWith("[") && jsonStr.endsWith("]")) {  
  19.                 jsonStr = "{\"fakelist\":" + jsonStr + "}";  
  20.             }  
  21.   
  22.             JSONObject json = new JSONObject(jsonStr);  
  23.             return fromJson(json);  
  24.         } catch (Throwable t) {  
  25.             t.printStackTrace();  
  26.         }  
  27.         return new HashMap<String, Object>();  
  28.     }  
  29.   
  30.     private HashMap<String, Object> fromJson(JSONObject json)  
  31.             throws JSONException {  
  32.         HashMap<String, Object> map = new HashMap<String, Object>();  
  33.         @SuppressWarnings("unchecked")  
  34.         Iterator<String> iKey = json.keys();  
  35.         while (iKey.hasNext()) {  
  36.             String key = iKey.next();  
  37.             Object value = json.opt(key);  
  38.             if (JSONObject.NULL.equals(value)) {  
  39.                 value = null;  
  40.             }  
  41.             if (value != null) {  
  42.                 if (value instanceof JSONObject) {  
  43.                     value = fromJson((JSONObject) value);  
  44.                 } else if (value instanceof JSONArray) {  
  45.                     value = fromJson((JSONArray) value);  
  46.                 }  
  47.                 map.put(key, value);  
  48.             }  
  49.         }  
  50.         return map;  
  51.     }  
  52.   
  53.     private ArrayList<Object> fromJson(JSONArray array) throws JSONException {  
  54.         ArrayList<Object> list = new ArrayList<Object>();  
  55.         for (int i = 0, size = array.length(); i < size; i++) {  
  56.             Object value = array.opt(i);  
  57.             if (value instanceof JSONObject) {  
  58.                 value = fromJson((JSONObject) value);  
  59.             } else if (value instanceof JSONArray) {  
  60.                 value = fromJson((JSONArray) value);  
  61.             }  
  62.             list.add(value);  
  63.         }  
  64.         return list;  
  65.     }  
  66.   
  67.     /** 
  68.      * 将指定的HashMap<String, Object>对象转成json数据 
  69.      */  
  70.     public String fromHashMap(HashMap<String, Object> map) {  
  71.         try {  
  72.             return getJSONObject(map).toString();  
  73.         } catch (Throwable t) {  
  74.             t.printStackTrace();  
  75.         }  
  76.         return "";  
  77.     }  
  78.   
  79.     @SuppressWarnings("unchecked")  
  80.     private JSONObject getJSONObject(HashMap<String, Object> map)  
  81.             throws JSONException {  
  82.         JSONObject json = new JSONObject();  
  83.         for (Entry<String, Object> entry : map.entrySet()) {  
  84.             Object value = entry.getValue();  
  85.             if (value instanceof HashMap<?, ?>) {  
  86.                 value = getJSONObject((HashMap<String, Object>) value);  
  87.             } else if (value instanceof ArrayList<?>) {  
  88.                 value = getJSONArray((ArrayList<Object>) value);  
  89.             }  
  90.             json.put(entry.getKey(), value);  
  91.         }  
  92.         return json;  
  93.     }  
  94.   
  95.     @SuppressWarnings("unchecked")  
  96.     private JSONArray getJSONArray(ArrayList<Object> list) throws JSONException {  
  97.         JSONArray array = new JSONArray();  
  98.         for (Object value : list) {  
  99.             if (value instanceof HashMap<?, ?>) {  
  100.                 value = getJSONObject((HashMap<String, Object>) value);  
  101.             } else if (value instanceof ArrayList<?>) {  
  102.                 value = getJSONArray((ArrayList<Object>) value);  
  103.             }  
  104.             array.put(value);  
  105.         }  
  106.         return array;  
  107.     }  
  108.   
  109.     /** 
  110.      * 格式化一个json串 
  111.      */  
  112.     public String format(String jsonStr) {  
  113.         try {  
  114.             return format("", fromJson(jsonStr));  
  115.         } catch (Throwable t) {  
  116.             t.printStackTrace();  
  117.         }  
  118.         return "";  
  119.     }  
  120.   
  121.     @SuppressWarnings("unchecked")  
  122.     private String format(String sepStr, HashMap<String, Object> map) {  
  123.         StringBuffer sb = new StringBuffer();  
  124.         sb.append("{\n");  
  125.         String mySepStr = sepStr + "\t";  
  126.         int i = 0;  
  127.         for (Entry<String, Object> entry : map.entrySet()) {  
  128.             if (i > 0) {  
  129.                 sb.append(",\n");  
  130.             }  
  131.             sb.append(mySepStr).append('\"').append(entry.getKey())  
  132.                     .append("\":");  
  133.             Object value = entry.getValue();  
  134.             if (value instanceof HashMap<?, ?>) {  
  135.                 sb.append(format(mySepStr, (HashMap<String, Object>) value));  
  136.             } else if (value instanceof ArrayList<?>) {  
  137.                 sb.append(format(mySepStr, (ArrayList<Object>) value));  
  138.             } else if (value instanceof String) {  
  139.                 sb.append('\"').append(value).append('\"');  
  140.             } else {  
  141.                 sb.append(value);  
  142.             }  
  143.             i++;  
  144.         }  
  145.         sb.append('\n').append(sepStr).append('}');  
  146.         return sb.toString();  
  147.     }  
  148.   
  149.     @SuppressWarnings("unchecked")  
  150.     private String format(String sepStr, ArrayList<Object> list) {  
  151.         StringBuffer sb = new StringBuffer();  
  152.         sb.append("[\n");  
  153.         String mySepStr = sepStr + "\t";  
  154.         int i = 0;  
  155.         for (Object value : list) {  
  156.             if (i > 0) {  
  157.                 sb.append(",\n");  
  158.             }  
  159.             sb.append(mySepStr);  
  160.             if (value instanceof HashMap<?, ?>) {  
  161.                 sb.append(format(mySepStr, (HashMap<String, Object>) value));  
  162.             } else if (value instanceof ArrayList<?>) {  
  163.                 sb.append(format(mySepStr, (ArrayList<Object>) value));  
  164.             } else if (value instanceof String) {  
  165.                 sb.append('\"').append(value).append('\"');  
  166.             } else {  
  167.                 sb.append(value);  
  168.             }  
  169.             i++;  
  170.         }  
  171.         sb.append('\n').append(sepStr).append(']');  
  172.         return sb.toString();  
  173.     }  
  174.   
  175. }  

登录界面布局文件login.xml:

[java]  view plain copy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="match_parent"  
  3.     android:layout_height="match_parent"  
  4.     android:orientation="vertical"  
  5.     android:gravity="center_horizontal">  
  6.   
  7.     <Button  
  8.         android:id="@+id/login_btn_QQ"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:text="QQ授权登录" />  
  12.   
  13. </LinearLayout>  

主布局文件main.xml:

[html]  view plain copy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="match_parent"  
  3.     android:layout_height="match_parent"  
  4.     android:orientation="vertical" >  
  5.   
  6.     <Button  
  7.         android:id="@+id/main_get_userinfo"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="获取用户信息" />  
  11.   
  12.     <Button  
  13.         android:id="@+id/main_share_noUI"  
  14.         android:layout_width="match_parent"  
  15.         android:layout_height="wrap_content"  
  16.         android:text="分享(无界面)" />  
  17.   
  18.     <Button  
  19.         android:id="@+id/main_share_hasUI"  
  20.         android:layout_width="match_parent"  
  21.         android:layout_height="wrap_content"  
  22.         android:text="分享(有界面)" />  
  23.   
  24.     <Button  
  25.         android:id="@+id/main_btn_logout"  
  26.         android:layout_width="match_parent"  
  27.         android:layout_height="wrap_content"  
  28.         android:text="注销登录" />  
  29.   
  30. </LinearLayout>  

显示信息的布局show_info.xml:

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <ScrollView  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:layout_alignParentTop="true" >  
  11.   
  12.         <TextView  
  13.             android:id="@+id/show_info_tv"  
  14.             android:layout_width="match_parent"  
  15.             android:layout_height="wrap_content"  
  16.             android:layout_marginRight="10dp"  
  17.             android:autoLink="all"  
  18.             android:textColor="#ff000000" />  
  19.     </ScrollView>  
  20.   
  21. </RelativeLayout>  

strings:

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.   
  4.     <string name="app_name">TestQQShare</string>  
  5.     <string name="action_settings">Settings</string>  
  6.     <string name="hello_world">Hello world!</string>  
  7.     <string name="share_content">测试使用shareSDK进行分享,感觉还不错,使用方便,功能强大!</string>  
  8.     <string name="share">分享</string>  
  9. </resources>  

你可能感兴趣的:(ShareSDK)