QQ登录SDK接入
?
?
本文是原生安卓SDK接入,對安卓不是很熟悉的話,可以考慮ShareSDK,直接封裝好的登錄分享SDK,無需在安卓層面架接,只需要在Unity里面調用相應接口即可。
1.打開騰訊開放平臺
找到接入指南。
下載移動游戲的sdk
2.申請個人APP_ID.需要手持身份證 拍照認證,有點煩。
3.下載的SDK包 解壓如下
有開發者文檔,以及相應的jar包。
4.創建Android工程,將Unity中的Jar包 拷入到安卓工程app-->libs下。
Unity的jar的位置 在之前 unity 與安卓交互基礎中 有提到,將下載的sdk 包中的libs 下面的
也一起放到安卓工程下面的libs里面,還有以下兩個文件夾。
搞好之后的libs 如下:
然后設置jar依賴。
同時在unity里面 Plugins 文件夾下面 如下:
5.開始寫Java 代碼:
因為我們要導出jar包,所以先將app-buildgradle文件 修改一下:
這樣就可以導出jar文件。
修改MainActivity 類,繼承 UnityPlayerActivity。
新建一個GameHelp 類,和TencentQQ類。在onCreate函數初始化
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);GameHelper.Init(this);TencentQQ.Init(this);}?TencentQQ類:負責QQ登陸的主要邏輯,對外開放一些接口。
public class TencentQQ {private static Tencent m_Tencent;private static Activity m_MainActivity;public static String TAG="TencentQQ";//個人申請的App_IDprivate static String APP_ID="Your APP_ID";private static BaseUiListener m_LoginCallBack=new BaseUiListener();//初始化public static void Init(Activity activity){Log.d(TAG, "TencentQQ Init");m_Tencent=Tencent.createInstance(APP_ID,activity.getApplicationContext());m_MainActivity=activity;}//登錄函數public static void Login(){Log.d(TAG, "QQLogin");m_Tencent.login(m_MainActivity,"all",m_LoginCallBack);}// 注銷登錄public static void LogOut(){Log.d(TAG, "QQLogOut");m_Tencent.logout(m_MainActivity);}//檢測授權是否過期public static boolean CheckAutoVaild(){return m_Tencent.checkSessionValid(APP_ID);}//刷新票據public static JSONObject RefreshSession(){JSONObject jsonObject=m_Tencent.loadSession(APP_ID);if (jsonObject==null){Login();}else{m_Tencent.initSessionCache(jsonObject);}Log.d(TAG, "RefreshSession"+jsonObject.toString());return SetSelfData(jsonObject);}//登陸成功回調public static void LoginCallBack(final JSONObject jsonObject){Log.d(TAG, "LoginCallBack: "+jsonObject.toString());//http請求 只能運行在主線程(獲取Unionid)new Thread(new Runnable(){@Overridepublic void run(){initOpenidAndToken(jsonObject);JSONObject data=SetSelfData(jsonObject);//傳輸數據GameHelper.SendPlatformMessageToUnity(GameHelper.PLATFORM_MSG_QQLOGINCALLBACK,0,0,0,data.toString(),"","");}}).start();}//格式化成自己需要的數據public static JSONObject SetSelfData(JSONObject data){JSONObject jsonObject=new JSONObject();try{String token=data.getString(Constants.PARAM_ACCESS_TOKEN);String expires=jsonObject.getString(Constants.PARAM_EXPIRES_IN);String openId=jsonObject.getString(Constants.PARAM_OPEN_ID);String paytoken=data.getString("pay_token");String pf=data.getString("pf");String pfkey=data.getString("pfkey");String expirestime=data.getString(Constants.PARAM_EXPIRES_TIME);String unionid=getUnionid(token);jsonObject.put("openid",openId);jsonObject.put("token",token);jsonObject.put("unionid",unionid);jsonObject.put("refreshtoken","");jsonObject.put("expires",expires);jsonObject.put("paytoken",paytoken);jsonObject.put("pf",pf);jsonObject.put("pfkey",pfkey);jsonObject.put("expirestime",expirestime);}catch (Exception e){Log.e(TAG, "SetSelfData:設置統一QQ票據失敗!");}return jsonObject;}//產生openid 和 Tokenpublic static void initOpenidAndToken(JSONObject jsonObject){try{String token=jsonObject.getString(Constants.PARAM_ACCESS_TOKEN);String expires=jsonObject.getString(Constants.PARAM_EXPIRES_IN);String openId=jsonObject.getString(Constants.PARAM_OPEN_ID);if (!TextUtils.isEmpty(token)&&!TextUtils.isEmpty(expires)&&!TextUtils.isEmpty(openId)){m_Tencent.setAccessToken(token,expires);m_Tencent.setOpenId(openId);}}catch (Exception e){}}//獲取unionidpublic static String getUnionid(String token){String unionid="";try{URL url=new URL("https://graph.qq.com/oauth2.0/me?access_token="+token+"&unionid=1");HttpURLConnection connection=(HttpURLConnection)url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(5000);connection.setReadTimeout(5000);int code=connection.getResponseCode();if(code==HttpURLConnection.HTTP_OK){InputStream is =connection.getInputStream();byte[] data=readStream(is);String json=new String(data);json=json.replace("(","").replace(")","").replace("callback","");JSONObject jsonObject=new JSONObject(json);unionid=jsonObject.getString("unionid");}}catch (Exception e){Log.e(TAG, "getUnionid: 獲取unionid錯誤:"+e.toString() );}return unionid;}//處理低端機上因內存緊張導致無回調public static void onActivityResult(int requestCode, int resultCode, Intent data){if (requestCode==Constants.REQUEST_API){if(resultCode==Constants.REQUEST_LOGIN){m_Tencent.handleResultData(data,m_LoginCallBack);}m_Tencent.onActivityResultData(requestCode,resultCode,data,m_LoginCallBack);}}實現回調:
所有的SDK接口調用,都會傳入一個回調,用以接收SDK返回的調用結果。
(1) 實現回調 IUiListener
調用SDK已經封裝好的接口時,例如:登錄、快速支付登錄、應用分享、應用邀請等接口,需傳入該回調的實例。
public class BaseUiListener implements IUiListener {@Overridepublic void onComplete(Object o){if (o==null){return;}JSONObject jsonObject=(JSONObject)o;//回調成功,但沒有數據if (jsonObject!=null&&jsonObject.length()==0){return;}Log.d(TencentQQ.TAG, "onComplete: 登陸成功!");TencentQQ.LoginCallBack(jsonObject);}@Overridepublic void onError(UiError uiError){Log.d(TencentQQ.TAG, "onComplete: 登陸失敗!");GameHelper.SendPlatformMessageToUnity(GameHelper.PLATFORM_MSG_QQLOGIN,1,0,0,"","","");}@Overridepublic void onCancel(){Log.d(TencentQQ.TAG, "onComplete: 取消登陸!");GameHelper.SendPlatformMessageToUnity(GameHelper.PLATFORM_MSG_QQLOGIN,2,0,0,"","","");}應用調用Andriod_SDK接口時,如果要成功接收到回調,需要在調用接口的Activity的onActivityResult方法中增加如下代碼:
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data){super.onActivityResult(requestCode,resultCode,data);TencentQQ.onActivityResult(requestCode,resultCode,data);}GameHelper類,主要用于 和Unity之間相互調用傳遞數據
public class GameHelper {private static MainActivity m_Activity=null;private static String m_PlatformObject="PlatformObject";private static String m_MethodName="OnMessage";public static String TAG="GameHelper";//QQ登錄回調public final static int PLATFORM_MSG_QQLOGINCALLBACK=1;//QQ登錄public final static int PLATFORM_MSG_QQLOGIN=1;//QQ注銷public final static int PLATFORM_MSG_QQLOGOUT=2;//初始化方法public static void Init(MainActivity activity){m_Activity=activity;}//androis端發送消息到unitypublic static void SendPlatformMessageToUnity(int iMsgId,int iParam1,int iParam2,int iParam3,String strParam1,String strParam2,String strParam3){String jsonString=GetJsonStr(iMsgId, iParam1, iParam2,iParam3, strParam1, strParam2, strParam3);UnityPlayer.UnitySendMessage(m_PlatformObject, m_MethodName, jsonString);}public static void SendUnityMessageToPlatform(int iMsgId,int iParam1,int iParam2,int iParam3,int iParam4,String strParam1,String strParam2,String strParam3,String strParam4){Log.d(TAG, "SendUnityMessageToPlatform: iMsgId"+iMsgId+"iParam1"+iParam1+"iParam2"+iParam2+"iParam3"+iParam3+"iParam4"+iParam4+"strParam1"+strParam1+"strParam2"+strParam2+"strParam3"+strParam3+"strParam4"+strParam4);if (m_Activity==null){Log.e(TAG, "m_Activity is null: ");}switch (iMsgId){case PLATFORM_MSG_QQLOGIN:TencentQQ.Login();break;case PLATFORM_MSG_QQLOGOUT:TencentQQ.LogOut();break;case PLATFORM_MSG_WXLOGIN:TencentWX.Login();break;case PLATFORM_MSG_WXLOGOUT:TencentWX.LogOut();break;}}//從Android獲取Str類型public static String GetStringFromPlatform(int type){switch (type){case 1://QQ授權是否過期return String.valueOf(TencentQQ.CheckAutoVaild());case 2://刷新QQ票據return TencentQQ.RefreshSession().toString();case 3://WX授權是否過期return String.valueOf(TencentWX.CheckAutorVaild());case 4://刷新WX票據return TencentWX.RefreshSession().toString();}return "";}//通過json對象構造字符串public static String GetJsonStr(int iMsgId,int iParam1,int iParam2,int iParam3,String strParam1,String strParam2,String strParam3){try{JSONObject object =new JSONObject();object.put("iMsgId", iMsgId);object.put("iPararm1", iParam1);object.put("iPararm2", iParam2);object.put("iPararm3", iParam3);object.put("strPararm1", strParam1);object.put("strPararm2", strParam2);object.put("strPararm3", strParam3);return object.toString();}catch(JSONException e){Log.e(TAG, "Json Error: "+e.toString() );return "";}}之后就可以導出Jar包,放入Unity下Android文件夾下,注意導出的時候,刪掉Jar包中導入的Unity 的Jar,不然后面打包可能會報錯。
配置AndroidManifest文件:
添加 <meta-data android:name="unityplayer.UnityActivity"??? android:value="true"/>,并且去掉 application 中的一些屬性,僅留下 android:label="@string/app_name"?
在應用的AndroidManifest.xml增加配置的<application>節點下增加以下配置(注:不配置將會導致無法調用API)
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />?
新增activity
<activity android:name="com.tencent.tauth.AuthActivity" android:noHistory="true" android:launchMode="singleTask" ><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="Your APP_ID" /></intent-filter></activity>還有文檔中沒有寫到
<activityandroid:name="com.tencent.connect.common.AssistActivity"android:screenOrientation="behind"android:theme="@android:style/Theme.Translucent.NoTitleBar"android:configChanges="orientation|keyboardHidden"></activity>通過以上步驟,工程就已經配置完成了。我們就可以在Unity工程中 去調用GameHelper中的接口了。
我這邊 打包的時候 因為 有QQ 和WX 登錄 的jar,打包時報錯
仔細看錯誤信息,會發現 存在不止一個BuildConfig 文件,將 導出的jar包 用解壓軟件 打開(不是解壓),
刪掉那個文件,再次打包就沒有報錯了。APP_ID 換成自己的。微信的接入,按照文檔,手法都是差不多的。
?
?
?
總結
- 上一篇: 20、生鲜电商平台-优惠券设计与架构
- 下一篇: GEE面向对象分类(先分割影像 、再计算