Android开发技巧之:QQ第三方登录(二)

来源:互联网 发布:php 设置脚本执行时间 编辑:程序博客网 时间:2024/06/13 01:24

接 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头像,昵称了,更多信息自己去试一下哈!
原文链接:http://blog.csdn.net/kill_bugs/article/details/47610317
 
原创粉丝点击