Android之QQ登录

Android之QQ登录

1.下载Android SDK QQ登录、支付、社交渠道等功能

SDK类型最近更新日期文件大小说明
Android_SDK_V3.1.0 Connect_logo_1.png2016-05-244.10M 
Android_SDK_V3.1.0(基础包)Connect_logo_1.png2016-05-24220K 
两个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_inaccess_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$* {*;}



链接:Android之微信第三方登录

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值