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登录结束
*/