Android之QQ登录
1.下载Android SDK :QQ登录、支付、社交渠道等功能
SDK类型 | 最近更新日期 | 文件大小 | 说明 |
---|---|---|---|
Android_SDK_V3.1.0 ![]() | 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方法
在某些低端机上调用登录后,由于内存紧张导致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$* {*;}