技术标签: 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登录结束
*/
通用平台: teamviewmac os:Transmitubuntu:FileZillawindows:FileZilla转载于:https://www.cnblogs.com/huangshiyu13/p/6496774.html
Title *{ margin: 0; padding: 0; } table{ border-collapse: collapse; } td{ padding: 10px;
原标题:免费文献管理器Mendeley,其实比你想象的好用作为科研搬砖者,相信大家都知道文献管理器到底是一个多重要的搬砖小推车。然而,Mendeley 作为文献管理器,好多小伙伴都不了解,认为它只是一个插入文献的单一工具,但其实 Mendeley 比你想象的好用很多。Mendeley 可以帮我们解决以下问题:1)下载的文献,如何作特别的标记、以便于不同方式的快速检索?2)写多篇论文,如何整合在不同..._mendeley年份,作者都放在一起了
1.原因是没有ic_back图片2.将ic_back图片直接复制到工程的/Drawable里。_@drawable/ic_back
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Ma...
建设真正可持续发展的人工智能,是跨多学科、综合性强和智力密集的复杂工作。本文将通过可用AI、可靠AI、可信AI三大类来分析遇到的困难和探索。
蓝牙通讯中的两个重要的角色,central和peripheral。相对于传统的client-server架构,peripheral代表着拥有数据的一方并且外界是需要这数据的。central代表着使用数据方,从peripheral那里获得数据并完成特定的事情
题意:相邻两天股价相同的情况无需考虑。不妨设相邻天股价不同。则每天都要卖出/买入。如果当天股价大于昨天,那就得卖出;如果当天股价小于昨天,那就得买入。如果卖出了,当前持有的就是钱;如果买入了,已知当前的钱和当天的股价就可以知道持有多少股票。所以前iii天最多有多少钱和第i−1i-1i−1的股票价格,就可以知道最多有多少股票。进而也可以确定今天可以买入多少和可以卖出多少#include <cstdio>#include <cstring>#include <ve._daydreambroker题解
大家好,这个程序主要分为两个部分,一个是没有python环境的靶机端,也就是舍友的电脑,另外一个是有python环境攻击端,也就是我的电脑,这两个电脑处于同一个局域网中,拿下面就让我们来一起学习吧.实验环境:同一局域网一台靶机一台攻击机一.靶机端代码1.导入实验所需要的库from __future__ import print_functionimport ctypes, sysi..._python给电脑设置开机加密
#请求时需要加请求头:“Authorization:Basic ZnJlZXN3aXRjaDp3b3Jrcw==”#其中”ZnJlZXN3aXRjaDp3b3Jrcw==“为”freeswitch:works“(RPC模块的鉴权用户名和密码)进行base64编码获得#直接执行api命令 命令附带的参数需进行urlencode如下 命令:sofia 参数:profile%20externa..._freeswitch java
最近工作中突然要求要项目进行国际化,之前没遇到过。但是也很简单呀,只需要把添加一个相应语言的的strings.xml的资源文件就好了,不是吗?这样只要切换系统语言就能切换app的文字语言了。但是由此引发了一个稍微深入一点的问题,那就是如果要实现在app中不跟随系统切换语言,可以直接切换语言哪又要怎么做呢?这种功能是支付宝/微信都有的,功能如下图:多语言切换.gif于是努力的研究了一下子,发现实现这..._android 语言类型资源只需要固定的语言
网易科技讯1月11日消息,近日,2020 ASC世界大学生超级计算机竞赛(ASC20)启动会在京举行。据了解,今年的大赛赛题包括使用经典超级计算机完成量子计算模拟和训练人工智能模型完成英语考试试题。通过预赛选拔出的20支队伍将进入到4月25日-29日在位于中国深圳的南方科技大学举行的总决赛。据介绍,ASC20首次设置量子计算赛题,各参赛队伍需要在经典超级计算机上使用QuEST软件,模拟使用30个量..._asc超算大赛比什么