使用share SDK实现新浪微博授权登录分享(1.x版本)

操作步骤:

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

2、在新浪微博平台注册应用生成AppId和AppKey    网址:http://open.weibo.com

3、导入SDK包。只实现新浪微博授权登录分享的话只需要导入ShareSDK-Core.jar(核心包)、ShareSDK-SinaWeibo.jar(新浪微博)、cn.sharesdk.onekeyshare.jar(快捷分享)

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

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

ShareSDKDevInfor.xml:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <DevInfor>  
  3.   
  4.     <!--  
  5.         说明:       
  6.         1、表格中的第一项  
  7.             <ShareSDK AppKey="api20" />  
  8.         是必须的,其中的AppKey是你在Share SDK上注册的开发者帐号的AppKey  
  9.           
  10.         2、所有集成到你项目的平台都应该为其在表格中填写相对应的开发者信息,以新浪微博为例:  
  11.             <SinaWeibo  
  12.                 SortId="此平台在分享列表中的位置,由开发者自行定义,可以是任何整型数字,数值越大越靠后"  
  13.                 AppKey="填写你在新浪微博上注册的AppKey"  
  14.                 AppSecret="填写你在新浪微博上注册到的AppKey"  
  15.                 Id="自定义字段,整形,用于你项目中对此平台的识别符"  
  16.                 RedirectUrl="填写你在新浪微博上注册的RedirectUrl" />         
  17.           
  18.         各个平台注册应用信息的地址如下:  
  19.             新浪微博:http://open.weibo.com  
  20.             腾讯微博:http://dev.t.qq.com  
  21.             QQ空间:http://connect.qq.com/intro/login/  
  22.             网易微博:http://open.t.163.com  
  23.             搜狐微博:http://open.t.sohu.com  
  24.             豆瓣:http://developers.douban.com  
  25.             人人网:http://dev.renren.com  
  26.             开心网:http://open.kaixin001.com  
  27.             Instapaper:http://www.instapaper.com/main/request_oauth_consumer_token  
  28.             有道云笔记:http://note.youdao.com/open/developguide.html#app  
  29.             facebook:https://developers.facebook.com  
  30.             twitter:https://dev.twitter.com  
  31.             搜狐随身看:https://open.sohu.com  
  32.             QQ好友分享:http://mobile.qq.com/api/  
  33.             微信:http://open.weixin.qq.com  
  34.   
  35.     -->  
  36.   
  37.     <ShareSDK AppKey="123d2e98bef8" />  
  38.     <!-- AppKey="104972cdd48" "23a9371d3a8" -->  
  39.   
  40.     <SinaWeibo  
  41.         AppKey="3201194191"  
  42.         AppSecret="0334252914651e8f76bad63337b3b78f"  
  43.         Id="1"  
  44.         RedirectUrl="http://appgo.cn"  
  45.         SortId="1" />  
  46.   
  47. </DevInfor>  

AndroidManifest.xml:

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

主界面MainActivity:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.home.sinamicroblog;  
  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.sina.weibo.SinaWeibo;  
  25.   
  26. public class MainActivity extends Activity implements OnClickListener,  
  27.         Callback, WeiboActionListener {  
  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, SinaWeibo.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, SinaWeibo.NAME);  
  72.             if (weibo.isValid()) {  
  73.                 weibo.removeAccount();  
  74.                 finish();  
  75.             }  
  76.         }  
  77.     }  
  78.   
  79.     /** 处理操作结果 */  
  80.     public boolean handleMessage(Message msg) {  
  81.         switch (msg.arg1) {  
  82.         case 1: { // 成功  
  83.             Intent intent = new Intent(MainActivity.this,  
  84.                     ShowInfoActivity.class);  
  85.             intent.putExtra("data", String.valueOf(msg.obj));  
  86.             startActivity(intent);  
  87.         }  
  88.             break;  
  89.         case 2: {// 失败  
  90.             AbstractWeibo weibo = (AbstractWeibo) msg.obj;  
  91.             Toast.makeText(this, weibo.getName() + "授权失败", Toast.LENGTH_SHORT)  
  92.                     .show();  
  93.         }  
  94.             break;  
  95.         case 3: {// 取消  
  96.             AbstractWeibo weibo = (AbstractWeibo) msg.obj;  
  97.             Toast.makeText(this, weibo.getName() + "授权取消", Toast.LENGTH_SHORT)  
  98.                     .show();  
  99.         }  
  100.             break;  
  101.         }  
  102.         return false;  
  103.     }  
  104.   
  105.     /** 
  106.      * 初始化分享的本地图片 
  107.      */  
  108.     private void initImage() {  
  109.         try {// 判断SD卡中是否存在此文件夹  
  110.             if (Environment.MEDIA_MOUNTED.equals(Environment  
  111.                     .getExternalStorageState())  
  112.                     && Environment.getExternalStorageDirectory().exists()) {  
  113.                 File baseFile = new File(  
  114.                         Environment.getExternalStorageDirectory(), "share");  
  115.                 if (!baseFile.exists()) {  
  116.                     baseFile.mkdir();  
  117.                 }  
  118.                 TEST_IMAGE = baseFile.getAbsolutePath() + "/picture.png";  
  119.             } else {  
  120.                 TEST_IMAGE = getApplication().getFilesDir().getAbsolutePath()  
  121.                         + "/picture.png";  
  122.             }  
  123.             File file = new File(TEST_IMAGE);  
  124.             // 判断图片是否存此文件夹中  
  125.             if (!file.exists()) {  
  126.                 file.createNewFile();  
  127.                 Bitmap pic = BitmapFactory.decodeResource(getResources(),  
  128.                         R.drawable.picture);  
  129.                 FileOutputStream fos = new FileOutputStream(file);  
  130.                 pic.compress(CompressFormat.JPEG, 100, fos);  
  131.                 fos.flush();  
  132.                 fos.close();  
  133.             }  
  134.         } catch (Throwable t) {  
  135.             t.printStackTrace();  
  136.             TEST_IMAGE = null;  
  137.         }  
  138.     }  
  139.   
  140.     @Override  
  141.     public void onCancel(AbstractWeibo weibo, int arg1) {  
  142.         Message msg = new Message();  
  143.         msg.arg1 = 3;  
  144.         msg.obj = weibo;  
  145.         handler.sendMessage(msg);  
  146.     }  
  147.   
  148.     @Override  
  149.     public void onComplete(AbstractWeibo arg0, int arg1,  
  150.             HashMap<String, Object> res) {  
  151.         Message msg = new Message();  
  152.         msg.arg1 = 1;  
  153.         JsonUtils ju = new JsonUtils();  
  154.         String json = ju.fromHashMap(res);  
  155.         msg.obj = ju.format(json);  
  156.         handler.sendMessage(msg);  
  157.     }  
  158.   
  159.     @Override  
  160.     public void onError(AbstractWeibo weibo, int arg1, Throwable arg2) {  
  161.         Message msg = new Message();  
  162.         msg.arg1 = 2;  
  163.         msg.obj = weibo;  
  164.         handler.sendMessage(msg);  
  165.     }  
  166.   
  167.     /** 
  168.      * 使用快捷分享完成图文分享 
  169.      *  
  170.      * @param silent 
  171.      *            是否直接分享 
  172.      */  
  173.     private void showGrid(boolean silent) {  
  174.         Intent i = new Intent(this, ShareAllGird.class);  
  175.         // 分享时Notification的图标  
  176.         i.putExtra("notif_icon", R.drawable.ic_launcher);  
  177.         // 分享时Notification的标题  
  178.         i.putExtra("notif_title"this.getString(R.string.app_name));  
  179.   
  180.         // title标题,在印象笔记、邮箱、信息、微信(包括好友和朋友圈)、人人网和QQ空间使用,否则可以不提供  
  181.         i.putExtra("title"this.getString(R.string.share));  
  182.         // titleUrl是标题的网络链接,仅在人人网和QQ空间使用,否则可以不提供  
  183.         i.putExtra("titleUrl""http://sharesdk.cn");  
  184.         // text是分享文本,所有平台都需要这个字段  
  185.         i.putExtra("text"this.getString(R.string.share_content));  
  186.         // imagePath是本地的图片路径,所有平台都支持这个字段,不提供,则表示不分享图片  
  187.         i.putExtra("imagePath", MainActivity.TEST_IMAGE);  
  188.         // url仅在微信(包括好友和朋友圈)中使用,否则可以不提供  
  189.         i.putExtra("url""http://sharesdk.cn");  
  190.         // thumbPath是缩略图的本地路径,仅在微信(包括好友和朋友圈)中使用,否则可以不提供  
  191.         i.putExtra("thumbPath", MainActivity.TEST_IMAGE);  
  192.         // appPath是待分享应用程序的本地路劲,仅在微信(包括好友和朋友圈)中使用,否则可以不提供  
  193.         i.putExtra("appPath", MainActivity.TEST_IMAGE);  
  194.         // comment是我对这条分享的评论,仅在人人网和QQ空间使用,否则可以不提供  
  195.         i.putExtra("comment"this.getString(R.string.share));  
  196.         // site是分享此内容的网站名称,仅在QQ空间使用,否则可以不提供  
  197.         i.putExtra("site"this.getString(R.string.app_name));  
  198.         // siteUrl是分享此内容的网站地址,仅在QQ空间使用,否则可以不提供  
  199.         i.putExtra("siteUrl""http://sharesdk.cn");  
  200.   
  201.         // 是否直接分享  
  202.         i.putExtra("silent", silent);  
  203.         this.startActivity(i);  
  204.     }  
  205.   
  206.     @Override  
  207.     protected void onResume() {  
  208.         super.onResume();  
  209.         AbstractWeibo.initSDK(this);  
  210.     }  
  211. }  

显示信息ShowInfoActivity:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.home.sinamicroblog;  
  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 在CODE上查看代码片 派生到我的代码片
  1. package com.home.sinamicroblog;  
  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:

[html]  view plain copy 在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:gravity="center_horizontal"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <Button  
  8.         android:id="@+id/login_btn"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:text="新浪微博授权登录" />  
  12.   
  13. </LinearLayout>  

main.xml:

[html]  view plain copy 在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 plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="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 在CODE上查看代码片 派生到我的代码片
  1. <string name="share_content">测试使用shareSDK进行分享,感觉还不错,使用方便,功能强大!</string>  
  2. <string name="share">分享</string>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值