一,首先导入jar包

image.png

配置:

···

compile files('libs/open_sdk_r5990_lite.jar')

compile 'com.android.support:support-v4:26.0.0-alpha1'

···

在清单文件中添加以下权限,

···

···

添加activity标签

···

android:name="com.tencent.tauth.AuthActivity"

android:launchMode="singleTask"

android:noHistory="true" >

android:theme="@android:style/Theme.Translucent.NoTitleBar"

android:screenOrientation="portrait"/>

···

main.xml布局:

image.png

xml布局:

···

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="com.example.lenovo.whkl.activity.LogoActivity">

android:id="@+id/logo_1"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:layout_width="90dp"

android:layout_height="90dp"

android:background="@drawable/qq"

android:layout_alignParentTop="true"

android:layout_centerHorizontal="true"

android:layout_marginTop="161dp"

android:id="@+id/imageView2" />

android:text="qq登录"

android:textSize="30sp"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@+id/imageView2"

android:layout_centerHorizontal="true"

android:layout_marginTop="13dp" />

···

碎片中跳转到Activity:

···

package com.example.lenovo.whkl.fragment;

import android.content.Intent;

import android.os.Bundle;

import android.support.annotation.Nullable;

import android.app.Fragment;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ImageView;

import android.widget.RelativeLayout;

import android.widget.TextView;

import com.bumptech.glide.Glide;

import com.example.lenovo.whkl.R;

import com.example.lenovo.whkl.activity.LogoActivity;

/**

Created by lenovo on 2018/8/20.

*/

public class My_Fragment extends Fragment {

private TextView tx;

private ImageView img;

@Nullable

@Override

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

View view = inflater.inflate( R.layout.my_fragment, null);

RelativeLayout logo = view.findViewById(R.id.rll_logo);

tx = view.findViewById(R.id.textView);

img = view.findViewById(R.id.imageView);

logo.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

Intent intent = new Intent();

intent.setClass(getActivity(),LogoActivity.class);

startActivityForResult(intent,1);

}

});

return view ;

}

@Override

public void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode==1 && resultCode==2){

Bundle extras = data.getExtras();

tx.setText(extras.getString("nickname"));

Glide.with(getActivity()).load(extras.getString("figureurl_2")).into(img);

}

}

}

···

登录Activity:

···

package com.example.lenovo.whkl.activity;

import android.content.Intent;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.util.Log;

import android.widget.Button;

import android.widget.RelativeLayout;

import android.widget.TextView;

import android.widget.Toast;

import com.example.lenovo.whkl.R;

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;

import butterknife.ButterKnife;

import butterknife.InjectView;

import butterknife.OnClick;

public class LogoActivity extends AppCompatActivity {

private static final String TAG = "LogoActivity";

private static final String APP_ID = "1107401709";//官方获取的APPID

private Tencent mTencent;

private BaseUiListener mIUiListener;

private UserInfo mUserInfo;

String data="";

@InjectView(R.id.logo_1)

RelativeLayout logo1;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_logo);

ButterKnife.inject(this);

//传入参数APPID和全局Context上下文

mTencent = Tencent.createInstance(APP_ID,LogoActivity.this.getApplicationContext());

}

@OnClick(R.id.logo_1)

public void onViewClicked() {

/**通过这句代码,SDK实现了QQ的登录,这个方法有三个参数,第一个参数是context上下文,第二个参数SCOPO 是一个String类型的字符串,表示一些权限

官方文档中的说明:应用需要获得哪些API的权限,由“,”分隔。例如:SCOPE = “get_user_info,add_t”;所有权限用“all”

第三个参数,是一个事件监听器,IUiListener接口的实例,这里用的是该接口的实现类 */

mIUiListener = new BaseUiListener();

//all表示获取所有权限

Toast.makeText(this, "正在登录,请稍等。。。", Toast.LENGTH_SHORT).show();

mTencent.login(LogoActivity.this,"all", mIUiListener);

}

