android QQ登录与分享

android QQ登录与分享

      android QQ登录与分享是我们一个很常见的功能,除了微信登录、QQ登录、还有微博登录,外加上分享,今天就分享一下android的QQ分享与登录,我这里H5开发的和webview配合使用场景,不过就算是原生的,思路也差不多。

一、腾讯开放平台注册应用获取appId,至于怎么注册很简单,这里就不叙述了。

二、下载sdk,下载链接是http://wiki.open.qq.com/wiki/mobile/SDK%E4%B8%8B%E8%BD%BD,下载最新版本,目前好像已经到3.3.1了

三、将下载下来的包里面的open_sdk_r5990_lite.jar包放入工程的libs目录下,如图


三、build.gradle里面加入

// qq登录
implementation files('libs/open_sdk_r5990_lite.jar')

四、AndroidMainfest.xml里面加入权限和activity

1、权限

<uses-permission android:name="android.permission.INTERNET" />  
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  

2、加入activity

<!--qq登录-->
        <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" />
                <!-- 这地方需要用你在开放平台申请的appid:tencent+appid -->
                <data android:scheme="tencent1106320813" />
            </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" />

五、我这里是提供接口给H5端调用,写在了一个JavascriptUtils工具类里面

//QQ登录
private static final String APP_ID = "1105602574";//官方获取的APPID
private Tencent mTencent;
public static BaseUiListener mIUiListener;
public static final int QQ_LOGIN = 6008;
/**
 * QQ登录
 */
@JavascriptInterface
public void qqLogin() {
    //传入参数APPID和全局Context上下文
    if (mTencent == null) {
        mTencent = Tencent.createInstance(APP_ID,mContext);
    }
    mIUiListener = new BaseUiListener(mTencent, mActivity, mContext);
    //all表示获取所有权限
    mTencent.login(mActivity,"all", mIUiListener);
}

/**
 * 分享到QQ好友
 *
 */
@JavascriptInterface
public void qqShareFriends() {
    if (mTencent == null) {
        mTencent = Tencent.createInstance(APP_ID,mContext);
    }
    Bundle params = new Bundle();
    params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
    params.putString(QQShare.SHARE_TO_QQ_TITLE, "标题");
    params.putString(QQShare.SHARE_TO_QQ_SUMMARY,"摘要");
    params.putString(QQShare.SHARE_TO_QQ_TARGET_URL,"http://blog.csdn.net/u013451048");
    params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL,"http://avatar.csdn.net/C/3/D/1_u013451048.jpg");
    params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "CSDN");
    mTencent.shareToQQ(mActivity, params, new ShareListener(mActivity));
}

/**
 * 分享到QQ空间
 *
 */
@JavascriptInterface
public void qqShareQzone() {
    Bundle params = new Bundle();
    if (mTencent == null) {
        mTencent = Tencent.createInstance(APP_ID,mContext);
    }
    params.putInt(QQShare.SHARE_TO_QQ_EXT_INT,  QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);
    params.putString(QQShare.SHARE_TO_QQ_TITLE, "标题");
    params.putString(QQShare.SHARE_TO_QQ_SUMMARY,"摘要");
    params.putString(QQShare.SHARE_TO_QQ_TARGET_URL,"https://mp.csdn.net/postedit/79887607");
    params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL,"http://avatar.csdn.net/C/3/D/1_u013451048.jpg");
    params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "CSDN");
    mTencent.shareToQQ(mActivity, params, new ShareListener(mActivity));
}

六、在唤起QQ登录之后,需要一个回调类BaseUiListener来返回用户信息和检测用户是否登录成功

package com.iwiteks.PalmarTourism.util;

import android.app.Activity;
import android.content.Context;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;

import com.google.gson.Gson;
import com.tencent.connect.UserInfo;
import com.tencent.connect.auth.QQToken;
import com.tencent.tauth.IUiListener;
import com.tencent.tauth.Tencent;
import com.tencent.tauth.UiError;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;

/**
 * QQ登录监听类
 * Created by zhaoyi on 2018/3/20.
 */

public class BaseUiListener implements IUiListener {
    private static final String TAG = "BaseUiListener";
    private Tencent mTencent;
    private UserInfo mUserInfo;
    private Context mContext;
    private Activity mActivity;

    public BaseUiListener (Tencent mTencent, Activity mActivity, Context mContext) {
        this.mContext = mContext;
        this.mActivity = mActivity;
        this.mTencent = mTencent;
    }
    @Override
    public void onComplete(Object response) {
        Toast.makeText(mActivity, "授权成功", Toast.LENGTH_SHORT).show();
        JSONObject obj = (JSONObject) response;
        try {
            String openID = obj.getString("openid");
            String accessToken = obj.getString("access_token");
            String expires = obj.getString("expires_in");
            mTencent.setOpenId(openID);
            mTencent.setAccessToken(accessToken,expires);
            QQToken qqToken = mTencent.getQQToken();
            mUserInfo = new UserInfo(mContext,qqToken);
            mUserInfo.getUserInfo(new IUiListener() {
                @Override
                public void onComplete(Object response) {
                    Log.e(TAG,"登录成功"+ response.toString());
                    Message message = new Message();
                    message.what = JavaScriptUtils.QQ_LOGIN;
                    Gson gson = new Gson();
                    HashMap<String,String> resultMap =  gson.fromJson(response.toString(), HashMap.class);
                    resultMap.put("openid",openID);
                    message.obj = resultMap;
                    JavaScriptUtils.mHandler.sendMessage(message);
                }

                @Override
                public void onError(UiError uiError) {
                    Log.e(TAG,"登录失败"+ uiError.toString());
                }

                @Override
                public void onCancel() {
                    Log.e(TAG,"登录取消");
                }
            });
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onError(UiError uiError) {
        Toast.makeText(mActivity, "授权失败", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onCancel() {
        Toast.makeText(mActivity, "授权取消", Toast.LENGTH_SHORT).show();
    }

}

上面用的到handle会传递到JavascriptUtils工具类里面进行处理,如下

// 消息接受handle,android调用js
public static Handler mHandler = new Handler() {
    public void handleMessage(Message msg) {
        String method = "";
        if (msg.what == QQ_LOGIN) {//语音合成播放完成
            HashMap<String,String> result = (HashMap<String, String>) msg.obj;
            Gson gson = new Gson();
            method = "javascript:_Native_QqLogin('"+gson.toJson(result)+"')";
        }
        mWebView.evaluateJavascript(method, new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String value) {
                //此处为 js 返回的结果
            }
        });
    }
};

这里是android调用js方法传递数据给H5端了

七、在MainActivity的重写方法onActivityResult()里面加入如下代码,不然回调不了是否登录成功,取消等操作

/**
 * QQ分享监听
 */
if (requestCode == 10103) {
    ShareListener myListener = new ShareListener(MainActivity.this);
    Tencent.onActivityResultData(requestCode,resultCode,data,myListener);
}

/**
 * QQ登录监听
 */
if(requestCode == Constants.REQUEST_LOGIN){
    Tencent.onActivityResultData(requestCode,resultCode,data,JavaScriptUtils.mIUiListener);
}
到此,QQ登录与分享集成完成,我的QQ分享参数是死的,可以动态换成参数进行动态传递



猜你喜欢

转载自blog.csdn.net/u013144287/article/details/79887607
今日推荐