关于QQ的第三方登录
1、 下载qq登录的sdk
2、在清单文件中添加权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- SDK2.1新增获取用户位置信息 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
3、在清单文件中添加两个activity
<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="tencent222222"/>//正确格式为tencent我申请的id
<!-- 100380359 100381104 222222 -->
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="behind"
android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
4、实例化 Tencent对象
mTencent = Tencent.createInstance("申请的id号", this);
5、在需要触发三方登陆的地方添加如下代码:
mTencent.login(this, "all", this);
6、在onActivityResult方法中添加如下代码
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == Constants.REQUEST_LOGIN ||
requestCode == Constants.REQUEST_APPBAR) {
Tencent.onActivityResultData(requestCode, resultCode, data, this);
}
}
7、实现IUiListener接口,里面有onComplete,onError,onCancel三个方法,分别表示授权成功,授权失败,取消授权的方法
8、获得的具体用户对象为UserInfo
下面为一个详细的获取用户信息的demo:
代码:
package com.example.threepartylogin;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.gson.Gson;
import com.squareup.picasso.Picasso;
import com.tencent.connect.UserInfo;
import com.tencent.connect.common.Constants;
import com.tencent.tauth.IUiListener;
import com.tencent.tauth.Tencent;
import com.tencent.tauth.UiError;
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, IUiListener {
private Tencent mTencent;
private ImageView mPic;
private TextView mName;
private TextView mAddress;
private TextView mGender;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn).setOnClickListener(this);
mPic = (ImageView) findViewById(R.id.pic);
mName = (TextView) findViewById(R.id.name);
mAddress = (TextView) findViewById(R.id.address);
mGender = (TextView) findViewById(R.id.gender);
mTencent = Tencent.createInstance("222222", this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn:
mTencent.login(this, "all", this);
break;
}
}
@Override
public void onComplete(Object o) {
JSONObject jsonObject = (JSONObject) o;
//存储授权令牌token
String token = jsonObject.optString(Constants.PARAM_ACCESS_TOKEN);//核心参数
String expires = jsonObject.optString(Constants.PARAM_EXPIRES_IN);
String openId = jsonObject.optString(Constants.PARAM_OPEN_ID);//核心参数
if (!TextUtils.isEmpty(token) && !TextUtils.isEmpty(expires)
&& !TextUtils.isEmpty(openId)) {
mTencent.setAccessToken(token, expires);
mTencent.setOpenId(openId);
UserInfo userInfo = new UserInfo(MainActivity.this, mTencent.getQQToken());
userInfo.getUserInfo(new IUiListener() {
@Override
public void onComplete(Object o) {
String json = o.toString();
Gson gson = new Gson();
MyBean myBean = gson.fromJson(json,MyBean.class);
Picasso.with(MainActivity.this).load(myBean.figureurl_qq_2).into(mPic);
mName.setText(myBean.nickname);
mAddress.setText(myBean.province);
mGender.setText(myBean.gender);
}
@Override
public void onError(UiError uiError) {
}
@Override
public void onCancel() {
}
});
}
}
@Override
public void onError(UiError uiError) {
}
@Override
public void onCancel() {
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == Constants.REQUEST_LOGIN ||
requestCode == Constants.REQUEST_APPBAR) {
Tencent.onActivityResultData(requestCode, resultCode, data, this);
}
}
}
布局: