折腾了很久,终于找到了湖区第三方授权,然后通过授权,我们就可以发布一些自己想要的东西了。这里的代码,我也不是很懂,但是这个是一个独立的东西,大家如果实在不是很懂亦可以拿起去用。毕竟在我觉得,有很多代码,既然有现成的,就不必非要去弄得很透彻,只要懂大概思路以及逻辑就行了。
这里我会将代码贴出来:
1 2 3 package cn.android.share; 4 5 6 7 import java.io.File; 8 9 import java.io.FileOutputStream; 10 11 12 13 import cn.android.app.R; 14 15 import cn.sharesdk.framework.AbstractWeibo; 16 17 import cn.sharesdk.onekeyshare.ShareAllGird; 18 19 import android.app.Activity; 20 21 import android.content.Intent; 22 23 import android.graphics.Bitmap; 24 25 import android.graphics.Bitmap.CompressFormat; 26 27 import android.graphics.BitmapFactory; 28 29 import android.os.Bundle; 30 31 import android.os.Environment; 32 33 import android.view.View; 34 35 import android.view.View.OnClickListener; 36 37 import android.widget.Button; 38 39 40 41 /** 42 43 * @author yangyu 功能描述:主Activity类,程序的入口类 44 45 */ 46 47 public class MainActivity extends Activity implements OnClickListener { 48 49 // 定义图片存放的地址 50 51 public static String TEST_IMAGE; 52 53 54 55 // 定义"账号登陆"按钮,"有分享界面按钮","无分享界面"按钮,"得到用户资料"按钮 56 57 private Button authLoginBtn, shareGuiBtn, shareBtn; 58 59 60 61 @Override 62 63 protected void onCreate(Bundle savedInstanceState) { 64 65 super.onCreate(savedInstanceState); 66 67 setContentView(R.layout.activity_main); 68 69 70 71 // 初始化ShareSDK 72 73 AbstractWeibo.initSDK(this); 74 75 76 77 initImagePath(); 78 79 80 81 initView(); 82 83 84 85 initData(); 86 87 } 88 89 90 91 /** 92 93 * 初始化组件 94 95 */ 96 97 private void initView() { 98 99 authLoginBtn = (Button) findViewById(R.id.btnLogin); 100 101 shareGuiBtn = (Button) findViewById(R.id.btnShareAllGui); 102 103 shareBtn = (Button) findViewById(R.id.btnShareAll); 104 105 // getInfoBtn = (Button) findViewById(R.id.btnUserInfo); 106 107 } 108 109 110 111 /** 112 113 * 初始化数据 114 115 */ 116 117 private void initData() { 118 119 // 设置按钮监听事件 120 121 authLoginBtn.setOnClickListener(this); 122 123 shareGuiBtn.setOnClickListener(this); 124 125 shareBtn.setOnClickListener(this); 126 127 // getInfoBtn.setOnClickListener(this); 128 129 } 130 131 132 133 /** 134 135 * 初始化分享的图片 136 137 */ 138 139 private void initImagePath() { 140 141 try {// 判断SD卡中是否存在此文件夹 142 143 if (Environment.MEDIA_MOUNTED.equals(Environment 144 145 .getExternalStorageState()) 146 147 && Environment.getExternalStorageDirectory().exists()) { 148 149 TEST_IMAGE = Environment.getExternalStorageDirectory() 150 151 .getAbsolutePath() + "/dic.jpg"; 152 153 } else { 154 155 TEST_IMAGE = getApplication().getFilesDir().getAbsolutePath() 156 157 + "/dic.jpg"; 158 159 } 160 161 File file = new File(TEST_IMAGE); 162 163 // 判断图片是否存此文件夹中 164 165 if (!file.exists()) { 166 167 file.createNewFile(); 168 169 Bitmap pic = BitmapFactory.decodeResource(getResources(), 170 171 R.drawable.dic); 172 173 FileOutputStream fos = new FileOutputStream(file); 174 175 pic.compress(CompressFormat.JPEG, 100, fos); 176 177 fos.flush(); 178 179 fos.close(); 180 181 } 182 183 } catch (Throwable t) { 184 185 t.printStackTrace(); 186 187 TEST_IMAGE = null; 188 189 } 190 191 } 192 193 194 195 /** 196 197 * 按钮监听事件 198 199 */ 200 201 @Override 202 203 public void onClick(View v) { 204 205 switch (v.getId()) { 206 207 case R.id.btnLogin: 208 209 startActivity(new Intent(MainActivity.this, AuthActivity.class)); 210 211 break; 212 213 case R.id.btnShareAllGui: 214 215 showGrid(false); 216 217 break; 218 219 case R.id.btnShareAll: 220 221 showGrid(true); 222 223 break; 224 225 // case R.id.btnUserInfo: 226 227 // // 获取自己的资料 228 229 // Intent i = new Intent(this, GetInforActivity.class); 230 231 // startActivity(i); 232 233 // break; 234 235 default: 236 237 break; 238 239 } 240 241 242 243 } 244 245 246 247 /** 248 249 * 使用快捷分享完成图文分享 250 251 */ 252 253 private void showGrid(boolean silent) { 254 255 Intent i = new Intent(this, ShareAllGird.class); 256 257 // 分享时Notification的图标 258 259 i.putExtra("notif_icon", R.drawable.ic_launcher); 260 261 // 分享时Notification的标题 262 263 i.putExtra("notif_title", this.getString(R.string.app_name)); 264 265 266 267 // title标题,在印象笔记、邮箱、信息、微信(包括好友和朋友圈)、人人网和QQ空间使用,否则可以不提供 268 269 i.putExtra("title", this.getString(R.string.share)); 270 271 // titleUrl是标题的网络链接,仅在人人网和QQ空间使用,否则可以不提供 272 273 i.putExtra("titleUrl", "http://sharesdk.cn"); 274 275 // text是分享文本,所有平台都需要这个字段 276 277 i.putExtra("text", this.getString(R.string.share_content)); 278 279 // imagePath是本地的图片路径,所有平台都支持这个字段,不提供,则表示不分享图片 280 281 i.putExtra("imagePath", MainActivity.TEST_IMAGE); 282 283 // url仅在微信(包括好友和朋友圈)中使用,否则可以不提供 284 285 i.putExtra("url", "http://sharesdk.cn"); 286 287 // thumbPath是缩略图的本地路径,仅在微信(包括好友和朋友圈)中使用,否则可以不提供 288 289 i.putExtra("thumbPath", MainActivity.TEST_IMAGE); 290 291 // appPath是待分享应用程序的本地路劲,仅在微信(包括好友和朋友圈)中使用,否则可以不提供 292 293 i.putExtra("appPath", MainActivity.TEST_IMAGE); 294 295 // comment是我对这条分享的评论,仅在人人网和QQ空间使用,否则可以不提供 296 297 i.putExtra("comment", this.getString(R.string.share)); 298 299 // site是分享此内容的网站名称,仅在QQ空间使用,否则可以不提供 300 301 i.putExtra("site", this.getString(R.string.app_name)); 302 303 // siteUrl是分享此内容的网站地址,仅在QQ空间使用,否则可以不提供 304 305 i.putExtra("siteUrl", "http://sharesdk.cn"); 306 307 308 309 // 是否直接分享 310 311 i.putExtra("silent", silent); 312 313 this.startActivity(i); 314 315 } 316 317 318 319 /** 320 321 * 将action转换为String 322 323 */ 324 325 public static String actionToString(int action) { 326 327 switch (action) { 328 329 case AbstractWeibo.ACTION_AUTHORIZING: 330 331 return "ACTION_AUTHORIZING"; 332 333 case AbstractWeibo.ACTION_GETTING_FRIEND_LIST: 334 335 return "ACTION_GETTING_FRIEND_LIST"; 336 337 case AbstractWeibo.ACTION_FOLLOWING_USER: 338 339 return "ACTION_FOLLOWING_USER"; 340 341 case AbstractWeibo.ACTION_SENDING_DIRECT_MESSAGE: 342 343 return "ACTION_SENDING_DIRECT_MESSAGE"; 344 345 case AbstractWeibo.ACTION_TIMELINE: 346 347 return "ACTION_TIMELINE"; 348 349 case AbstractWeibo.ACTION_USER_INFOR: 350 351 return "ACTION_USER_INFOR"; 352 353 case AbstractWeibo.ACTION_SHARE: 354 355 return "ACTION_SHARE"; 356 357 default: { 358 359 return "UNKNOWN"; 360 361 } 362 363 } 364 365 } 366 367 368 369 protected void onDestroy() { 370 371 // 结束ShareSDK的统计功能并释放资源 372 373 AbstractWeibo.stopSDK(this); 374 375 super.onDestroy(); 376 377 } 378 379 }
,上面是第一个类,然后还有:
1 package cn.android.share; 2 3 4 5 import java.util.HashMap; 6 7 8 9 import cn.android.app.R; 10 11 import cn.sharesdk.framework.AbstractWeibo; 12 13 import cn.sharesdk.framework.TitleLayout; 14 15 import cn.sharesdk.framework.WeiboActionListener; 16 17 import cn.sharesdk.renren.Renren; 18 19 import cn.sharesdk.sina.weibo.SinaWeibo; 20 21 import cn.sharesdk.tencent.qzone.QZone; 22 23 import cn.sharesdk.tencent.weibo.TencentWeibo; 24 25 import android.app.Activity; 26 27 import android.os.Bundle; 28 29 import android.os.Handler; 30 31 import android.os.Handler.Callback; 32 33 import android.os.Message; 34 35 import android.view.View; 36 37 import android.view.View.OnClickListener; 38 39 import android.widget.CheckedTextView; 40 41 import android.widget.Toast; 42 43 44 45 /** 46 47 * @author yangyu 48 49 * 功能描述:授权和取消授权Activity,由于UI显示需要授权过的平台显示账户的名称, 50 51 * 因此此页面事实上展示的是“获取用户资料”和“取消授权”两个功能。 52 53 */ 54 55 public class AuthActivity extends Activity implements Callback, OnClickListener, WeiboActionListener { 56 57 //定义CheckedTextView对象 58 59 private CheckedTextView sinaCt,qzoneCt,tengxunCt,renrenCt; 60 61 62 63 //定义Handler对象 64 65 private Handler handler; 66 67 68 69 //定义标题栏对象 70 71 private TitleLayout llTitle; 72 73 74 75 @Override 76 77 protected void onCreate(Bundle savedInstanceState) { 78 79 super.onCreate(savedInstanceState); 80 81 setContentView(R.layout.activity_auth); 82 83 84 85 initView(); 86 87 88 89 initData(); 90 91 } 92 93 94 95 /** 96 97 * 初始化组件 98 99 */ 100 101 private void initView(){ 102 103 //实例化Handler对象并设置信息回调监听接口 104 105 handler = new Handler(this); 106 107 108 109 //得到标题栏对象 110 111 llTitle = (TitleLayout) findViewById(R.id.llTitle); 112 113 114 115 //得到组件对象 116 117 sinaCt = (CheckedTextView)findViewById(R.id.ctvSw); 118 119 qzoneCt = (CheckedTextView)findViewById(R.id.ctvQz); 120 121 tengxunCt = (CheckedTextView)findViewById(R.id.ctvTc); 122 123 renrenCt = (CheckedTextView)findViewById(R.id.ctvRr); 124 125 } 126 127 128 129 /** 130 131 * 初始化数据 132 133 */ 134 135 private void initData(){ 136 137 llTitle.getBtnBack().setOnClickListener(new OnClickListener() { 138 139 @Override 140 141 public void onClick(View v) { 142 143 finish(); 144 145 } 146 147 }); 148 149 llTitle.getTvTitle().setText("用户授权登录"); 150 151 152 153 //设置监听 154 155 sinaCt.setOnClickListener(this); 156 157 qzoneCt.setOnClickListener(this); 158 159 tengxunCt.setOnClickListener(this); 160 161 renrenCt.setOnClickListener(this); 162 163 164 165 //获取平台列表 166 167 AbstractWeibo[] weibos = AbstractWeibo.getWeiboList(this); 168 169 170 171 for(int i = 0;i < weibos.length;i++){ 172 173 if (!weibos[i].isValid()) { 174 175 continue; 176 177 } 178 179 180 181 CheckedTextView ctv = getView(weibos[i]); 182 183 if (ctv != null) { 184 185 ctv.setChecked(true); 186 187 // 得到授权用户的用户名称 188 189 String userName = weibos[i].getDb().get("nickname"); 190 191 if (userName == null || userName.length() <= 0 || "null".equals(userName)) { 192 193 // 如果平台已经授权却没有拿到帐号名称,则自动获取用户资料,以获取名称 194 195 userName = getWeiboName(weibos[i]); 196 197 //添加平台事件监听 198 199 weibos[i].setWeiboActionListener(this); 200 201 //显示用户资料,null表示显示自己的资料 202 203 weibos[i].showUser(null); 204 205 } 206 207 ctv.setText(userName); 208 209 } 210 211 } 212 213 } 214 215 216 217 /** 218 219 * 在CheckedTextView组件中显示授权用户的名称 220 221 */ 222 223 private CheckedTextView getView(AbstractWeibo weibo) { 224 225 if (weibo == null) { 226 227 return null; 228 229 } 230 231 232 233 String name = weibo.getName(); 234 235 if (name == null) { 236 237 return null; 238 239 } 240 241 242 243 View v = null; 244 245 if (SinaWeibo.NAME.equals(name)) { 246 247 v = findViewById(R.id.ctvSw); 248 249 } 250 251 else if (TencentWeibo.NAME.equals(name)) { 252 253 v = findViewById(R.id.ctvTc); 254 255 } 256 257 else if (Renren.NAME.equals(name)) { 258 259 v = findViewById(R.id.ctvRr); 260 261 } 262 263 else if (QZone.NAME.equals(name)) { 264 265 v = findViewById(R.id.ctvQz); 266 267 } 268 269 270 271 if (v == null) { 272 273 return null; 274 275 } 276 277 278 279 if (! (v instanceof CheckedTextView)) { 280 281 return null; 282 283 } 284 285 286 287 return (CheckedTextView) v; 288 289 } 290 291 292 293 /** 294 295 * 得到授权用户的用户名称 296 297 */ 298 299 private String getWeiboName(AbstractWeibo weibo) { 300 301 if (weibo == null) { 302 303 return null; 304 305 } 306 307 308 309 String name = weibo.getName(); 310 311 if (name == null) { 312 313 return null; 314 315 } 316 317 318 319 int res = 0; 320 321 if (SinaWeibo.NAME.equals(name)) { 322 323 res = R.string.sinaweibo; 324 325 } 326 327 else if (TencentWeibo.NAME.equals(name)) { 328 329 res = R.string.tencentweibo; 330 331 } 332 333 else if (Renren.NAME.equals(name)) { 334 335 res = R.string.renren; 336 337 } 338 339 else if (QZone.NAME.equals(name)) { 340 341 res = R.string.qzone; 342 343 } 344 345 346 347 if (res == 0) { 348 349 return name; 350 351 } 352 353 return this.getResources().getString(res); 354 355 } 356 357 358 359 /** 360 361 * 授权和取消授权的按钮点击监听事件 362 363 */ 364 365 @Override 366 367 public void onClick(View v) { 368 369 AbstractWeibo weibo = getWeibo(v.getId()); 370 371 372 373 CheckedTextView ctv = (CheckedTextView) v; 374 375 if (weibo == null) { 376 377 ctv.setChecked(false); 378 379 ctv.setText(R.string.not_yet_authorized); 380 381 return; 382 383 } 384 385 386 387 if (weibo.isValid()) { 388 389 weibo.removeAccount(); 390 391 ctv.setChecked(false); 392 393 ctv.setText(R.string.not_yet_authorized); 394 395 return; 396 397 } 398 399 400 401 weibo.setWeiboActionListener(this); 402 403 weibo.showUser(null); 404 405 } 406 407 408 409 /** 410 411 * 获得授权 412 413 */ 414 415 private AbstractWeibo getWeibo(int vid) { 416 417 String name = null; 418 419 switch (vid) { 420 421 // 进入新浪微博的授权页面 422 423 case R.id.ctvSw: 424 425 name = SinaWeibo.NAME; 426 427 break; 428 429 // 进入腾讯微博的授权页面 430 431 case R.id.ctvTc: 432 433 name = TencentWeibo.NAME; 434 435 break; 436 437 // 进入人人网的授权页面 438 439 case R.id.ctvRr: 440 441 name = Renren.NAME; 442 443 break; 444 445 // 进入QQ空间的授权页面 446 447 case R.id.ctvQz: 448 449 name = QZone.NAME; 450 451 break; 452 453 } 454 455 456 457 if (name != null) { 458 459 return AbstractWeibo.getWeibo(this, name); 460 461 } 462 463 return null; 464 465 } 466 467 468 469 /** 470 471 * 授权成功的回调 472 473 * weibo - 回调的平台 474 475 * action - 操作的类型 476 477 * res - 请求的数据通过res返回 478 479 */ 480 481 @Override 482 483 public void onComplete(AbstractWeibo weibo, int action, 484 485 HashMap<String, Object> arg2) { 486 487 Message msg = new Message(); 488 489 msg.arg1 = 1; 490 491 msg.arg2 = action; 492 493 msg.obj = weibo; 494 495 handler.sendMessage(msg); 496 497 498 499 } 500 501 /** 502 503 * 授权失败的回调 504 505 */ 506 507 @Override 508 509 public void onError(AbstractWeibo weibo, int action, Throwable t) { 510 511 t.printStackTrace(); 512 513 514 515 Message msg = new Message(); 516 517 msg.arg1 = 2; 518 519 msg.arg2 = action; 520 521 msg.obj = weibo; 522 523 handler.sendMessage(msg); 524 525 } 526 527 528 529 /** 530 531 * 取消授权的回调 532 533 */ 534 535 @Override 536 537 public void onCancel(AbstractWeibo weibo, int action) { 538 539 Message msg = new Message(); 540 541 msg.arg1 = 3; 542 543 msg.arg2 = action; 544 545 msg.obj = weibo; 546 547 handler.sendMessage(msg); 548 549 } 550 551 552 553 /** 554 555 * 处理从授权页面返回的结果 556 557 * 558 559 * 如果获取到用户的名称,则显示名称;否则如果已经授权,则显示平台名称 560 561 */ 562 563 @Override 564 565 public boolean handleMessage(Message msg) { 566 567 AbstractWeibo weibo = (AbstractWeibo) msg.obj; 568 569 String text = MainActivity.actionToString(msg.arg2); 570 571 572 573 switch (msg.arg1) { 574 575 case 1: { // 成功 576 577 text = weibo.getName() + " completed at " + text; 578 579 Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); 580 581 } 582 583 break; 584 585 case 2: { // 失败 586 587 text = weibo.getName() + " caught error at " + text; 588 589 Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); 590 591 return false; 592 593 } 594 595 case 3: { // 取消 596 597 text = weibo.getName() + " canceled at " + text; 598 599 Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); 600 601 return false; 602 603 } 604 605 } 606 607 608 609 CheckedTextView ctv = getView(weibo); 610 611 if (ctv != null) { 612 613 ctv.setChecked(true); 614 615 String userName = weibo.getDb().get("nickname"); // getAuthedUserName(); 616 617 if (userName == null || userName.length() <= 0 618 619 || "null".equals(userName)) { 620 621 userName = getWeiboName(weibo); 622 623 } 624 625 ctv.setText(userName); 626 627 } 628 629 return false; 630 631 } 632 633 634 635 }
,当然在这里我们还需要一个辅助类(解析)
1 package cn.android.share; 2 3 4 5 import java.util.ArrayList; 6 7 import java.util.HashMap; 8 9 import java.util.Iterator; 10 11 import java.util.Map.Entry; 12 13 import org.json.JSONArray; 14 15 import org.json.JSONException; 16 17 import org.json.JSONObject; 18 19 20 21 /** 22 23 * @author yangyu 24 25 * 功能描述:这是一个简易的Json-HashMap转换工具,可以将普通的json数据(字符串) 26 27 * 转换为一个HashMap<Srting, Object>表格,也可以反过来操作。此外还支 28 29 * 持将json数据格式化。 30 31 */ 32 33 public class JsonUtils { 34 35 36 37 /** 38 39 * 将指定的json数据转成 HashMap<String, Object>对象 40 41 */ 42 43 public HashMap<String, Object> fromJson(String jsonStr) { 44 45 try { 46 47 if (jsonStr.startsWith("[") 48 49 && jsonStr.endsWith("]")) { 50 51 jsonStr = "{"fakelist":" + jsonStr + "}"; 52 53 } 54 55 56 57 JSONObject json = new JSONObject(jsonStr); 58 59 return fromJson(json); 60 61 } catch (Throwable t) { 62 63 t.printStackTrace(); 64 65 } 66 67 return new HashMap<String, Object>(); 68 69 } 70 71 72 73 private HashMap<String, Object> fromJson(JSONObject json) throws JSONException { 74 75 HashMap<String, Object> map = new HashMap<String, Object>(); 76 77 @SuppressWarnings("unchecked") 78 79 Iterator<String> iKey = json.keys(); 80 81 while(iKey.hasNext()) { 82 83 String key = iKey.next(); 84 85 Object value = json.opt(key); 86 87 if (JSONObject.NULL.equals(value)) { 88 89 value = null; 90 91 } 92 93 if (value != null) { 94 95 if (value instanceof JSONObject) { 96 97 value = fromJson((JSONObject)value); 98 99 } 100 101 else if (value instanceof JSONArray) { 102 103 value = fromJson((JSONArray)value); 104 105 } 106 107 map.put(key, value); 108 109 } 110 111 } 112 113 return map; 114 115 } 116 117 118 119 private ArrayList<Object> fromJson(JSONArray array) 120 121 throws JSONException { 122 123 ArrayList<Object> list = new ArrayList<Object>(); 124 125 for (int i = 0, size = array.length(); i < size; i++) { 126 127 Object value = array.opt(i); 128 129 if (value instanceof JSONObject) { 130 131 value = fromJson((JSONObject)value); 132 133 } 134 135 else if (value instanceof JSONArray) { 136 137 value = fromJson((JSONArray)value); 138 139 } 140 141 list.add(value); 142 143 } 144 145 return list; 146 147 } 148 149 150 151 /** 152 153 * 将指定的HashMap<String, Object>对象转成json数据 154 155 */ 156 157 public String fromHashMap(HashMap<String, Object> map) { 158 159 try { 160 161 return getJSONObject(map).toString(); 162 163 } catch (Throwable t) { 164 165 t.printStackTrace(); 166 167 } 168 169 return ""; 170 171 } 172 173 174 175 @SuppressWarnings("unchecked") 176 177 private JSONObject getJSONObject(HashMap<String, Object> map) 178 179 throws JSONException { 180 181 JSONObject json = new JSONObject(); 182 183 for (Entry<String, Object> entry : map.entrySet()) { 184 185 Object value = entry.getValue(); 186 187 if (value instanceof HashMap<?, ?>) { 188 189 value = getJSONObject((HashMap<String, Object>)value); 190 191 } 192 193 else if (value instanceof ArrayList<?>) { 194 195 value = getJSONArray((ArrayList<Object>)value); 196 197 } 198 199 json.put(entry.getKey(), value); 200 201 } 202 203 return json; 204 205 } 206 207 208 209 @SuppressWarnings("unchecked") 210 211 private JSONArray getJSONArray(ArrayList<Object> list) 212 213 throws JSONException { 214 215 JSONArray array = new JSONArray(); 216 217 for (Object value : list) { 218 219 if (value instanceof HashMap<?, ?>) { 220 221 value = getJSONObject((HashMap<String, Object>)value); 222 223 } 224 225 else if (value instanceof ArrayList<?>) { 226 227 value = getJSONArray((ArrayList<Object>)value); 228 229 } 230 231 array.put(value); 232 233 } 234 235 return array; 236 237 } 238 239 240 241 /** 242 243 * 格式化一个json串 244 245 */ 246 247 public String format(String jsonStr) { 248 249 try { 250 251 return format("", fromJson(jsonStr)); 252 253 } catch (Throwable t) { 254 255 t.printStackTrace(); 256 257 } 258 259 return ""; 260 261 } 262 263 264 265 @SuppressWarnings("unchecked") 266 267 private String format(String sepStr, HashMap<String, Object> map) { 268 269 StringBuffer sb = new StringBuffer(); 270 271 sb.append("{ "); 272 273 String mySepStr = sepStr + " "; 274 275 int i = 0; 276 277 for (Entry<String, Object> entry : map.entrySet()) { 278 279 if (i > 0) { 280 281 sb.append(", "); 282 283 } 284 285 sb.append(mySepStr).append('"').append(entry.getKey()).append("":"); 286 287 Object value = entry.getValue(); 288 289 if (value instanceof HashMap<?, ?>) { 290 291 sb.append(format(mySepStr, (HashMap<String, Object>)value)); 292 293 } 294 295 else if (value instanceof ArrayList<?>) { 296 297 sb.append(format(mySepStr, (ArrayList<Object>)value)); 298 299 } 300 301 else if (value instanceof String) { 302 303 sb.append('"').append(value).append('"'); 304 305 } 306 307 else { 308 309 sb.append(value); 310 311 } 312 313 i++; 314 315 } 316 317 sb.append(' ').append(sepStr).append('}'); 318 319 return sb.toString(); 320 321 } 322 323 324 325 @SuppressWarnings("unchecked") 326 327 private String format(String sepStr, ArrayList<Object> list) { 328 329 StringBuffer sb = new StringBuffer(); 330 331 sb.append("[ "); 332 333 String mySepStr = sepStr + " "; 334 335 int i = 0; 336 337 for (Object value : list) { 338 339 if (i > 0) { 340 341 sb.append(", "); 342 343 } 344 345 sb.append(mySepStr); 346 347 if (value instanceof HashMap<?, ?>) { 348 349 sb.append(format(mySepStr, (HashMap<String, Object>)value)); 350 351 } 352 353 else if (value instanceof ArrayList<?>) { 354 355 sb.append(format(mySepStr, (ArrayList<Object>)value)); 356 357 } 358 359 else if (value instanceof String) { 360 361 sb.append('"').append(value).append('"'); 362 363 } 364 365 else { 366 367 sb.append(value); 368 369 } 370 371 i++; 372 373 } 374 375 sb.append(' ').append(sepStr).append(']'); 376 377 return sb.toString(); 378 379 } 380 381 382 383 }
。好了,可能大家也会有迷糊,但是我贴出了源文件。