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

来源:互联网 发布:sql identity属性 编辑:程序博客网 时间:2024/05/29 12:39

操作步骤:

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 plaincopy在CODE上查看代码片派生到我的代码片
  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 plaincopy在CODE上查看代码片派生到我的代码片
  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 plaincopy在CODE上查看代码片派生到我的代码片
  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 plaincopy在CODE上查看代码片派生到我的代码片
  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 plaincopy在CODE上查看代码片派生到我的代码片
  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 plaincopy在CODE上查看代码片派生到我的代码片
  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 plaincopy在CODE上查看代码片派生到我的代码片
  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 plaincopy在CODE上查看代码片派生到我的代码片
  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 plaincopy在CODE上查看代码片派生到我的代码片
  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 plaincopy在CODE上查看代码片派生到我的代码片
  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>  


DEMO下载地址:http://download.csdn.net/detail/u010142437/6885943

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果手机邮箱被删除了怎么办 亚马逊卖家登录邮箱被盗怎么办 邮箱名字被注册了怎么办 忘了注册的邮箱名字怎么办 大众车钥匙丢了怎么办 锁柜钥匙丢了怎么办 邮箱的储存空间太小怎么办 扣扣邮箱不支持打开文件怎么办 邮箱大师群发不了邮件怎么办 邮政uk密码忘了怎么办 dns配置错误网页打不开怎么办 手机邮箱收不到邮件怎么办 wifi的那个用户密码错了怎么办 天翼校园客户端连不上怎么办 公司不小心外发邮件怎么办 steam账号被盗邮箱被改怎么办 steam被盗绑定邮箱被改怎么办 简历邮件发错了怎么办 发了简历不回复怎么办 发了简历没回复怎么办 发了简历邮件没有回复怎么办 快手绑定的手机号不用了怎么办 绑定银行卡的手机号不用了怎么办 oppo账号密码忘了怎么办 魅族账号密码忘了怎么办 苹果手机账号密码忘了怎么办 oppo手机账号密码忘了怎么办 华为手机账号密码忘了怎么办 vivo手机账号密码忘了怎么办 金立s9密码忘了怎么办 手机密号忘了怎么办 qq号忘了账号怎么办 推特密码忘了怎么办 沃邮箱改密码短信延迟怎么办 被qq好友拉黑了怎么办 网易邮箱字体变小了怎么办 邮箱注册不了全拼怎么办 家用电器接入两相火线后怎么办 手机充电板坏了怎么办 闪电宝商户乱跳怎么办 网易邮箱发错了怎么办