第三方平台授权登录— —QQ登录

来源:互联网 发布:ait8328 编程 编辑:程序博客网 时间:2024/05/01 05:15

第三方平台授权登录— —QQ登录
本来前两天开开心心!心情乐乐!居然因为自己没有仔细看代码、居然被埋在这里两天!呜呜!怒火中烧!不行,我要去消灭 五碗大米饭 来平复我的心情!

《程序运行图》http://img.blog.csdn.net/20170806230440067?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzE3Mzg3MzE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

(一)首先在腾讯开发者平台:http://open.qq.com/
创建应用,每个应用获得的APP ID不同。不可重复。
下载导入QQ开发包:http://pan.baidu.com/s/1kV1J1Gz
API开发文档:
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.xml中添加权限

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

application节点添加两个Activity注册声明

<activityandroid:name="com.tencent.tauth.AuthActivity" android:noHistory="true" android:launchMode="singleTask" ><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" /></intent-filter></activity><activity android:name="com.tencent.connect.common.AssistActivity"android:theme="@android:style/Theme.Translucent.NoTitleBar"android:configChanges="orientation|keyboardHidden|screenSize" />

(三)开始代码

    //QQ授权类    private Tencent tencent;   //Tencent是SDK的入口,首先要创建Tencent的实例    private UserInfo userInfo; //UserInfo是登录完成后,用来获取用户信息的类    private IUiListener loginListener;  //用户登录成功后,来进行回调的    private IUiListener userInfoListener;  //获取用户信息后,回调的

onCreate() 方法中创建 initQQLongin()方法,用来初始化各种QQ授权信息

    private void initQQLongin() {        //《第一部分,初始化两个实例》        //创建Tencent实例,参数两个一个是APP_ID,类型为String,另一个是全局的context        tencent = Tencent.createInstance("1106325890", this.getApplicationContext());        //创建用户信息类实例,参数两个一个是全局的context,另一个是固定的tentcent.getQQToken()        userInfo = new UserInfo(MainActivity.this, tencent.getQQToken());        //《第二部分,初始化登录回调监听器》        //初始化登录回调        loginListener = new IUiListener() {            @Override            //QQ登录成功会调用onComplete()方法            public void onComplete(Object o) {                //转换为JSONObject格式对象                JSONObject object = (JSONObject)o;                Log.d(TAG, "QQ登录成功信息:" + object);                if(object == null){                    Log.d(TAG, "QQ登录信息为空!");                    return ;                }                //想获取用户信息,首先需要获取openid、access_token、expires_in三个参数的值、并且重新赋值                try {                    String openId = object.getString("openid");                    String access_token =  object.getString("access_token");                    String expires_in = object.getString("expires_in");                    tencent.setOpenId(openId);                    tencent.setAccessToken(access_token, expires_in);                    //重新赋值三个参数,就可以开始获取用户信息了                    userInfo.getUserInfo(userInfoListener);                } catch (JSONException e) {                    e.printStackTrace();                }            }            @Override            public void onError(UiError uiError) {                Log.d(TAG, "QQ登录失败:" + uiError);            }            @Override            public void onCancel() {                Log.d(TAG, "取消QQ登录!");            }        };         //《第三部分,初始化获取信息回调监听器》        //初始化获取用户信息回调        userInfoListener = new IUiListener() {            @Override            public void onComplete(Object o) {                JSONObject Object = (JSONObject) o;                Log.d(TAG, "QQ用户信息:" + Object);                //获取昵称和头像,对应的键是nickname、figureurl_qq_2                try {                    String name = (String) Object.get("nickname");                    String figureurl_qq_2 = (String) Object.get("figureurl_qq_2");                    Log.i(TAG, "QQ昵称:============: " + name);                    Log.i(TAG, "QQ头像:============: " + figureurl_qq_2);                    qq_name.setText(name);                    //figureurl_qq_2只是图片的url地址而已,想要获取图片,要用到网络请求                    //创建获取QQ头像方法getQQimage(),详细见《第四部分》                    getQQimage(figureurl_qq_2);                } catch (JSONException e) {                    e.printStackTrace();                } catch (IOException e) {                    e.printStackTrace();                }            }            @Override            public void onError(UiError uiError) {            }            @Override            public void onCancel() {            }        };    }
    //《第四部分,获取QQ头像》    //会用到开源库Okhttp请求,需要在build.gradle导入开源库:    compile 'com.squareup.okhttp3:okhttp:3.4.1'    private void getQQimage(final String figureurl_qq_2) throws IOException {        //建立OkHttpClient实例        final OkHttpClient client = new OkHttpClient();        //建立Request对象        final Request request = new Request.Builder()                .url(figureurl_qq_2)                .build();        //由于网络请求不能再在主线程跑,即Okhttp 不然会报 NetworkOnMainThreadException异常,        // 所以采用在子线程中请求,采用 new Thread(new Runnable()        // 再将获取的QQ头像弄到主线程中更新,即异步处理机制 即hangler机制        new Thread(new Runnable() {            public void run() {                try {                    Response response = client.newCall(request).execute();                    //                    InputStream inputstream = response.body().byteStream();                    //调用BitmapFactory.decodeStream()方法,从输入流中解析出Bitmap对象                    Bitmap bmp = BitmapFactory.decodeStream(inputstream);                    inputstream.close();                    //hangler机制,用于从子线程切换到主线程更新UI,即获取QQ头像                    Message message = new Message();                    message.what = 1;                    message.obj = bmp;                    handle.sendMessage(message);                } catch (IOException e) {                    e.printStackTrace();                }            }        }).start();    }    //主线程中更新QQ头像    private Handler handle = new Handler(){        @Override        public void handleMessage(Message msg) {            qq_image.setImageBitmap((Bitmap) msg.obj);        }    };

在Activity中重写 onActivityResult()方法,加入一条tentcent语句

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        //多一个参数,即登录回调loginListener        Tencent.onActivityResultData(requestCode,resultCode,data,loginListener);    }

最后点击事件中开始登录

    @Override    public void onClick(View view) {          switch (view.getId()){              case R.id.qq_login:                  if(!tencent.isSessionValid()){                      //三个参数,全局context、all为所有权限固定、登录回调监听器                      tencent.login(MainActivity.this, "all",loginListener);                  }                  break;              default:                  break;          }    }
《小提示》全文中最重要的两句代码:QQ登录代码,位于点击事件tencent.login(MainActivity.this, "all",loginListener);QQ信息获取代码,位于loginListener监听最后userInfo.getUserInfo(userInfoListener);权限加上这一句,可以减少一条警告、加不加都能正常运行。<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

源码地址:http://pan.baidu.com/s/1eRWLReq

原创粉丝点击