第三方平台授权登录— —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
阅读全文
0 0
- 第三方平台授权登录— —QQ登录
- 第三方QQ授权登录
- 第三方登录QQ完整版,授权登录
- 第三方登录——QQ登录
- PHP第三方登录—QQ登录
- 第三方登录—QQ登录
- iOS 基于第三方QQ授权登录
- 基于第三方QQ授权登录
- 基于第三方QQ授权登录
- Android第三方QQ登录无限授权
- 实现app第三方QQ授权登录
- 基于第三方QQ授权登录
- QQ第三方登录授权错误代码
- android第三方QQ登录授权
- C#QQ第三方授权登录
- Android——第三方QQ登录
- Android中的OAuth2.0——QQ第三方授权登录
- Android_第三方登录——QQ登录
- 安装centos6.5如何选择安装包
- 只有8%的人能搞定这些冲突
- Java 插入排序
- Java虚拟机:如何判定哪些对象可回收?
- [POJ
- 第三方平台授权登录— —QQ登录
- JQuery代码,实现折叠菜单的功能 案例
- Spring整合MyBatis
- 无人超市的核心不在于代替人,而是一款赚钱的互联网产品,是互联网伸向现实世界的
- 跟我一起学python第一讲 python开发环境安装
- [MFC]自绘问题记录
- 25个经典的Spring面试问答
- 欢迎使用CSDN-markdown编辑器
- 3DSlicer15:Scripted Module