上面说到webview方式登录QQ的集成,现在开始客户端登录的集成.首先还是下载客户端的SDK和DEMO,
示例代码如下:
首先清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest package="test.example.com.mapp"
xmlns:android="http://schemas.android.com/apk/res/android">
<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" />
<uses-permission android:name="android.permission.GET_TASKS"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</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" />
<!-- 100380359 100381104 222222 -->
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:screenOrientation="behind"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="orientation|keyboardHidden">
</activity>
</application>
</manifest>
注意,
AssistActivity只有在运行代码后,才会在logcat中提示错误信息,告诉需要另外配置该activity
Mainactivity代码
public class MainActivity extends AppCompatActivity implements IUiListener {
private static Tencent mTencent;
private String mAppid = "1105667444";
private TextView mUserInfo;
private ImageView mUserLogo;
private UserInfo mInfo;
public static void initOpenidAndToken(JSONObject jsonObject) {
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);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化mTencent
init();
}
private void init() {
mTencent = Tencent.createInstance(mAppid, this);
}
public void login(View view) {
mTencent.login(this, "all", this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == Constants.REQUEST_LOGIN || requestCode == Constants.REQUEST_APPBAR) {
//处理返回的结果
Tencent.onActivityResultData(requestCode, resultCode, data, this);
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onComplete(Object response) {
showToast("登录成功");
JSONObject json = (JSONObject) response;
//通过返回的数据,获得openid和token
initOpenidAndToken(json);
//获取用户信息
updateUserInfo();
}
private void updateUserInfo() {
if (mTencent != null && mTencent.isSessionValid()) {
mInfo = new UserInfo(this, mTencent.getQQToken());
//获取用户信息
mInfo.getUserInfo(listener);
}else {
mUserInfo.setText("");
mUserInfo.setVisibility(android.view.View.GONE);
mUserLogo.setVisibility(android.view.View.GONE);
}
}
private IUiListener listener = new IUiListener() {
@Override
public void onComplete(Object response) {
//成功获取的回调.在这里乐意获取用户的头像,昵称等信息
showToast(response.toString());
}
@Override
public void onError(UiError uiError) {
}
@Override
public void onCancel() {
}
};
public void showToast(String s) {
Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
}
@Override
public void onError(UiError uiError) {
showToast("登录失败");
}
@Override
public void onCancel() {
showToast("取消登陆");
}
}