unity接入原生微信(导出jar包到unity)
第一次寫博客 有寫的不對不好的地方 請包涵
1.首先準備安卓工程
先創建一個安卓的空工程
開始寫代碼了
首先了解一下 微信登陸的流程
1.先向微信注冊
2.喚起微信登陸界面
3.授權獲取code
到這一步已經可以了 可以將code發給服務器去獲取用戶信息在返回給客戶端,或者客戶端自己去獲取 才有下面的步驟
4.通過code獲取token信息
5.通過token獲取用戶信息
接下來我的項目結構是這樣的把有關微信登陸的操作寫在WechatTool里面 分享有關的寫在ShareUtil里面
WechatTool
package com.xxx.xxx.wechat;
import android.content.Context;
import com.xxx.xxx.constant.Constants;
import com.tencent.mm.opensdk.modelmsg.SendAuth;
import com.tencent.mm.opensdk.modelpay.PayReq;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
public class WechatTool {
public static IWXAPI api = null;
}
public static boolean IsWechatInstalled () {return api.isWXAppInstalled(); }//public static boolean IsWechatAppSupportAPI() {//return api.isWXAppSupportAPI(); //}// 登錄微信 public static void LoginWechat(String state) {// 發送授權登錄信息,來獲取codeSendAuth.Req req = new SendAuth.Req();// 設置應用的作用域,獲取個人信息req.scope = "snsapi_userinfo";req.state = state;api.sendReq(req); } }上面的constant是微信開放平臺申請的appID 及appScrect常量
一定要建一個wxapi的文件夾 里面放入這個類 并且繼承IWXAPIEventHandler,因為這是微信請求的回調
package com.xxx.xxx.wxapi;
import com.xxx.xxxx.constant.Constants;
import com.xxx.xxx.network.NetworkUtil;
import com.xxx.xxxx.util.HandlerUtil;
import com.tencent.mm.opensdk.constants.ConstantsAPI;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.modelmsg.SendAuth;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import com.unity3d.player.*;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private static String TAG = “WXEntryActivity”;
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (api == null) {
api = WXAPIFactory.createWXAPI(this, Constants.APP_ID, false);
api.handleIntent(getIntent(), this);
}
}
}
這時如上面所示 獲取到code假如不需要客戶端直接獲取玩家信息 則可以直接返回到unity端然后再發給服務器,假如需要客戶端去直接獲取 則需要調用networkUtil去通過code獲取玩家信息以下是networkutil類 這個也是從微信sdkdemo中拷出來的
package com.xxx.xxx.network;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import com.unity3d.player.UnityPlayer;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import javax.net.ssl.HttpsURLConnection;
public class NetworkUtil
{
}
networkutil發送請求后有一個回調函數 去處理結果碼
handlerutil類
package com.xxx.xxxx.util;
import android.os.Handler;
import com.xxx.xxx.network.NetworkUtil;
public class HandlerUtil extends Handler {
private static HandlerUtil instance;
private MyHandler handler = MyHandler.getInstance();
public static HandlerUtil getInstance() {
if (instance == null) {
synchronized (HandlerUtil.class) {
if (instance == null) {
instance = new HandlerUtil();
}
}
}
return instance;
}
}
MyHandle類
package com.xxx.xxxx.util;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import com.xxx.xxx.network.NetworkUtil;
import com.unity3d.player.UnityPlayer;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.UnsupportedEncodingException;
public class MyHandler extends Handler {
private static MyHandler instance;
public static MyHandler getInstance() {
if (instance == null) {
synchronized (MyHandler.class) {
if (instance == null) {
instance = new MyHandler();
}
}
}
return instance;
}
private static String TAG = “MyHandler”;
private static String refreshToken;
private static String openId;
private static String accessToken;
private static String scope;
}
util類
package com.xxx.xxxx.util;
import com.xxx.xxx.constant.Constants;
public class Util {
public static String GetTokenUrl(final String code) {String Url = String.format("https://api.weixin.qq.com/sns/oauth2/access_token?" +"appid=%s&secret=%s&code=%s&grant_type=authorization_code", Constants.APP_ID,Constants.APP_SECRET, code);return Url; }public static String GetUserInfoUrl(final String accessToken,final String openId) {String Url = String.format("https://api.weixin.qq.com/sns/userinfo?" +"access_token=%s&openid=%s", accessToken, openId);return Url; }public static String GetRefreshTokenUrl(final String refreshToken) {String Url = String.format("https://api.weixin.qq.com/sns/oauth2/refresh_token?" +"appid=%s&grant_type=refresh_token&refresh_token=%s", Constants.APP_ID, refreshToken);return Url; }public static String GetCheckTokenUrl(final String accessToken,final String openId) {String Url = String.format("https://api.weixin.qq.com/sns/auth?" +"access_token=%s&openid=%s", accessToken, openId);return Url; }public static String GetUserInfo(final String nickname,final String sex,final String province,final String city,final String country,final String headimgurl) {return "WeChatUserInfo{" +", nickname='" + nickname + '\'' +", sex=" + sex +", city='" + city + '\'' +", province='" + province + '\'' +", country='" + country + '\'' +", headimgurl='" + headimgurl +'}'; }public static String getcode (String str) {String[] encodelist ={"GB2312","ISO-8859-1","UTF-8","GBK","Big5","UTF-16LE","Shift_JIS","EUC-JP"};for(int i =0;i<encodelist.length;i++){try {if (str.equals(new String(str.getBytes(encodelist[i]),encodelist[i]))) {return encodelist[i];}} catch (Exception e) {} finally{}} return ""; }}
至此 微信登陸的流程差不多結束了 但安卓的工程還需要做一些改變
上面說了 是導出jar包給unity使用所以需要這個操作,當然要
最后還需要一個入口必須繼承UnityPlayerActivity 這個是unity跟安卓的入口,當然還需要配置文件
package com.xxx.xxx;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Looper;
import com.tencent.gcloud.voice.GCloudVoiceEngine;
import com.unity3d.player.UnityPlayerActivity;
public class Tool extends UnityPlayerActivity{
public static int _power = 0;
public static ClipboardManager clipboard = null;
public static Activity activity=null;
}
<?xml version="1.0" encoding="utf-8"?>
配置好主入口及回調
這個時候 只需要導出jar包了點擊右上側的Gradle按鈕 出現這個
點擊assemble生成jar包,最后jar包生成在這個文件夾下
到此 安卓這邊工程已完結 接下來是unity端的事了
首先建立一個ThirdPartySdkManager,這個負責第三方sdk的管理,是一個單例類
const string wechatToolPackageName = “com.xxx.xxx.wechat.WechatTool”;
const string toolPackageName = “com.xxx.xxx.Tool”;
public static ThirdPartySdkManager Instance
{
get
{
if (instance == null)
{
GameObject go = new GameObject();
instance = go.AddComponent();
go.name = instance.GetType().ToString();
#if UNITY_EDITOR
#elif UNITY_ANDROID
AndroidJavaClass unityPlayer = new AndroidJavaClass(“com.unity3d.player.UnityPlayer”);
instance.currentActivity = unityPlayer.GetStatic(“currentActivity”);
instance.tool = new AndroidJavaClass(toolPackageName);
#endif
instance.RegisterAppWechat();
}
return instance;
}
}
在實例化時就已經向微信注冊,當然保證只能注冊一次,只需要微信登陸即可
public void WechatLogin()
{
#if UNITY_EDITOR
#elif UNITY_ANDROID
AndroidJavaClass loginC = new AndroidJavaClass(wechatToolPackageName);
loginC.CallStatic(“LoginWechat”, “app_wechat”);//后期改為隨機數加session來校驗
#elif UNITY_IPHONE
OpenWechat_iOS(“app_wechat”);
#endif
}
我這里是客戶端獲取用戶信息的 所以返回的直接是玩家信息
將安卓工程下的libs文件夾拷貝到unity端的Plugins/Android/下,將AndroidManifest也拷到文件夾下,將導出的jar包也考入此文件夾,填入keystore,注意 包名一定要與微信開放平臺的一致 好拉 打包測試
總結
以上是生活随笔為你收集整理的unity接入原生微信(导出jar包到unity)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 寿命预测子系统详细设计
- 下一篇: VB的计划任务的问题