Android 实现QQ第三方登录

PS:补充了点东西,以前看过我写的这个请直接拉至文后

转载请加地址:http://blog.csdn.net/jing110fei/article/details/39159491

在项目中需要实现QQ第三方登录,经过一番努力算是写出来了,现在总结以下,以防以后遗忘,能帮到其他童鞋就更好了。

首先肯定是去下载SDKDEMO

http://wiki.open.qq.com/wiki/mobile/SDK下载

加个SDK方便下载的地址 http://wiki.connect.qq.com/sdk%E4%B8%8B%E8%BD%BD#androidsdk 

本文是我自己整合后的简单DEMO。

先看下效果图吧

原理:我们要使用QQ登录我们的应用,不是不用注册,是我们在后台为用户注册了,但是用户不知道,注册需要唯一标识,上图的那串字母与数字的组合就是我们要获得的唯一标识:OpenID.

跟着代码来说吧。

首先,我们要加载open_sdk.jarmta-sdk-1.00.jar这两个架包顺便看下我总共用到的类

其中,AppConstant中是用来放置APPID的,由于考虑到还可能引入其他第三方登录,为方便管理,故创建此类。Util是根据路径从网上获取图片的处理类

 

好了进入主题

首先在AndroidManifest.xml中进行两个定义如果不定义是不行的

                                                                                                        


 

然后是两个权限

    

 

接下来是布局文件,activity_main.xml登录按钮,获取头像、昵称、openid的textview


 

然后是MainActivity

