最近用到QQ第三方登陸,其實僅僅對於第三方登陸而言,用到的東西不多,也就是簡化用戶註冊的煩惱而已。
就搞個超級簡化版吧,代碼不多,幾百行而已。
先看效果,再看代碼
主函數:
/**
* 簡易QQ第三方登陸
*
* @author shaoshuai
*
*/
public class MainActivity extends Activity {
@ViewInject(R.id.iv_user_logo)
private ImageView mUserLogo;// 頭像
@ViewInject(R.id.tv_user_name)
private TextView mUserName;// 網名
@ViewInject(R.id.bt_login)
private Button bt_login;// 登陸按鈕
@ViewInject(R.id.et_result_info)
private EditText et_result_info;// 結果信息
@ViewInject(R.id.et_user_info)
private EditText et_user_info;// 用戶信息
private Context mContext;
public static String mAppid = "222222";
public static Tencent mTencent;
@SuppressLint("HandlerLeak")
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0) {// 設置網名
JSONObject response = (JSONObject) msg.obj;
try {
if (response.has("nickname")) {// 用戶名
String name = response.getString("nickname");
mUserName.setVisibility(android.view.View.VISIBLE);
mUserName.setText(name);
}
if (response.has("figureurl_qq_2")) {// 100*100的頭像
String logo = response.getString("figureurl_qq_2");
if (logo == null) {
mUserLogo.setImageResource(R.drawable.ic_launcher);// 默認圖片
} else {
new BitmapUtils(mContext).display(mUserLogo, logo);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = getApplicationContext();
ViewUtils.inject(this);
mTencent = Tencent.createInstance(mAppid, mContext);
initView();
}
private void initView() {
// 登陸點擊
bt_login.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onClickLogin();
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.e("返回信息", "-->onActivityResult " + requestCode + " resultCode=" + resultCode);
if (requestCode == Constants.REQUEST_LOGIN || requestCode == Constants.REQUEST_APPBAR) {
Tencent.onActivityResultData(requestCode, resultCode, data, loginListener);
}
super.onActivityResult(requestCode, resultCode, data);
}
private void onClickLogin() {
if (!mTencent.isSessionValid()) {// 登陸
mTencent.login(this, "all", loginListener);
} else {// 退出
mTencent.logout(this);
updateUserInfo();
}
}
IUiListener loginListener = new BaseUiListener(MainActivity.this) {
@Override
protected void doComplete(JSONObject values) {
// {"ret":0,
// "openid":"89293B3450BC3115AFC3ADA34143234F",
// "access_token":"B5A5E9E3850BBFBEF2044817D1510E22",
// "pay_token":"D72E4746E95A1721C33A3D36B04BBDAE",
// "expires_in":7776000,
// "pf":"desktop_m_qq-10000144-android-2002-",
// "pfkey":"574673897173987122dbb16efcad7c07",
// "msg":"", "login_cost":503,
// "query_authority_cost":351,
// "authority_cost":-56924173}
et_result_info.setText("返回結果:" + values);
initOpenidAndToken(values);
updateUserInfo();
}
};
public static void initOpenidAndToken(JSONObject jsonObject) {
try {
String token = jsonObject.getString(Constants.PARAM_ACCESS_TOKEN);
String expires = jsonObject.getString(Constants.PARAM_EXPIRES_IN);
String openId = jsonObject.getString(Constants.PARAM_OPEN_ID);
if (!TextUtils.isEmpty(token) && !TextUtils.isEmpty(expires) && !TextUtils.isEmpty(openId)) {
mTencent.setAccessToken(token, expires);
mTencent.setOpenId(openId);
}
} catch (Exception e) {
}
}
private void updateUserInfo() {
if (mTencent != null && mTencent.isSessionValid()) {
bt_login.setTextColor(Color.RED);
bt_login.setText("退出帳號");
UserInfo mInfo = new UserInfo(this, mTencent.getQQToken());
mInfo.getUserInfo(new BaseUiListener(MainActivity.this) {
@Override
protected void doComplete(JSONObject values) {
// {"ret":0,"msg":"","is_lost":0,
// "nickname":"┣┫","gender":"男","province":"北京","city":"海淀",
// "figureurl":"http:\/\/qzapp.qlogo.cn\/qzapp\/222222\/8FD10C91F5ADCA3F30E8AFC66E9DDBA0\/30",
// "figureurl_1":"http:\/\/qzapp.qlogo.cn\/qzapp\/222222\/8FD10C91F5ADCA3F30E8AFC66E9DDBA0\/50",
// "figureurl_2":"http:\/\/qzapp.qlogo.cn\/qzapp\/222222\/8FD10C91F5ADCA3F30E8AFC66E9DDBA0\/100",
// "figureurl_qq_1":"http:\/\/q.qlogo.cn\/qqapp\/222222\/8FD10C91F5ADCA3F30E8AFC66E9DDBA0\/40",
// "figureurl_qq_2":"http:\/\/q.qlogo.cn\/qqapp\/222222\/8FD10C91F5ADCA3F30E8AFC66E9DDBA0\/100",
// "is_yellow_vip":"1","vip":"1","yellow_vip_level":"8","level":"8","is_yellow_year_vip":"1"}
et_user_info.setText("用戶信息:" + values);
Message msg = new Message();
msg.obj = values;
msg.what = 0;
mHandler.sendMessage(msg);
}
});
} else {
bt_login.setTextColor(Color.BLUE);
bt_login.setText("登錄");
mUserName.setText("用戶名");
mUserLogo.setImageResource(R.drawable.ic_launcher);// 默認圖片
et_result_info.setText("返回結果信息");
et_user_info.setText("用戶詳細信息:");
}
}
}
監聽類:
public class BaseUiListener implements IUiListener {
private Context mContext;
public BaseUiListener(Context mContext) {
super();
this.mContext = mContext;
}
@Override
public void onComplete(Object response) {
if (null == response) {
Toast.makeText(mContext, "登錄失敗:返回爲空", Toast.LENGTH_SHORT).show();
return;
}
JSONObject jsonResponse = (JSONObject) response;
if (null != jsonResponse && jsonResponse.length() == 0) {
Toast.makeText(mContext, "登錄失敗:返回爲空", Toast.LENGTH_SHORT).show();
return;
}
// String result = response.toString();
Toast.makeText(mContext, "登錄成功", Toast.LENGTH_SHORT).show();
doComplete((JSONObject) response);
}
protected void doComplete(JSONObject values) {
}
@Override
public void onError(UiError e) {
Log.e("sdkDemo", "錯誤: " + e.errorDetail);
}
@Override
public void onCancel() {
Log.e("sdkDemo", "取消");
}
}
Demo下載地址:http://download.csdn.net/detail/shao941122/9357121