1.叫老大给AppId。

2.在xml里加入权限(我这里有多余的,不过你要是负责整个App的话,这几个多出的就不用在意,你后面还是会用到的):

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission-sdk-23 android:name="android.permission.aad" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission
    android:name="android.permission.WRITE_APN_SETTINGS"
    tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

3.在application下加入:

<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="tencentXXXXXXXX" />
        <!--把XXXXXXXX换成老大给你的AppID,千万不要把前面几个字母tencent去掉-->
    </intent-filter>
</activity>
<activity
    android:name="com.tencent.connect.common.AssistActivity"
    android:configChanges="orientation|keyboardHidden"
    android:screenOrientation="behind"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />

4.看你的文档是需要什么参数登录,这里分两个情况登录,A:获取QQ返回的openid登录,B:获取用户资料登录

A:1.

String token;
String expires_in;
String uniqueCode;
//授权登录监听(最下面是返回结果)
private IUiListener loginListener = new IUiListener() {@Override
    public void onComplete(Object o) {uniqueCode = ((JSONObject) o).optString("openid"); //QQ的openid
        try {token = ((JSONObject) o).getString("access_token");
            expires_in = ((JSONObject) o).getString("expires_in");

            //在这里直接可以处理登录
        } catch (JSONException e) {e.printStackTrace();
        }}@Override
    public void onError(UiError uiError) {}@Override
    public void onCancel() {}
};

A:2.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);
    mTencent.onActivityResultData(requestCode, resultCode, data, loginListener);
    if (requestCode == Constants.REQUEST_API) {if (resultCode == Constants.REQUEST_QQ_SHARE ||resultCode == Constants.REQUEST_QZONE_SHARE ||resultCode == Constants.REQUEST_OLD_SHARE) {mTencent.handleResultData(data, loginListener);
        }}
}

A3.

@OnClick({R.id.ic_qq, R.id.ic_wechat, R.id.ic_sina})
public void onViewClicked(View view) {switch (view.getId()) {case R.id.ic_qq://QQ登录
            if (null == mTencent) {mTencent = Tencent.createInstance("老大给你的AppId,这里不用tencent,直接是那几个数字就行", this.getApplicationContext());
                if (!mTencent.isSessionValid()) {mTencent.login(this, "all", loginListener);
                }}break;
        case R.id.ic_wechat:wxLogin();//微信登录
            break;
        case R.id.ic_sina:break;
    }
}

B:1.文档:

B:2

String token;
String expires_in;
String uniqueCode;
//授权登录监听(最下面是返回结果)
private IUiListener loginListener = new IUiListener() {@Override
    public void onComplete(Object o) {//获取openid和有效期(expires_in)
        uniqueCode = ((JSONObject) o).optString("openid"); //QQ的openid
        try {token = ((JSONObject) o).getString("access_token");
            expires_in = ((JSONObject) o).getString("expires_in");
        } catch (JSONException e) {e.printStackTrace();
        }//获取QQ返回的用户信息(里面的参数直接照搬,别乱改,上面也是)
        QQToken qqtoken = mTencent.getQQToken();
        mTencent.setOpenId(uniqueCode);
        mTencent.setAccessToken(token, expires_in);
        UserInfo info = new UserInfo(getApplicationContext(), qqtoken);
        info.getUserInfo(new IUiListener() {@Override
            public void onComplete(Object o) {String nickname = ((JSONObject) o).optString("nickname");
                String sexStr = ((JSONObject) o).optString("sex");
                String headImg = ((JSONObject) o).optString("figureurl_qq_2");
                int sex = 0;
                switch (sexStr) {case "男":sex = 1;
                        break;
                }//QQ第三方登录(5个参数)
                loginByQQOpenId(nickname, sex, headImg, uniqueCode, 0);
            }@Override
            public void onError(UiError uiError) {}@Override
            public void onCancel() {}});
    }@Override
    public void onError(UiError uiError) {}@Override
    public void onCancel() {}
};

B:3