public class MainActivity extends Activity implements OnClickListener {TextView openidTextView;TextView nicknameTextView;Button loginButton;ImageView userlogo;private Tencent mTencent;public static QQAuth mQQAuth;  public static String mAppid;  public static String openidString;  public static String nicknameString;  public static String TAG="MainActivity";  Bitmap bitmap = null;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //用来登录的Button        loginButton=(Button)findViewById(R.id.login);        loginButton.setOnClickListener(this);        //用来显示OpenID的textView        openidTextView=(TextView)findViewById(R.id.user_openid);        //用来显示昵称的textview        nicknameTextView=(TextView)findViewById(R.id.user_nickname);       //用来显示头像的Imageview        userlogo=(ImageView)findViewById(R.id.user_logo);            }public void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.login:LoginQQ();break;default:break;}}//这里是调用QQ登录的关键代码public void LoginQQ() {//这里的APP_ID请换成你应用申请的APP_ID,我这里使用的是DEMO中官方提供的测试APP_ID 222222mAppid = AppConstant.APP_ID;//第一个参数就是上面所说的申请的APPID,第二个是全局的Context上下文,这句话实现了调用QQ登录mTencent = Tencent.createInstance(mAppid,getApplicationContext());/**通过这句代码,SDK实现了QQ的登录,这个方法有三个参数,第一个参数是context上下文,第二个参数SCOPO 是一个String类型的字符串,表示一些权限 官方文档中的说明:应用需要获得哪些API的权限,由“,”分隔。例如:SCOPE = “get_user_info,add_t”;所有权限用“all”  第三个参数,是一个事件监听器,IUiListener接口的实例,这里用的是该接口的实现类 */mTencent.login(MainActivity.this,"all", new BaseUiListener());}/**当自定义的监听器实现IUiListener接口后,必须要实现接口的三个方法, * onComplete  onCancel onError  *分别表示第三方登录成功,取消 ,错误。*/ private class BaseUiListener implements IUiListener {public void onCancel() {// TODO Auto-generated method stub}public void onComplete(Object response) {// TODO Auto-generated method stubToast.makeText(getApplicationContext(), "登录成功", 0).show();try {//获得的数据是JSON格式的,获得你想获得的内容//如果你不知道你能获得什么,看一下下面的LOGLog.e(TAG, "-------------"+response.toString());openidString = ((JSONObject) response).getString("openid");openidTextView.setText(openidString);Log.e(TAG, "-------------"+openidString);//access_token= ((JSONObject) response).getString("access_token");//expires_in = ((JSONObject) response).getString("expires_in");} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}/**到此已经获得OpneID以及其他你想获得的内容了QQ登录成功了,我们还想获取一些QQ的基本信息,比如昵称,头像什么的,这个时候怎么办? sdk给我们提供了一个类UserInfo,这个类中封装了QQ用户的一些信息,我么可以通过这个类拿到这些信息 如何得到这个UserInfo类呢?  */QQToken qqToken = mTencent.getQQToken();UserInfo info = new UserInfo(getApplicationContext(), qqToken);//这样我们就拿到这个类了,之后的操作就跟上面的一样了,同样是解析JSON
info.getUserInfo(new IUiListener() {public void onComplete(final Object response) {// TODO Auto-generated method stubLog.e(TAG, "---------------111111");Message msg = new Message();msg.obj = response;msg.what = 0;mHandler.sendMessage(msg);Log.e(TAG, "-----111---"+response.toString());/**由于图片需要下载所以这里使用了线程,如果是想获得其他文字信息直接 * 在mHandler里进行操作 *  */new Thread(){@Overridepublic void run() {// TODO Auto-generated method stubJSONObject json = (JSONObject)response;try {bitmap = Util.getbitmap(json.getString("figureurl_qq_2"));} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}Message msg = new Message();msg.obj = bitmap;msg.what = 1;mHandler.sendMessage(msg);}}.start();}public void onCancel() {Log.e(TAG, "--------------111112");// TODO Auto-generated method stub}public void onError(UiError arg0) {// TODO Auto-generated method stubLog.e(TAG, "-111113"+":"+arg0);}});}public void onError(UiError arg0) {// TODO Auto-generated method stub}}Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {if (msg.what == 0) {JSONObject response = (JSONObject) msg.obj;if (response.has("nickname")) {try {nicknameString=response.getString("nickname");nicknameTextView.setText(nicknameString);Log.e(TAG, "--"+nicknameString);} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}else if(msg.what == 1){Bitmap bitmap = (Bitmap)msg.obj;userlogo.setImageBitmap(bitmap);}}};    }


上图是登录Q的返回LOG

上图是我们获得腾讯提供的UserInfo返回的LOG

然后是AppConstant.java

public class AppConstant {public static String APP_ID="222222";}

然后是Util.java

public class Util {public static String TAG="UTIL";public static Bitmap getbitmap(String imageUri) {Log.v(TAG, "getbitmap:" + imageUri);// 显示网络上的图片Bitmap bitmap = null;try {URL myFileUrl = new URL(imageUri);HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();conn.setDoInput(true);conn.connect();InputStream is = conn.getInputStream();bitmap = BitmapFactory.decodeStream(is);is.close();Log.v(TAG, "image download finished." + imageUri);} catch (IOException e) {e.printStackTrace();Log.v(TAG, "getbitmap bmp fail---");return null;}return bitmap;}}


 

至此全部代码就在这里了,我们获得了OpenID这个唯一标识最关键的东西,然后看项目中需要登录的接口还需要什么信息,获取到就能实现登陆了。

结束。

PS:续:这个补充是写在2015年1月14日,由于新增加功能,需要从QQ健康里直接跳到应用进行授权登录,如果之前应用已经用过另一个QQ号登录的话,会出现一些问题,比如授权页面不能再次拉起等,就又研究了下,发现QQ登录的sdk又更新了    http://wiki.open.qq.com/wiki/mobile/SDK下载 


我们看到与文章开头想要加载的架包相比又进步了很多。。。只能说我擦。。。

除了替换架包外,需要加几行简单的代码,首先第一点,在我们调用本文所说的方法获得我们想要从QQ获得的信息后,比如openid 比如昵称之后调用如下方法进行注销

mTencent.logout(this);

第二点,如果真的是和我补充说的从另QQ直接跳过来时在调用

mTencent.login(MainActivity.this,"all", new BaseUiListener());

 上述方法之前先调用setOpenId、setAccessToken,不知道说这些说清楚了吗,

总而言之,首先原本的方法是可以用的,如果只是单纯的登录,想更新SDK的换,可以给架包换了,然后加上第一点,

如果是从类似QQ健康跳到应用使用QQ号自动登录的,就更新完架包后,将第一点第二点都加上。


 

 

 

更多相关文章

  1. android mediaplayer
  2. android 4.04的应用程序启动过程及与Zygote的交互(基于静态源码分
  3. Android(安卓)端 博客园闪存——alpha版
  4. android 自动登录功能的实现
  5. Android(安卓)照相机
  6. Android(安卓)四大组件 简介
  7. Android中native进程内存泄露的调试技巧
  8. Android(安卓)JNI
  9. Android(安卓)Power Management

随机推荐

  1. android仿iphone开关
  2. 84 Android(安卓)Hnadler 封装下载图片工
  3. Get your hands on Android(安卓)Studio
  4. Security Enhancements for Android
  5. [RK3128][Android7.1]android鼠标按键板
  6. 47 Android(安卓)fragment 接口回调
  7. Android异步加载图片详解之方式二(3)
  8. Android(安卓)传感器学习(一)——指南针的
  9. android Service发送广播
  10. android Initializing a Build Environme