第三方授权登陆(QQ)
QQ授权:
1.下载SDK:QQ互联SDK官网,注册开发者,创建应用,等待审核通过,获取appid;(测试用的appid为:tencent222222);
***备注:在QQ互联填写APP信息时,最多可以填写6组包名和签名,便于在测试和正式发布的时候都可以使用。签名是根据打包APK时的签名文件不同,用官网提供的签名生成工具生成的。
2.创建工程,将open_sdk.jar 导入工程;
3.配置AndroidManifest.xml:
<uses-permissionandroid:name="android.permission.INTERNET"/>
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
<application>
<activity
android:name="com.tencent.tauth.AuthActivity"
android:noHistory="true"
android:launchMode="singleTask">
<intent-filter>
<actionandroid:name="android.intent.action.VIEW"/>
<categoryandroid:name="android.intent.category.DEFAULT"/>
<categoryandroid:name="android.intent.category.BROWSABLE"/>
<dataandroid:scheme="tencent你的AppId"/>
</intent-filter>
</activity>
<activity android:name="com.tencent.connect.common.AssistActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="orientation|keyboardHidden|screenSize"
/>
<application>
4.创建实例:
import org.json.JSONObject;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.secrui.activity.BaseActivity;
import com.secrui.smarthome.R;
import com.tencent.connect.common.Constants;
import com.tencent.tauth.IUiListener;
import com.tencent.tauth.Tencent;
import com.tencent.tauth.UiError;
public class LoginActivity extends BaseActivity implements OnClickListener {
private Button btn_qq_login;
private Tencent mTencent;
private UserInfo mInfo;
private IUiListener loginListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
btn_qq_login = (Button) findViewById(R.id.btn_qq_login);
btn_qq_login.setOnClickListener(this);
loginListener = new BaseUIListener();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_qq_login:
mTencent = Tencent.createInstance("tencent123456789", getApplicationContext());
/**通过这句代码,SDK实现了QQ的登录,这个方法有三个参数,第一个参数是context上下文,第二个参数SCOPO 是一个String类型的字符串,表示一些权限
官方文档中的说明:应用需要获得哪些API的权限,由“,”分隔。例如:SCOPE = “get_user_info,add_topic”;所有权限用“all”
第三个参数,是一个事件监听器,IUiListener接口的实例,这里用的是该接口的实现类 */
// if (!mTencent.isSessionValid()) {
mTencent.login(LoginActivity.this, "all", loginListener);
// }
break;
}
}
/**QQ登录回调*/
private class BaseUIListener implements IUiListener{
@Override
public void onCancel() {
}
@Override
public void onComplete(Object response) {
/** 在登录成功后会调用onComplete回调,返回类似下面格式的JSONObject对象
{
"ret":0, //表示登录成功
"pay_token":"xxxxxxxxxxxxxxxx",
"pf":"openmobile_android",
"expires_in":"7776000",
"openid":"xxxxxxxxxxxxxxxxxxx",
"pfkey":"xxxxxxxxxxxxxxxxxxx",
"msg":"sucess",
"access_token":"xxxxxxxxxxxxxxxxxxxxx"
}
*/
if (null == response || ((JSONObject) response).length() == 0) {
ToastUtils.showShort(LoginActivity.this, R.string.loginfail);
return;
}
try {
JSONObject jsonResponse = (JSONObject) response;
String token = jsonResponse.getString(Constants.PARAM_ACCESS_TOKEN);
String expires = jsonResponse.getString(Constants.PARAM_EXPIRES_IN);
String openId = jsonResponse.getString(Constants.PARAM_OPEN_ID);
if (!TextUtils.isEmpty(token) && !TextUtils.isEmpty(expires)
&& !TextUtils.isEmpty(openId)) {
mTencent.setAccessToken(token, expires);
mTencent.setOpenId(openId);
//可以进一步获取信息
mInfo = new UserInfo(this, mTencent.getQQToken());
mInfo.getUserInfo(listener);
}
} catch(Exception e) {
e.printStackTrace();
}
}
@Override
public void onError(UiError arg0) {
Log.e("TAG_qqLOGIN", "error = "+arg0);
}
}
/*
返回类似下面的JSON数据
{
"is_yellow_year_vip": "0",
"ret": 0,
"figureurl_qq_1":
"http://q.qlogo.cn/qqapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/40",
"figureurl_qq_2":
"http://q.qlogo.cn/qqapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/100",
"nickname": "小罗",
"yellow_vip_level": "0",
"msg": "",
"figureurl_1":
"http://qzapp.qlogo.cn/qzapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/50",
"vip": "0",
"level": "0",
"figureurl_2":
"http://qzapp.qlogo.cn/qzapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/100",
"is_yellow_vip": "0",
"gender": "男",
"figureurl":
"http://qzapp.qlogo.cn/qzapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/30"
}
*/
IUiListener listener = new IUiListener() {
@Override
public void onError(UiError e) {
}
@Override
public void onComplete(final Object response) {
Message msg = new Message();
msg.obj = response;
msg.what = 0;
mHandler.sendMessage(msg);
new Thread(){
@Override
public void run() {
JSONObject json = (JSONObject)response;
if(json.has("figureurl")){
Bitmap bitmap = null;
try {
bitmap = getbitmap(json.getString("figureurl_qq_2"));
} catch (JSONException e) {
}
Message msg = new Message();
msg.obj = bitmap;
msg.what = 1;
mHandler.sendMessage(msg);
}
}
}.start();
}
@Override
public void onCancel() {
}
};
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == Constants.REQUEST_LOGIN ||
requestCode == Constants.REQUEST_APPBAR) {
Tencent.onActivityResultData(requestCode,resultCode,data,loginListener);
}
super.onActivityResult(requestCode, resultCode, data);
}
/**
* 根据一个网络连接(String)获取bitmap图像
*
* @param imageUri
* @return
* @throws MalformedURLException
*/
public Bitmap getbitmap(String imageUri) {
Log.v(TAG, "getbitmap:" + imageUri);
// 显示网络上的图片
Bitmap bitmap = null;
try {
URL myFileUrl = new URL(imageUri);
HttpURLConnection conn = (HttpURLConnection) myFileUrl
.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
is.close();
Log.v(TAG, "image download finished." + imageUri);
} catch (OutOfMemoryError e) {
e.printStackTrace();
bitmap = null;
} catch (IOException e) {
e.printStackTrace();
Log.v(TAG, "getbitmap bmp fail---");
bitmap = null;
}
return bitmap;
}
}