private class BaseUiListener implements IUiListener {

@Override

public void onComplete(Object response) {

Toast.makeText(LogoActivity.this, "授权成功", Toast.LENGTH_SHORT).show();

Log.e(TAG, "response:" + response);

data+="response:\n"+response;

JSONObject obj = (JSONObject) response;

try {

String openID = obj.getString("openid");

String accessToken = obj.getString("access_token");

String expires = obj.getString("expires_in");

mTencent.setOpenId(openID);

mTencent.setAccessToken(accessToken,expires);

QQToken qqToken = mTencent.getQQToken();

mUserInfo = new UserInfo(LogoActivity.this,qqToken);

mUserInfo.getUserInfo(new IUiListener() {

@Override

public void onComplete(Object response) {

Log.e(TAG,"登录成功"+response.toString());

data += "\nresponse:\n"+response;

try {

JSONObject jsonObject = new JSONObject(response.toString());

String nickname = jsonObject.getString("nickname");

String figureurl = jsonObject.getString("figureurl_2");

Intent intent = getIntent();

intent.putExtra("nickname",nickname);

intent.putExtra("figureurl_2",figureurl);

setResult(2,intent);

finish();

} catch (Exception e) {

e.printStackTrace();

}

}

@Override

public void onError(UiError uiError) {

Log.e(TAG,"登录失败"+uiError.toString());

}

@Override

public void onCancel() {

Log.e(TAG,"登录取消");

}

});

} catch (JSONException e) {

e.printStackTrace();

}

}

@Override

public void onError(UiError uiError) {

Toast.makeText(LogoActivity.this, "授权失败", Toast.LENGTH_SHORT).show();

}

@Override

public void onCancel() {

Toast.makeText(LogoActivity.this, "授权取消", Toast.LENGTH_SHORT).show();

}

}

/**

* 在调用Login的Activity或者Fragment中重写onActivityResult方法

* @param requestCode

* @param resultCode

* @param data

*/

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if(requestCode == Constants.REQUEST_LOGIN){

Tencent.onActivityResultData(requestCode,resultCode,data,mIUiListener);

}

super.onActivityResult(requestCode, resultCode, data);

if (null != mTencent){

mTencent.onActivityResultData(requestCode,resultCode,data,mIUiListener);

}

}

}

···

ThreadMessage:

···

package com.example.lenovo.whkl.utils;

import android.os.AsyncTask;

import android.os.Build;

import android.os.Handler;

import android.os.HandlerThread;

import android.os.Looper;

import java.lang.reflect.Field;

import java.util.concurrent.Executor;

import java.util.concurrent.LinkedBlockingQueue;

import java.util.concurrent.RejectedExecutionException;

import java.util.concurrent.ThreadPoolExecutor;

import java.util.concurrent.TimeUnit;

public final class ThreadManager {

// UI线程

private static Handler mManinHandler;

private static Object mMainHandlerLock = new Object();

// 本地改就行..不要传svn

public static final boolean DEBUG_THREAD = false;

/**

* AsyncTask的默认线程池Executor. 负责长时间的任务(网络访问) 默认3个线程

*/

public static final Executor NETWORK_EXECUTOR;

/**

* 副线程的Handle, 只有一个线程 可以执行比较快但不能在ui线程执行的操作. 文件读写不建议在此线程执行,

* 请使用FILE_THREAD_HANDLER 此线程禁止进行网络操作.如果需要进行网络操作. 请使用NETWORK_EXECUTOR

*/

private static Handler SUB_THREAD_HANDLER;

private static HandlerThread SUB_THREAD;

/**

* 文件读写线程的Handle, 只有一个线程 可以执行文件读写操作, 如图片解码等 此线程禁止进行网络操作.如果需要进行网络操作.

* 请使用NETWORK_EXECUTOR

*/

private static Handler FILE_THREAD_HANDLER;

/**

* 文件读写用的线程

*/

private static HandlerThread FILE_THREAD;

static {

NETWORK_EXECUTOR = initNetworkExecutor();

}

private static Executor initNetworkExecutor() {

Executor result = null;

// 3.0以上

if (Build.VERSION.SDK_INT >= 11) {

//result = AsyncTask.THREAD_POOL_EXECUTOR;

result = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS,

new LinkedBlockingQueue());

}

// 3.0以下, 反射获取

else {

Executor tmp = null;

try {

Field field = AsyncTask.class.getDeclaredField("sExecutor");

field.setAccessible(true);

tmp = (Executor) field.get(null);

} catch (Exception e) {

tmp = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS,

new LinkedBlockingQueue());

}

result = tmp;

}

if (result instanceof ThreadPoolExecutor) {

// core size减少为3个

((ThreadPoolExecutor) result).setCorePoolSize(3);

}

return result;

}

public static void init() {

}

/**

* 取得UI线程Handler

*

* @return

*/

public static Handler getMainHandler() {

if (mManinHandler == null) {

synchronized (mMainHandlerLock) {

if (mManinHandler == null) {

mManinHandler = new Handler(Looper.getMainLooper());

}

}

}

return mManinHandler;

}

/**

* 在网络线程上执行异步操作. 该线程池负责网络请求等操作 长时间的执行(如网络请求使用此方法执行) 当然也可以执行其他 线程和AsyncTask公用

*

* @param run

*/

public static void executeOnNetWorkThread(Runnable run) {

try {

NETWORK_EXECUTOR.execute(run);

} catch (RejectedExecutionException e) {

}

}

/**

* 获得文件线程的Handler.

* 副线程可以执行本地文件读写等比较快但不能在ui线程执行的操作.

* 此线程禁止进行网络操作.如果需要进行网络操作. 请使用NETWORK_EXECUTOR

*

* @return handler

*/

public static Handler getFileThreadHandler() {

if (FILE_THREAD_HANDLER == null) {

synchronized (ThreadManager.class) {

FILE_THREAD = new HandlerThread("QQ_FILE_RW");

FILE_THREAD.start();

FILE_THREAD_HANDLER = new Handler(FILE_THREAD.getLooper());

}

}

return FILE_THREAD_HANDLER;

}

public static Looper getFileThreadLooper() {

return getFileThreadHandler().getLooper();

}

public static Thread getSubThread() {

if (SUB_THREAD == null) {

getSubThreadHandler();

}

return SUB_THREAD;

}

/**

* 获得副线程的Handler.

* 副线程可以执行比较快但不能在ui线程执行的操作.

* 另外, 文件读写建议放到FileThread中执行 此线程禁止进行网络操作.如果需要进行网络操作.

* 请使用NETWORK_EXECUTOR

*

* @return handler

*/

public static Handler getSubThreadHandler() {

if (SUB_THREAD_HANDLER == null) {

synchronized (ThreadManager.class) {

SUB_THREAD = new HandlerThread("QQ_SUB");

SUB_THREAD.start();

SUB_THREAD_HANDLER = new Handler(SUB_THREAD.getLooper());

}

}

return SUB_THREAD_HANDLER;

}

public static Looper getSubThreadLooper() {

return getSubThreadHandler().getLooper();

}

/**

* 在副线程执行.

* 可以执行本地文件读写等比较快但不能在ui线程执行的操作.

* 此线程禁止进行网络操作.如果需要进行网络操作. 请使用NETWORK_EXECUTOR

*

* @return

*/

public static void executeOnSubThread(Runnable run) {

getSubThreadHandler().post(run);

}

}

···

android qq 登陆 简书,使用QQ第三方登录相关推荐

  1. WPF系列教程——(一)仿TIM QQ界面 - 简书

    WPF系列教程--(一)仿TIM QQ界面 - 简书 原文: WPF系列教程--(一)仿TIM QQ界面 - 简书 TIM QQ 我们先来看一下TIM QQ长什么样,整体可以将界面分为三个部分 TIM ...

  2. Android实现沉浸式状态栏(透明状态栏)(QQ和简书样式)

    本文内容大多参考网络上的Android实现沉浸式状态栏教程,由于看了太多类似文章,固在此不再一一列举出处.本文仅为我自己梳理思路和供各位看到本文的朋友参考(百度:Android沉浸式状态栏,第一页内容 ...

  3. html手机qq登陆验证码,为什么qq登陆需要验证码?qq登陆需要验证码怎么取消?...

    为什么qq登陆需要验证码?qq登陆需要验证码怎么取消?很多用户在登陆qq时,总是需要输入验证码,一些用户表示很烦,那么大家知道为什么qq登陆需要验证码吗?如果不想每次登陆qq都需要验证码该如何取消呢? ...

  4. android 仿简书评论,Android 开发仿简书登录框可删除内容或显示密码框的内容

    简书App 是我很喜欢的一款软件.今天就模仿了一下他的登录框.先上图: 好了下面上代码,自定义ImgEditText 继承与EditText.重写一些方法. package lyf.myimgedit ...

  5. Android点击按钮显示密码,Android 开发仿简书登录框可删除内容或显示密码框的内容...

    简书App 是我很喜欢的一款软件.今天就模仿了一下他的登录框.先上图: 好了下面上代码,自定义ImgEditText 继承与EditText.重写一些方法. package lyf.myimgedit ...

  6. php qq登陆网站实例代码,QQ登陆网站实例代码

    现在这种第三方登录的应用很广泛也很方便.省得用户进行注册了.现在把QQ登录的方法和步骤记录一下,以备使用时方便. 第一步,到http://connect.qq.com/intro/login/这里去申 ...

  7. 怎样查询计算机登录记录,qq登陆记录,教您QQ如何查看登录历史记录

    qq是我们经常会使用到的一款聊天工具,很多用户都会使用到它.不过,最近一些朋友反馈自己想要在电脑中查看qq登录记录,可是操作了很久都没有成功.当我们的QQ出现异常登陆的时候我们往往会想要查询一下登陆记 ...

  8. java版本qq登陆界面_java实现QQ登陆界面

    以下是效果截图: 素材: 以下是源代码: import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.Mous ...

  9. 高仿简书Android,高仿简书个人中心页面

    高仿简书个人中心页面 Demo下载地址: 先贴上效果图 1. 步骤 1.1 把APP的主题改为NoAction 1.2 引入Material Design 包 implementation 'com. ...

最新文章

  1. 如何通过 Vue+Webpack 来做通用的前端组件化架构设计
  2. 翻译:创建 Windows8 应用 Part I: Hello, world!
  3. git获取管理员权限 windows_win10不兼容git2.7.3+版本
  4. mysql 存取字符集_MySQL字符集设置—MySQL数据库乱码问题详解
  5. andriod studio 运行 无结果_无负压静音供水设备下篇一
  6. php数组排序综合例子,php数组实例之数组排序
  7. ubantu中rpm转换成deb(软件包格式)
  8. 离散时间信号常见函数的实现(matlab)
  9. C64x的软件优化方法
  10. 测试时报错: Command line is too long. Shorten command line for RedisTest.test0
  11. 哇!家居环境居然能“可视化”?这守护真的牛
  12. 如何防止木马性图片上传
  13. excel 设置双坐标轴柱状图
  14. 计算机修改人类记忆曲线,艾宾浩斯遗忘曲线和费曼技巧
  15. FCPX插件:15种棱镜折射图文展示介绍动画效果 Prism Slideshow
  16. 关于Google账号被封、被下架、提审被拒等原因分析及建议
  17. python实现http请求并发_Python复习笔记(十)Http协议--Web服务器-并发服务器
  18. 高德地图JavaScript根据后台坐标点绘制轨迹
  19. 运营商客户流失率分析
  20. Freely Available Standards

热门文章

  1. reportInterruptAfterWait
  2. 怎样用注解的方式配置Spring?
  3. https安全传输协议
  4. 函数式接口作为方法的返回值
  5. flume案例-flume级联-配置文件编写
  6. GraphQL入门之graphql-java项目的介绍
  7. Zookeeper_简介
  8. 设计模式之_Iterator_06
  9. oracle解除死锁
  10. Spring Boot Transaction 源码解析(二)