Android QQ第三方登录详解

Android 接入QQ登录 共分为6步

本文只是对于QQ登录接入一个过程的详细描述,每一步为什么这样做没有做详细解释,但如果按照我说的每一步做下去,就能接入成功的,当成功后,回头看看代码就能完全明白(其实也很简单)。

好了接下来看步骤吧!一定会成功的

第一步获取 AppID

打开 http://open.qq.com/

点击应用接入

 

第一次需要按照说明 注册类型 ,如果是小白练手,推荐选择个人

通过步骤完成注册

在管理中心创建应用

选择创建的类型

之后将应用的基本信息填写完,其他信息可以以后发布再填,基本信息填写完后点击下方的    保存    按钮

之后  APPID就能正常使用。


第二步  下载 SDK    http://wiki.open.qq.com/wiki/mobile/SDK%E4%B8%8B%E8%BD%BD

(本文使用的是Android_SDK_V3.2.0(基础包)

第三步    接入SDK  下面我会详细讲解    参考是官网的http://wiki.open.qq.com/wiki/%E5%88%9B%E5%BB%BA%E5%B9%B6%E9%85%8D%E7%BD%AE%E5%B7%A5%E7%A8%8B

第四步  配置 AndroidManifest

1):权限声明:

 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

2):加入Activity声明(这两个Activity是在jar包已经定义的好的,需要声明才能使用)

<activity
            android:name="com.tencent.tauth.AuthActivity"
            android:launchMode="singleTask"
            android:noHistory="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:scheme="tencent自己的AppID前边的tencent不删  " />
              例如 :  <data android:scheme="tencent123123123" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.tencent.connect.common.AssistActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" >  
 	</activity>




第五步Java文件编写(下面代码全是在LoginActivity.Java)

1):监听事件添加:在xml文件中加入一个imageView用来唤起QQ登录 在Java文件中的代码如下

//QQ第三方登录
     Tencent   mTencent = Tencent.createInstance(“123123123”,getApplicationContext());//将123123123改为自己的AppID  
      ImageView  QQlogin = (ImageView) findViewById(R.id.login_image_QQlogin);
        QQlogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //get_simple_userinfo
                mTencent.login(LoginActivity.this,"all",new BaseUiListener());
            }
        });

2): 回调:在唤起QQ登录后,需要一个回调的类(这个作用是检测是否登录成功),这个类在jar包里已经写好 只要调用即可(我把这个类作为一个内部使用)


private class BaseUiListener implements IUiListener {


//这个类需要实现三个方法 onComplete():登录成功需要做的操作写在这里
// onError onCancel 方法具体内容自己搜索

        public void onComplete(Object response) {
            // TODO Auto-generated method stub
            Toast.makeText(getApplicationContext(), "登录成功", Toast.LENGTH_SHORT).show();
            try {
                //获得的数据是JSON格式的,获得你想获得的内容
                //如果你不知道你能获得什么,看一下下面的LOG
                Log.v("----TAG--", "-------------"+response.toString());
                openidString = ((JSONObject) response).getString("openid");
                mTencent.setOpenId(openidString);
                saveUser("44","text","text",1);
                mTencent.setAccessToken(((JSONObject) response).getString("access_token"),((JSONObject) response).getString("expires_in"));


                Log.v("TAG", "-------------"+openidString);
                //access_token= ((JSONObject) response).getString("access_token");        
      //expires_in = ((JSONObject) response).getString("expires_in");
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            /**到此已经获得OpneID以及其他你想获得的内容了
             QQ登录成功了,我们还想获取一些QQ的基本信息,比如昵称,头像什么的,这个时候怎么办?
             sdk给我们提供了一个类UserInfo,这个类中封装了QQ用户的一些信息,我么可以通过这个类拿到这些信息
             如何得到这个UserInfo类呢? 
获取详细信息的UserInfo ,返回的信息参看下面地址:
http://wiki.open.qq.com/wiki/%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E4%BF%A1%E6%81%AF#1._Tencent.E7.B1.BB.E7.9A.84request.E6.88.96requestAsync.E6.8E.A5.E5.8F.A3.E7.AE.80.E4.BB.8B
 */

            QQToken qqToken = mTencent.getQQToken();
            UserInfo info = new UserInfo(getApplicationContext(), qqToken);

        //    info.getUserInfo(new BaseUIListener(this,"get_simple_userinfo"));
            info.getUserInfo(new IUiListener() {
                @Override
                public void onComplete(Object o) {
                 //用户信息获取到了
                    try {
                              Log.v("用户名", ((JSONObject) o).getString("nickname"));
                              Log.v("用户姓名", ((JSONObject) o).getString("gender"));
                        Log.v("UserInfo",o.toString());
                        Intent intent1 = new Intent(LoginActivity.this,MainActivity.class);
                        startActivity(intent1);
                        finish();
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

                @Override
                public void onError(UiError uiError) {
                    Log.v("UserInfo","onError");
                }

                @Override
                public void onCancel() {
                    Log.v("UserInfo","onCancel");
                }
            });



        }

        @Override
        public void onError(UiError uiError) {
            Toast.makeText(getApplicationContext(), "onError", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onCancel() {
            Toast.makeText(getApplicationContext(), "onCancel", Toast.LENGTH_SHORT).show();
        }


    }

3):还有最重要的是在onActivityResult()方法中添加如下代码,不然调用完返回时会报错


 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        Tencent.onActivityResultData(requestCode, resultCode, data, new BaseUiListener());

        if(requestCode == Constants.REQUEST_API) {
            if(resultCode == Constants.REQUEST_LOGIN) {
                Tencent.handleResultData(data, new BaseUiListener());
            }
        }
    }


4):另外引入的包需要如下:

import com.tencent.connect.UserInfo;
import com.tencent.connect.auth.QQToken;
import com.tencent.connect.common.Constants;
import com.tencent.tauth.IUiListener;
import com.tencent.tauth.Tencent;
import com.tencent.tauth.UiError;

第六步 对于布局文件 只要有一个控件能够触发 事件就可以(setOnClickListener)
本博文 使用的是一个imageView控件 在第五步的1):监听事件的添加中有体现

下面是完整的Java demo


//这是QQ登录的详细代码直接复制粘贴时可能会使用不了,会有错误的地方
//但整体思路是这样的
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

import com.tencent.connect.UserInfo;
import com.tencent.connect.auth.QQToken;
import com.tencent.connect.common.Constants;
import com.tencent.tauth.IUiListener;
import com.tencent.tauth.Tencent;
import com.tencent.tauth.UiError;

import org.json.JSONException;
import org.json.JSONObject;

public class LoginActivity extends AppCompatActivity {
    public Button bt,zhuce;
    private EditText edit_user,edit_pass;
    private SharedPreferences sp;
    private SharedPreferences.Editor editor;
    private String username,userpass,userId;
    private Tencent mTencent;
    private Button QQ,map;

