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。

先看下效果图吧

Android 实现QQ第三方登录_第1张图片Android 实现QQ第三方登录_第2张图片Android 实现QQ第三方登录_第3张图片Android 实现QQ第三方登录_第4张图片Android 实现QQ第三方登录_第5张图片

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

跟着代码来说吧。

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

Android 实现QQ第三方登录_第6张图片Android 实现QQ第三方登录_第7张图片

其中,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

Android 实现QQ第三方登录_第8张图片

上图是我们获得腾讯提供的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根据Button状态(normal,focused,pressed)显示不同背景图
  2. Android 高清加载巨图方案 拒绝压缩图片
  3. Android LayoutInflater inflate方法效率
  4. Android图片加载神器之Fresco,基于各种使用场景的讲解
  5. 下载Android Sdk源码方法
  6. Android(1.5及以上版本) 开机图片/文字/动画分析
  7. Android 自定义属性时TypedArray的使用方法

随机推荐

  1. A Parcelable Tutorial for Android
  2. Android(安卓)Studio系列教程三--快捷键
  3. volley+okhttp
  4. Android开发指南(35) —— Toast Notific
  5. tabHost的tabwidget放在底部
  6. 有关Intent的android的API
  7. android 反编译操作
  8. android 模拟器 sdcard权限修改
  9. android android:duplicateParentState="
  10. Android(安卓)系统自动实现开机启动