技术标签: Android
1.首先,当然是在腾讯开放平台(http://open.qq.com/)注册成为开发者,然后获取APP ID
2.把open-sdk.jar拷贝到libs(或lib)目录下
(下载地址:http://wiki.open.qq.com/wiki/mobile/SDK%E4%B8%8B%E8%BD%BD)
3.配置AndroidManifest
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 从QQ登录中copy的代码-->
<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="tencent1105546048" />
</intent-filter>
</activity>
<activity android:name="com.tencent.connect.common.AssistActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
------------------------------------------------------------------------
4.创建实例
声明
// QQ登录相关
private static final String QQAPPID = "1106263164";
private Tencent mTencent;
private IUiListener loginListener;
private IUiListener userInfoListener;
private String scope;
private UserInfo userInfo;
ImageView img_login_qq;
初始化
// QQ登录相关
mTencent = Tencent.createInstance(QQAPPID, LoginActivity.this);
scope = "all";
initLoginListener();
initUserInfoListener();
img_login_qq= (ImageView) findViewById(R.id.img_login_qq);
img_login_qq.setOnClickListener(this);
其余见代码
/*
qq登录开始
*/
private void qqLogin() {
if (!mTencent.isSessionValid()) {
mTencent.login(LoginActivity.this, scope, loginListener);
}
}
private void initLoginListener() {
loginListener = new IUiListener() {
/**
* {"ret":0,"pay_token":"D3D678728DC580FBCDE15722B72E7365",
* "pf":"desktop_m_qq-10000144-android-2002-",
* "query_authority_cost":448,
* "authority_cost":-136792089,
* "openid":"015A22DED93BD15E0E6B0DDB3E59DE2D",
* "expires_in":7776000,
* "pfkey":"6068ea1c4a716d4141bca0ddb3df1bb9",
* "msg":"",
* "access_token":"A2455F491478233529D0106D2CE6EB45",
* "login_cost":499}
*/
@Override
public void onComplete(Object value) {
// TODO Auto-generated method stub
if(value==null){
Toast.makeText(getApplicationContext(),"返回结果为空",Toast.LENGTH_LONG).show();
return;
}
System.out.println("有数据返回..");
try {
JSONObject jo = (JSONObject) value;
if(null!=jo&&jo.length()==0){
Toast.makeText(getApplicationContext(),"返回结果为空",Toast.LENGTH_LONG).show();
}
//处理结果
System.out.println(jo.toString());
String msg = jo.getString("msg");
int ret = jo.getInt("ret");
System.out.println("json=" + String.valueOf(jo));
System.out.println("json=" + String.valueOf(jo));
System.out.println("msg="+msg);
if (ret == 0) {
String openID = jo.getString("openid");
String accessToken = jo.getString("access_token");
String expires = jo.getString("expires_in");
//下面两个方法非常重要,否则会出现client request's parameters are invalid, invalid openid
mTencent.setOpenId(openID);
mTencent.setAccessToken(accessToken, expires);
System.out.println("开始获取用户信息");
if(mTencent.getQQToken() == null){
System.out.println("qqtoken ====================== null");
}
userInfo = new UserInfo(LoginActivity.this, mTencent.getQQToken());
userInfo.getUserInfo(userInfoListener);
}
// if (ret == 0) {
// Toast.makeText(MainActivity.this, "登录成功",
// Toast.LENGTH_LONG).show();
//
// String openID = jo.getString("openid");
// String accessToken = jo.getString("access_token");
// String expires = jo.getString("expires_in");
// mTencent.setOpenId(openID);
// mTencent.setAccessToken(accessToken, expires);
// }
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void onError(UiError uiError) {
Toast.makeText(getApplicationContext(),"登录错误",Toast.LENGTH_LONG).show();
}
@Override
public void onCancel() {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(),"登录取消",Toast.LENGTH_LONG).show();
}
};
}
private void initUserInfoListener() {
userInfoListener = new IUiListener() {
@Override
public void onError(UiError arg0) {
// TODO Auto-generated method stub
System.out.print(arg0.toString());
}
@Override
public void onCancel() {
// TODO Auto-generated method stub
System.out.print("cancel");
}
/**
* {"is_yellow_year_vip":"0","ret":0,
* "figureurl_qq_1":"http:\/\/q.qlogo.cn\/qqapp\/1104732758\/015A22DED93BD15E0E6B0DDB3E59DE2D\/40",
* "figureurl_qq_2":"http:\/\/q.qlogo.cn\/qqapp\/1104732758\/015A22DED93BD15E0E6B0DDB3E59DE2D\/100",
* "nickname":"攀爬←蜗牛","yellow_vip_level":"0","is_lost":0,"msg":"",
* "city":"黄冈","
* figureurl_1":"http:\/\/qzapp.qlogo.cn\/qzapp\/1104732758\/015A22DED93BD15E0E6B0DDB3E59DE2D\/50",
* "vip":"0","level":"0",
* "figureurl_2":"http:\/\/qzapp.qlogo.cn\/qzapp\/1104732758\/015A22DED93BD15E0E6B0DDB3E59DE2D\/100",
* "province":"湖北",
* "is_yellow_vip":"0","gender":"男",
* "figureurl":"http:\/\/qzapp.qlogo.cn\/qzapp\/1104732758\/015A22DED93BD15E0E6B0DDB3E59DE2D\/30"}
*/
@Override
public void onComplete(Object arg0) {
// TODO Auto-generated method stub
if(arg0 == null){
System.out.println("agr0=1234567null");
return;
}
try {
JSONObject jo = (JSONObject) arg0;
int ret = jo.getInt("ret");
System.out.println("json======" + String.valueOf(jo));
// String nickName=jo.getString("nickname");
// String gender=jo.getString("gender");
// System.out.println("nickname"+nickName);
// Toast.makeText(MainActivity.this, "你好," + nickName,
// Toast.LENGTH_LONG).show();
if(ret == 100030){
//权限不够,需要增量授权
Runnable r = new Runnable() {
public void run() {
mTencent.reAuth(LoginActivity.this, "all", new IUiListener() {
@Override
public void onError(UiError arg0) {
// TODO Auto-generated method stub
}
@Override
public void onComplete(Object arg0) {
// TODO Auto-generated method stub
}
@Override
public void onCancel() {
// TODO Auto-generated method stub
}
});
}
};
LoginActivity.this.runOnUiThread(r);
}else{
username = jo.getString("nickname");
// sex = jo.getString("gender");
if(isUsernameExists())
{
}
else {
new Thread(new Runnable() {
@Override
public void run() {
// connectToRegister();
}
}).start();
}
Intent intent=new Intent(LoginActivity.this, MainActivity.class);
Toast.makeText(LoginActivity.this,username+",欢迎你", Toast.LENGTH_LONG).show();
Intent intent_service=new Intent(LoginActivity.this, SaveUsersService.class);
startActivity(intent);
finish();
// Toast.makeText(LoginActivity.this, "你好," + username, Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
// TODO: handle exception
}
}
};
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//由于在一些低端机器上,因为内存原因,无法返回到回调onComplete里面,是以onActivityResult的方式返回
if(requestCode==11101&&resultCode==RESULT_OK){
//处理返回的数据/
if(data==null){
Toast.makeText(getApplicationContext(),"返回数据为空",Toast.LENGTH_LONG);
}else{
Tencent.handleResultData(data,loginListener);
}
}
super.onActivityResult(requestCode, resultCode, data);
}
private String getUserId(String username) {
String id = null;
//打开或创建test.db数据库
SQLiteDatabase db = openOrCreateDatabase("qingning.db", Context.MODE_PRIVATE, null);
//打开或创建test.db数据库
// SQLiteDatabase db = openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null);
Cursor c = db.rawQuery("select * from users where username=?",new String[]{username});
System.out.println("username"+c.getCount());
c.moveToFirst();
for(int j=0;j<c.getCount();j++)
{ c.moveToPosition(j);
id=c.getString(c.getColumnIndex("id"));
System.out.println("id:"+id);
}
db.close();
return id;
}
private boolean isUsernameExists(){
//打开或创建test.db数据库
SQLiteDatabase db = openOrCreateDatabase("qingning.db", Context.MODE_PRIVATE, null);
Cursor c = db.rawQuery("select * from users where username=?",new String[]{username});
if(c.getCount()==1){
db.close();
return true;
}
else{
System.out.println("false:cccc");
System.out.println("username"+c.getCount());
}
return false;
}
/*
qq登录结束
*/
/ 今日科技快讯 /去哪儿数据显示,最近几天,机票瞬时搜索量增长7倍,热门目的地为三亚、成都、广州、上海、重庆、哈尔滨、长春,出发时间是春运期间的机票搜索量达疫情前水平。火车票搜索量增长5倍,热门目的地TOP5分别为成都、长沙、郑州、武汉和重庆。/ 作者简介 /本篇文章转自TechMerger的博客,文章主要分享了Android模块化中资源冲突的相关场景以及影响,相信会对大家有所帮...
PHP Warning: mysqli_connect(): The server requested authentication method unknown to the client [caching_sha2_password] in /usr/local/php/CreateDB.php on line 5mysql 安装了最新版本8.0.11后创建用户并授权后,授权的用户连接数据库提示The server requested authentication method unknown _1671465600
01 前言最近疫苗事情非常火热,这件事情让我对刘强东有点刮目相看,我们需要更多的人关注曝光此类问题 02 正文Android Kernel 会定时执行一次检查,杀死一些进程,释放掉内存。Low memory killer 是定时进行检查。Low memory killer 主要是通过进程的oom_adj 来判定进程的重要程度。这个值越小,程序越重要,被杀的可能...
虚拟机安装系统:Ubuntu18.04编辑虚拟机设置选项——共享文件夹——勾选总是启用——添加选择路径(在Windows上选择要共享的文件夹)名称(在虚拟机里显示的名字)然后下一步就好了点击确定——开启虚拟机。
这两天在试用hibernate,整合入springboot是没问题了,但是具体使用就有问题,大部分应该都是下面两个问题1、required a bean of type 'org.hibernate.SessionFactory' that could not be found.2、InvalidDataAccessApiUsageException 和 Write operations ...
如果在两个不同的package中使用同样的自定义数据类型?这里主要针对包括在C头文件中结构体类型,如果只是在不同的go package中自定义数据类型,这个很好处理。但实际上处理的核心是一样的,下面通过两个例子来说明解决办法。测试例程目录├── include│ └── data.h└── src ├── common │ └── common.go └── ma
外部经常因防火墙问题无法访问Linux中的端口,就需要放通IP或彻底关闭防火墙查看防火状态systemctl status firewalldservice iptables status暂时关闭防火墙systemctl stop firewalldservice iptables stop永久关闭防火墙systemctl disable firewalldchkconfig iptables off重启防火墙systemctl enable firewalldservic
SpringMvc简单介绍下你对springMVC的理解?Spring MVC Framework有这样一些特点:它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是java组件.并且和Spring提供的其他基础结构紧密集成.不依赖于Servlet API(目标虽是如此,但是在实现的时候确实是依赖于Servlet的)可以任意使用各种视
回顾:1. mybatis的性能优化. 一级缓存. 减轻数据库的压力. 默认开启. 一级缓存是线程级别,sqlSession,缓存数据的map就放在sqlSession中的PerpetualCache的中. 一级缓存是通过SimpleExecutor去执行. 在去数据库查询之前,先去一级缓存的map中尝试获取数据mapperId + mapper全路径 + sql + 占位...
Android7.0 以上Charles抓取HTTPS包解决方法经过俺多天的努力,终于找到了Charles抓取HTTPS接口的解决方法下载VritualXposed apk包安装到android手机链接:https://pan.baidu.com/s/1reFsjoHdXETHp6zo78Deow提取码:suns下载JustTrustMe apk包安装到android手机链接:https://pan.baidu.com/s/1reFsjoHdXETHp6zo78Deow提取码:suns安装完
英文关键字支持库,为易语言提供 if switch while for continue break return 等英文形式的流程控制语句,其功能和用法与易语言核心库中相关命令完全等同。使用本支持库编写的易语言程序,运行时不需要依赖本支持库文件。使用“易写易库(EXEK)”开发,作者liigo。下载英文关键字支持库(压缩包20KB,解压后支持库62KB)。此支持库已经过“斩月”处理,可在易语
本文不做说明,记录工作上内存泄漏相关定位工具生成堆栈文件通过jdk自带工具生成,线上使用的时候执行的时候提示找不到pid对应的文件,加上-F参数可以强制关联上jmap -F -dump:format=b,file=d:\dump\heap.hprof <pid>下面这个没有使用过,目测可以jcmd <pid> GC.heap_dump d:\dump\h...