android QQ登录与分享 野性酷女 2022-05-27 03:29 474阅读 0赞 **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了][http_wiki.open.qq.com_wiki_mobile_SDK_E4_B8_8B_E8_BD_BD_3.3.1] 三、将下载下来的包里面的open\_sdk\_r5990\_lite.jar包放入工程的libs目录下,如图 ![20180410210240474][] 三、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分享参数是死的,可以动态换成参数进行动态传递 [http_wiki.open.qq.com_wiki_mobile_SDK_E4_B8_8B_E8_BD_BD_3.3.1]: http://wiki.open.qq.com/wiki/mobile/SDK%E4%B8%8B%E8%BD%BD [20180410210240474]: /images/20220527/b381d2ce78ab407583fd108a1f695cf1.png
还没有评论,来说两句吧...