//使用QQ登录
private void loginByQQOpenId(String nick, int sex, String headImg, String uniqueCode, int userSource) {Retrofit retrofit = RetrofitManager.getInstance().getRetrofit();
    Call<User> getuser = retrofit.create(DataServer.class).getuser(nick, sex, headImg, uniqueCode, userSource);
    getuser.enqueue(new retrofit2.Callback<User>() {@Override
        public void onResponse(Call<User> call, Response<User> response) {if (response.body().getStatus() == 200) {//登录成功跳转到自己指定的Activity
                Intent it = new Intent(LoginActivity.this, StartActivity.class);
                startActivity(it);
            } else {//登录失败
                TipsUtil.toste(LoginActivity.this, response.body().getMessage());
            }}@Override
        public void onFailure(Call<User> call, Throwable t) {TipsUtil.getToast(LoginActivity.this, "网络异常");
        }});
}

B:4

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);
    mTencent.onActivityResultData(requestCode, resultCode, data, loginListener);
    if (requestCode == Constants.REQUEST_API) {if (resultCode == Constants.REQUEST_QQ_SHARE ||resultCode == Constants.REQUEST_QZONE_SHARE ||resultCode == Constants.REQUEST_OLD_SHARE) {mTencent.handleResultData(data, loginListener);
        }}
}

B:5.

@OnClick({R.id.ic_qq, R.id.ic_wechat, R.id.ic_sina})
public void onViewClicked(View view) {switch (view.getId()) {case R.id.ic_qq://QQ登录
            if (null == mTencent) {       mTencent = Tencent.createInstance("101420843", this.getApplicationContext());
                if (!mTencent.isSessionValid()) {mTencent.login(this, "all", loginListener);
                }}break;
        case R.id.ic_wechat:wxLogin();//微信登录
            break;
        case R.id.ic_sina:break;
    }
}

这样基本就完事了,如果我上面的请求方式不理解可以往下看:

1.User是文档中的返回示例:

public class User implements Serializable{/**
     * message : 请求成功
     * status : 200
     * code : 0
     * token : hpvymDJdYxvaj2cX+vM/9Q==
     * currentTime : 1524896417273
     */

    private String message;
    private int status;
    private String code;
    private String token;
    private long currentTime;

    public String getMessage() {return message;
    }public void setMessage(String message) {this.message = message;
    }public int getStatus() {return status;
    }public void setStatus(int status) {this.status = status;
    }public String getCode() {return code;
    }public void setCode(String code) {this.code = code;
    }public String getToken() {return token;
    }public void setToken(String token) {this.token = token;
    }public long getCurrentTime() {return currentTime;
    }public void setCurrentTime(long currentTime) {this.currentTime = currentTime;
    }

2.我这里是单例Retrofit:

public class RetrofitManager {//基地址
    public static final String BASE_URL = "文档中的基地址";//比如:http://103.41.185.29:8080

    //单例
    private static RetrofitManager instance;
    private Retrofit retrofit;

    private RetrofitManager() {retrofit = new Retrofit.Builder().baseUrl(BASE_URL)//网络请求的地址
                .addConverterFactory(GsonConverterFactory.create())//数据解析器
                .build();
    }public static RetrofitManager getInstance() {if (instance == null) {instance = new RetrofitManager();
        }return instance;
    }public Retrofit getRetrofit() {return retrofit;
    }}

3.公开一个方法接口:

public interface DataServer {//第三方登录-QQ
    @POST("/api/user/login_qq")@FormUrlEncoded
    Call<User> getuser(@Field("nickName") String nickName,
                       @Field("sex") int sex,
                       @Field("headImg") String headImg,
                       @Field("uniqueCode") String uniqueCode,
                       @Field("userSource") int userSource);

}

4.Retrofit和Gson的依赖:

implementation 'com.squareup.retrofit2:retrofit:2.7.1'
implementation 'com.squareup.retrofit2:converter-gson:2.6.0'

Android实现QQ第三方登录相关推荐

  1. android实现qq登录功能,Android 实现QQ第三方登录

    陆续整理一下 QQ.新浪,以及微信 登录和分享功能. 步骤: 1 下载官方sdk 2. 根据官网文档及Demo测试. 3.集成到自己应用上. 首先下载下来,导入到我们的开发工具中,看下具体工程. 所谓 ...

  2. Android使用QQ第三方登录提示需要最新版问题的解决办法

    根据客服的回答,我们需要在AndroidManifest中添加上上面的代码.

