这个拖拉两天,真是不好意思!
接 android QQ第三方登录(一) 获取登录用户名信息,这边先抱怨一下,官方API有点坑
Constants源码类下就是找不到GRAPH_SIMPLE_USER_INFO这个属性!无语!
根据官方提供返回的的JSONObject信息解析:
{
"is_yellow_year_vip": "0",
"ret": 0,
"figureurl_qq_1":
"http://q.qlogo.cn/qqapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/40",
"figureurl_qq_2":
"http://q.qlogo.cn/qqapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/100",
"nickname": "小罗",
"yellow_vip_level": "0",
"msg": "",
"figureurl_1":
"http://qzapp.qlogo.cn/qzapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/50",
"vip": "0",
"level": "0",
"figureurl_2":
"http://qzapp.qlogo.cn/qzapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/100",
"is_yellow_vip": "0",
"gender": "男",
"figureurl":
"http://qzapp.qlogo.cn/qzapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/30"
}
所以将返回的JSONObject中需要得到用户信息解析出来即可。这边头像提供的是url链接,所以需要自己联网下载,最好能进行缓存,这样的话就不用每次都下载了!
这边只做下载没有做缓存!这个作为封装好的工具类直接调用!
/** * 根据获取图片uri到网络上获取图片 * * @param imageUri * @return */ public static Bitmap getbitmap(String imageUri) { Bitmap bitmap = null; HttpURLConnection urlConnection = null; try { URL url = new URL(imageUri); urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setDoInput(true); urlConnection.connect(); InputStream is = urlConnection.getInputStream(); bitmap = BitmapFactory.decodeStream(is); is.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally {
is.close();
urlConnection.disconnect(); } return bitmap;}
接下来就是重点,这个就是获取用户的昵称和头像:
public void getUserInfo() { QQToken qqToken = mTencent.getQQToken(); UserInfo info = new UserInfo(getApplicationContext(), qqToken); info.getUserInfo(new IUiListener() { @Override public void onComplete(Object response) { JSONObject json = (JSONObject) response; // 昵称 String nickname = null; try { Message msg = new Message(); nickname = json.getString("nickname"); msg.getData().putString("nickname", nickname); msg.what = 0; mHandler.sendMessage(msg); } catch (JSONException e) { e.printStackTrace(); } //头像 String smallimgurl,bigimgurl; try { Message msg = new Message(); smallimgurl = json.getString("figureurl_qq_1"); bigimgurl=json.getString("figureurl_qq_1"); msg.getData().putString("smallimgurl", smallimgurl); msg.getData().putString("bigimgurl", bigimgurl); msg.what = 1; mHandler.sendMessage(msg); } catch (JSONException e) { e.printStackTrace(); } } @Override public void onError(UiError uiError) { Toast.makeText(LoginActivity.this, "getInfoError", Toast.LENGTH_LONG).show(); } @Override public void onCancel() { Toast.makeText(LoginActivity.this, "cancel", Toast.LENGTH_LONG).show(); } }); }
private String nickname,simagurl,bimagurl ;
private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 0) { nickname = msg.getData().getString("nickname"); } else if (msg.what == 1) { simagurl= msg.getData().getString("smallimgurl"); bimagurl= msg.getData().getString("bigimgurl"); } MainActivity.startIntent(LoginActivity.this, nickname, simagurl,bimagurl); } };
要注意的是在哪里调用这个方法,由于要获取用户信息,用户的状态必须是登录状态,调用如下:/** * 提供跳转,携带昵称与大小不同的头像URL,放在目标Activity,这是一种企业习惯,在分工中,其他就知道,你跳转携带的参数是什么 *不用过来询问你 * @param context * @param nickname * @param simgurl * @param bimgurl */ public static void startIntent(Context context, String nickname, String simgurl, String bimgurl) { Intent intent = new Intent(context, MainActivity.class); intent.putExtra("nickname", nickname); intent.putExtra("imgurl", simgurl); intent.putExtra("bimgurl", bimgurl); context.startActivity(intent); }
private void loginForQQ() { mTencent = Tencent.createInstance(APP_ID, this.getApplicationContext()); if (!mTencent.isSessionValid()) { IUiListener iUiListener = new BaseUiListener() { @Override protected void doComplete(JSONObject values) { getUserInfo();//在这里 } }; mTencent.login(this, "all", iUiListener); }else { logout(); } }之后就是跳转过去后:
/** * 开启线程根据图像url下载图像 */ class MyImgThread implements Runnable { private String imgPath; private Bitmap bitmap; public MyImgThread(String imgpath) { this.imgPath = imgpath; } @Override public void run() { bitmap = Util.getbitmap(imgPath); Message msg = new Message(); msg.obj = Util.toRoundBitmap(bitmap); msg.what = 1; mHandler.sendMessage(msg); }}
Handler mHandler = new Handler() { @TargetApi(Build.VERSION_CODES.JELLY_BEAN) @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what==1){ userbitmap= (Bitmap) msg.obj; iv_main.setBackground(drawable); } } };
MyImgThread myImgThread = new MyImgThread(imgurl); Thread thread = new Thread(myImgThread); thread.start();这样就OK了,就可以在目标UI里显示你的qq头像,昵称了,更多信息自己去试一下哈!