|
一、导入jar包,使用QQ开发者平台的SDKs,注意要导入两个包
compile files('libs/open_sdk_r5756.jar')
compile files('libs/mta-sdk-1.6.2.jar')
二、使用登录的API
//实例化mTencent
mTencent=Tencent.createInstance(QQLOGIN_APPID,this.getApplicationContext()); //登录,第二个参数为实现IUiListener接口 mTencent.login(this,QQ_SCOPE,loginListener); //监听实现 loginListener=new IUiListener() {
@Override
public void onComplete(Object o) {
if(o==null){
Toast.makeText(getApplicationContext(),"返回结果为空",Toast.LENGTH_LONG).show();
return;
}
//objResp= {"ret":0,"openid":"E783DBFBE70A0C83560F2153933AA7BE","access_token":"6D0416C27ED96E5570B1AEEA1250CEF5","pay_token":"308D2AB68D052081832B4AFEB07F86D1","expires_in":7776000,"pf":"desktop_m_qq-10000144-android-2002-","pfkey":"f05741cf1cad3a97be1fc337f3ff1913","msg":"","login_cost":525,"query_authority_cost":335,"authority_cost":0}
JSONObject jo= (JSONObject) o;
if(null!=jo&&jo.length()==0){
Toast.makeText(getApplicationContext(),"返回结果为空",Toast.LENGTH_LONG).show();
}
Toast.makeText(getApplicationContext(),"登录成功",Toast.LENGTH_LONG).show();
//处理结果
System.out.println(jo.toString());
try {
int ret=jo.getInt("ret");
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"); //下面两个方法非常重要,否则会出现client request's parameters are invalid, invalid openid
mTencent.setOpenId(openID);
mTencent.setAccessToken(accessToken, expires);
}
} catch (JSONException e) {
e.printStackTrace();
}
// handleQQLoginReceivedData(jsonvalues);
}
@Override
public void onError(UiError uiError) {
Toast.makeText(getApplicationContext(),"登录错误",Toast.LENGTH_LONG).show();
}
@Override
public void onCancel() {
Toast.makeText(getApplicationContext(),"登录取消",Toast.LENGTH_LONG).show();
}
};三、OpenId和Access_Token的区别 OpenId:QQ和人人、微博社交正好登陆稍有区别,是在授权后并不返回用户uid,取而代之是返回openid,用于标示用户身份。 Access_Token:通过openid,access_token,appid来读取接口信息,比如get_user_info等等。 四、用户(比如Android客户端)再此访问QQ服务器获取用户信息
使用的api为: QQToken qqToken=mTencent.getQQToken();
UserInfo userInfo=new UserInfo(this,qqToken);
userInfo.getUserInfo(new IUiListener() {//异步方式获取用户信息
@Override
public void onComplete(Object o) {
JSONObject Jobj= (JSONObject) o;
try {
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onError(UiError uiError) {
System.out.print(uiError.toString());
}
@Override
public void onCancel() {
System.out.print("cancel");
}
}); 这个api在底层使用get请求的方式,自己写也可以,根据OpenAPI即可(因为QQ服务器使用php开发,底层接收get方法请求,因此如果自己根据OpenAPI写post请求方式,会导致返回的数据失效), 比如出现错误(client request's parameters are invalid)。 五、几个注意的点 1.创建应用要在腾讯开放平台,不需要上线,尽量不要在QQ互联开放平台(因为目前QQ互联正往腾讯开放平台搬迁); 2.在AndroidManifest.xml中要添加文档中需要的两个activity,并且修改APPID为自己的 3.要使用OnActivityResult的方式获取响应数据(因为很多低端手机是无法直接获取登录的回调函数的),然后在onActivityResult中调用如下: @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);
}
|