  3. android qq三方登录授权失败,QQ第三方登录无法授权错误码110401的解决方法

    原标题:QQ第三方登录无法授权错误码110401的解决方法 一些网友在注册APP的时候,会选择QQ作为第三方登录方式,但是,最近,一些网友发现:选择QQ第三方登录的时候,会出现无法授权错误码11040 ...

  4. android 第三方登录界面,Android App集成第三方登录与换肤指南

    Android App集成第三方登录与换肤指南 文档编辑 概述 本文主要是介绍了如何通过开源框架快速支持QQ和微信登录,并介绍了如何实现app快速换肤 QQ登录接入 APP要支持QQ登录,需要先到腾讯 ...

  5. 友盟社会化Android组件之第三方登录

    前段时间公司需要,逐步了新浪微博.腾讯qq.微信等授权登录验证的问题.如果要一个个申请,看文档写代码也是很多流程的.干脆用友盟社会化Android组件之第三方登录.友盟是集成了这些平台,还有其他主流的 ...

  6. QQ第三方登录的详细教程

    这次说一下我自己第一次使用QQ第三方登录的过程 1 .我们开始需要在开发者网站上注册,http://open.qq.com/ 进入这个网站后点应用接入中的应用接入(因为那个按不动),开始注册,这个注册 ...

  7. QQ第三方登录的过程

    版权声明:允许转载,只要标注转载地址即可 这次说一下我自己第一次使用QQ第三方登录的过程  1 .我们开始需要在开发者网站上注册,http://open.qq.com/  进入这个网站后点应用接入中的 ...

  8. 关于qq第三方登录一些问题!无法获取信息等等

    今天用到qq第三方登录 , 遇到一些问题 记录下来,防止忘记 SDK下载地址或者自己选择所需要的 然后导入到自己的项目 只记录一些关键代码: qqLogin.setOnClickListener(ne ...

  9. android 仿QQ动态登录背景、视频背景

    如上图类似效果图: 1, 自定义视频类 继承VideoView public class CustomVideoView extends VideoView {public CustomVideoVi ...

最新文章

  1. python-dotenv的使用
  2. python培训班排行榜-深圳python培训机构排行榜
  3. 偶然的一次渗透从弱口令->docker逃逸
  4. arcgis python实例_arcgis python脚本工具实例教程—栅格范围提取至多边形要素类
  5. Spring Cloud简介–配置(第一部分)
  6. node.js mongodb ReplSet
  7. SparkStreaming之transform
  8. Spring Cloud与微服务学习总结(5)——认证鉴权与API权限控制在微服务架构中的设计与实现(三)
  9. [转] 测试员,敢问路在何方(来自微软工程师)
  10. Got error ‘parentheses not balanced‘ from regexp
  11. 机器学习中的距离/散度/熵
  12. Dynamics CRM 2013 初体验(5):Business Rule
  13. 【信号与系统|吴大正】3:离散系统的时域分析
  14. ATM模拟演示软件之通信组件
  15. VB中关于Array函数与Split函数
  16. java 图片导出word_【freemaker实现导出word②】代码实现导出word(包括导出list数据和导出图片到word)...
  17. ARCGIS---栅格影像矢量化(含二级化/二值化、栅格清理)
  18. 火柴人生存挑战2html5游戏在线玩,火柴人生存挑战
  19. python网络爬虫从入门到实践 第5章 (一)
  20. 利用企业微信API实现天气机器人、故障报警机器人等

热门文章

  1. zkCli.sh命令使用
  2. 亲子游去哪玩?安化云台山国际马戏团观赏一场视听盛宴
  3. 升级服务器暂时不可用,抖音游戏直播服务升级中,暂不可用怎么解决?
  4. OSChina 周五乱弹 ——明明可以靠脸吃饭, 我却要努力工作
  5. Python文本分类(不涉及算法)
  6. vue2大体项目构建
  7. 小米max计算机记录,原来小米Max的大招是这个功能,小白用户一学就会
  8. java中匿名内部类实现接口_java中的匿名内部类是成员内部类吗?我就很不明白为什么造一个接口的时候匿名内部类是怎么去实现接口的...
  9. Linux服务器离线安装SVN详解
  10. 学习数据分析可以参加哪些大赛?