Android之QQ登录
1.下载Android SDK :QQ登录、支付、社交渠道等功能
SDK类型 | 最近更新日期 | 文件大小 | 说明 |
2016-05-24 | 4.10M | | |
Android_SDK_V3.1.0(基础包) | 2016-05-24 | 220K | |
两个jar包:mta-sdk-1.6.2.jar ; open_sdk_r5756.jar
2.给应用的AndroidManifest增加SDK需要的配置给应用的AndroidManifest增加SDK需要的配置
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
<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="tencent你的AppId" />
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
</application>
如你的AppId是"222222",则<data>标签应该是这样的:
<data android:scheme="tencent222222" />
3.创建SDK主要实现类Tencent类
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mine_info);
// Tencent类是SDK的主要实现类,开发者可通过Tencent类访问腾讯开放的OpenAPI。
// 其中APP_ID是分配给第三方应用的appid,类型为String。
Tencent mTencent = Tencent.createInstance(APP_ID, this.getApplicationContext());
}
4.获取access_token、openid
先来看看qq返回字段:
返回参数 | 参数说明 |
openid | 用于唯一标识用户身份(每一个openid与QQ号码对应)。 |
access_token | 用户进行应用邀请、分享、支付等基本业务请求的凭据。 |
expires_in | access_token的有效时间,在有效期内可以发起业务请求,过期失效。 |
如何获取?
所有的SDK接口(分享、支付、登录等等)调用,都会传入一个回调,用以接收SDK返回的调用结果,结果在实现了IUiListener接口的对象中呈现。
所以要实现IUiListener接口:IUiListener:用于登录、快速支付登录、应用分享、应用邀请等接口
public class LoginListener implements IUiListener {
private static String TAG = LoginListener.class.getSimpleName();
@Override
public void onComplete(Object o) {
if (null == o) {
Log.i(TAG, "返回为空登录失败 o is null");
return;
}
JSONObject jsonResponse = (JSONObject) o;
if (null != jsonResponse && jsonResponse.length() == 0) {
Log.i(TAG, "返回为空登录失败");
return;
}
String token = jsonResponse.optString("access_token");
String expires = jsonResponse.optString("expires_in");
String openId = jsonResponse.optString("openid");
}
@Override
public void onError(UiError uiError) {
}
@Override
public void onCancel() {
}
}
这是登录,同样,分享等其他操作也要也一个类实现
IUiListener接口来获取返回的数据。参考官方教程
还有一个接口:IRequestListener。用于上传图片、查看相册等
特别注意:
在某些低端机上调用登录后,由于内存紧张导致APP被系统回收,登录成功后无法成功回传数据。解决办法如下
在调用login的Activity或者Fragment重写onActivityResult方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == Constants.REQUEST_API) {
if(resultCode == Constants.RESULT_LOGIN) {
mTencent.handleLoginData(data, loginListener);
}
}
super.onActivityResult(requestCode, resultCode, data);
}
5.使用access_token、openid
String openid = "1234567896ASDFGHJKLLIUYT";
String access_token = "2C0884DC4B930010D852D8D504FC9F4D";
String new_expires_in = System.currentTimeMillis() + Long.parseLong(expires_in) * 1000;; // 凭证有效期
mTencent = Tencent.
createInstance(APP_ID)
;mTencent.setOpenId(openid)
;mTencent.setAccessToken(access_token
, expires_in)
;
qq登录用法:
public void Login(){
if (!mTencent.isSessionValid())
{
mTencent.login(mActivity, "all", qqLoginListener);
}else{
Log.i("space","当前为登录状态 openId="+mTencent.getOpenId());
}
}
qq注销用法:
public void qqLogout(){
if(mTencent != null){
mTencent.logout(mActivity);
}
}
qq分享方法:
/**
* 分享消息
* @param title 分享的标题(必填)
* @param targetUrl 点击消息后的跳转URL(必填)
* @param msg 分享的消息摘要,最长40个字
* @param imgUrl 分享图片的URL或者本地路径
* @param backName 手Q客户端顶部,替换“返回”按钮文字,如果为空,用返回代替
*/
@JavascriptInterface
public void shareMessageToQQ(String title,String targetUrl,String msg,String imgUrl,String backName)
{
if(mTencent == null){
return;
}
if(TextUtils.isEmpty(title) || TextUtils.isEmpty(targetUrl)){
return;
}
final Bundle bundle= new Bundle();
//分享的类型(必填)
bundle.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
//分享的标题, 最长30个字符(必填)
bundle.putString(QQShare.SHARE_TO_QQ_TITLE, title);
//这条分享消息被好友点击后的跳转URL(必填)
bundle.putString(QQShare.SHARE_TO_QQ_TARGET_URL, targetUrl);
//分享的消息摘要,最长40个字
bundle.putString(QQShare.SHARE_TO_QQ_SUMMARY, msg);
if(!TextUtils.isEmpty(imgUrl)){
//分享图片的URL或者本地路径
bundle.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, imgUrl);
}
//手Q客户端顶部,替换“返回”按钮文字,如果为空,用返回代替
bundle.putString(QQShare.SHARE_TO_QQ_APP_NAME, backName);
//分享额外选项
bundle.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);
mTencent.shareToQQ(mActivity, bundle, qqShareListener);
}
qq分享图片:
/**
* 分享纯图片
* @param imgLocalUrl 需要分享的本地图片路径(必填)
* @param backName 手Q客户端顶部,替换“返回”按钮文字,如果为空,用返回代替
*/
@JavascriptInterface
public void shareImageToQQ(String imgLocalUrl,String backName)
{
if(mTencent == null){
JsCallbackExecutor.onSocialQQShareResult(CallbackCode.SHARE_ERROR, "share error");
return;
}
if(TextUtils.isEmpty(imgLocalUrl)){
JsCallbackExecutor.onSocialQQShareResult(CallbackCode.PARAMS_ERROR, "imgLocalUrl is null");
return;
}
final Bundle bundle = new Bundle();
//分享的类型(必填)
bundle.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE);
//需要分享的本地图片路径(必填)
bundle.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, imgLocalUrl);
//手Q客户端顶部,替换“返回”按钮文字,如果为空,用返回代替
bundle.putString(QQShare.SHARE_TO_QQ_APP_NAME, backName);
//分享额外选项
bundle.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);
mTencent.shareToQQ(mActivity, bundle, qqShareListener);
}
qq分享音乐:
/**
* 分享音乐到QQ
* @param title 分享的标题(必填)
* @param targetUrl 这条分享消息被好友点击后的跳转URL(必填)
* @param musicNetUrl 分享音乐文件的远程链接, 以URL的形式传入, 不支持本地音乐。(必填)
* @param msg 分享的摘要,最长40个字符
* @param imgUrl 分享图片的URL或者本地路径
* @param backName 手Q客户端顶部,替换“返回”按钮文字,如果为空,用返回代替
*/
@JavascriptInterface
public void shareMusicToQQ(String title,String targetUrl,String musicNetUrl,String msg,String imgUrl,String backName)
{
if(mTencent == null){
return;
}
if(TextUtils.isEmpty(title) ||TextUtils.isEmpty(targetUrl) || TextUtils.isEmpty(musicNetUrl)){
return;
}
final Bundle bundle = new Bundle();
//分享的类型(必填)
bundle.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_AUDIO);
//分享的标题(必填)
bundle.putString(QQShare.SHARE_TO_QQ_TITLE, title);
//这条分享消息被好友点击后的跳转URL(必填)
bundle.putString(QQShare.SHARE_TO_QQ_TARGET_URL, targetUrl);
//分享音乐文件的远程链接, 以URL的形式传入, 不支持本地音乐。(必填)
bundle.putString(QQShare.SHARE_TO_QQ_AUDIO_URL, musicNetUrl);
if(!TextUtils.isEmpty(msg)){
//分享的摘要,最长40个字符
bundle.putString(QQShare.SHARE_TO_QQ_SUMMARY, msg);
}
if(!TextUtils.isEmpty(imgUrl)){
//分享图片的URL或者本地路径
bundle.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, imgUrl);
}
//手Q客户端顶部,替换“返回”按钮文字,如果为空,用返回代替
bundle.putString(QQShare.SHARE_TO_QQ_APP_NAME, backName);
//分享额外选项
bundle.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);
mTencent.shareToQQ(mActivity, bundle, qqShareListener);
}
qq分享应用:
/**
* 分享应用到QQ
* @param title 分享的标题(必填)
* @param msg 分享的摘要,最长40个字符
* @param imgUrl 分享图片的URL或者本地路径
* @param backName 手Q客户端顶部,替换“返回”按钮文字,如果为空,用返回代替
*/
@JavascriptInterface
public void shareAppToQQ(String title,String msg,String imgUrl,String backName)
{
if(mTencent == null){
return;
}
if(TextUtils.isEmpty(title)){
return;
}
final Bundle bundle = new Bundle();
//分享的类型(必填)
bundle.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_APP);
//分享的标题(必填)
bundle.putString(QQShare.SHARE_TO_QQ_TITLE, title);
//分享的摘要,最长40个字符
bundle.putString(QQShare.SHARE_TO_QQ_SUMMARY, msg);
if(!TextUtils.isEmpty(imgUrl)){
//分享图片的URL或者本地路径
bundle.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, imgUrl);
}
//手Q客户端顶部,替换“返回”按钮文字,如果为空,用返回代替
bundle.putString(QQShare.SHARE_TO_QQ_APP_NAME, backName);
//分享额外选项
bundle.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);
mTencent.shareToQQ(mActivity, bundle, qqShareListener);
}
获取QQ用户信息
/**
* 获取TencentQQ用户信息
* @param token token
* @param expires expires
* @param openId openId
*/
@JavascriptInterface
public void getQQUserInfo(String token,String expires,String openId)
{
if(mTencent != null){
if (!TextUtils.isEmpty(token) && !TextUtils.isEmpty(expires)&& !TextUtils.isEmpty(openId)) {
initOpenidAndToken(token,expires,openId);
}else{
return;
}
UserInfo info = new UserInfo(mActivity, mTencent.getQQToken());
info.getUserInfo(new IUiListener() {
@Override
public void onError(UiError arg0) {
}
@Override
public void onComplete(Object obj) {
JSONObject jsonResponse = (JSONObject) obj;
}
@Override
public void onCancel() {}
});
}else {
return;
}
}
混淆说明
如果应用需要混淆代码,为了保证SDK的正常使用,建议不要混淆SDK的jar包,如果仍要混淆,需要在混淆规则中加上下面几行配置:
-keep class com.tencent.open.TDialog$*
-keep class com.tencent.open.TDialog$* {*;}
-keep class com.tencent.open.PKDialog
-keep class com.tencent.open.PKDialog {*;}
-keep class com.tencent.open.PKDialog$*
-keep class com.tencent.open.PKDialog$* {*;}