    private String openidString;
    private ImageView QQlogin;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_login);
//QQ第三方登录
        mTencent = Tencent.createInstance("123123123",getApplicationContext());//这里的“123123123”改为自己的Appid
        QQlogin = (ImageView) findViewById(R.id.login_image_QQlogin);
        QQlogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //get_simple_userinfo
                mTencent.login(LoginActivity.this,"all",new BaseUiListener());
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        Tencent.onActivityResultData(requestCode, resultCode, data, new BaseUiListener());

        if(requestCode == Constants.REQUEST_API) {
            if(resultCode == Constants.REQUEST_LOGIN) {
                Tencent.handleResultData(data, new BaseUiListener());
            }
        }

    }

    private class BaseUiListener implements IUiListener {
        public void onComplete(Object response) {
            // TODO Auto-generated method stub
            Toast.makeText(getApplicationContext(), "登录成功", Toast.LENGTH_SHORT).show();
            /*
            * 下面隐藏的是用户登录成功后 登录用户数据的获取的方法
            * 共分为两种  一种是简单的信息的获取,另一种是通过UserInfo类获取用户较为详细的信息
            *有需要看看
            * */
          /*  try {
                //获得的数据是JSON格式的,获得你想获得的内容
                //如果你不知道你能获得什么,看一下下面的LOG
                Log.v("----TAG--", "-------------"+response.toString());
                openidString = ((JSONObject) response).getString("openid");
                mTencent.setOpenId(openidString);

                mTencent.setAccessToken(((JSONObject) response).getString("access_token"),((JSONObject) response).getString("expires_in"));


                Log.v("TAG", "-------------"+openidString);
                //access_token= ((JSONObject) response).getString("access_token");              //expires_in = ((JSONObject) response).getString("expires_in");
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            *//**到此已经获得OpneID以及其他你想获得的内容了
             QQ登录成功了,我们还想获取一些QQ的基本信息,比如昵称,头像什么的,这个时候怎么办?
             sdk给我们提供了一个类UserInfo,这个类中封装了QQ用户的一些信息,我么可以通过这个类拿到这些信息
             如何得到这个UserInfo类呢?  *//*

            QQToken qqToken = mTencent.getQQToken();
            UserInfo info = new UserInfo(getApplicationContext(), qqToken);

            //    info.getUserInfo(new BaseUIListener(this,"get_simple_userinfo"));
            info.getUserInfo(new IUiListener() {
                @Override
                public void onComplete(Object o) {
                    //用户信息获取到了

                    try {

                        Toast.makeText(getApplicationContext(), ((JSONObject) o).getString("nickname")+((JSONObject) o).getString("gender"), Toast.LENGTH_SHORT).show();
                        Log.v("UserInfo",o.toString());
                        Intent intent1 = new Intent(LoginActivity.this,MainActivity.class);
                        startActivity(intent1);
                        finish();
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

                @Override
                public void onError(UiError uiError) {
                    Log.v("UserInfo","onError");
                }

                @Override
                public void onCancel() {
                    Log.v("UserInfo","onCancel");
                }
            });*/

        }

        @Override
        public void onError(UiError uiError) {
            Toast.makeText(getApplicationContext(), "onError", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onCancel() {
            Toast.makeText(getApplicationContext(), "onCancel", Toast.LENGTH_SHORT).show();
        }


    }

}


评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值