日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

unity接入原生微信(导出jar包到unity)

發(fā)布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 unity接入原生微信(导出jar包到unity) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第一次寫博客 有寫的不對不好的地方 請包涵

1.首先準(zhǔn)備安卓工程
先創(chuàng)建一個安卓的空工程

開始寫代碼了
首先了解一下 微信登陸的流程
1.先向微信注冊
2.喚起微信登陸界面
3.授權(quán)獲取code
到這一步已經(jīng)可以了 可以將code發(fā)給服務(wù)器去獲取用戶信息在返回給客戶端,或者客戶端自己去獲取 才有下面的步驟
4.通過code獲取token信息
5.通過token獲取用戶信息
接下來我的項目結(jié)構(gòu)是這樣的把有關(guān)微信登陸的操作寫在WechatTool里面 分享有關(guān)的寫在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 void RegisterToWechat (Context context) {if(api == null) {api = WXAPIFactory.createWXAPI(context, Constants.APP_ID);api.registerApp(Constants.APP_ID);}

}

public static boolean IsWechatInstalled () {return api.isWXAppInstalled(); }//public static boolean IsWechatAppSupportAPI() {//return api.isWXAppSupportAPI(); //}// 登錄微信 public static void LoginWechat(String state) {// 發(fā)送授權(quán)登錄信息,來獲取codeSendAuth.Req req = new SendAuth.Req();// 設(shè)置應(yīng)用的作用域,獲取個人信息req.scope = "snsapi_userinfo";req.state = state;api.sendReq(req); } }

上面的constant是微信開放平臺申請的appID 及appScrect常量

一定要建一個wxapi的文件夾 里面放入這個類 并且繼承IWXAPIEventHandler,因為這是微信請求的回調(diào)
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);
}
}

@Override protected void onNewIntent(Intent intent) {super.onNewIntent(intent);setIntent(intent);api.handleIntent(intent, this); }// 微信發(fā)送請求到第三方應(yīng)用時,會回調(diào)到該方法 @Override public void onReq(BaseReq req) { }// 第三方應(yīng)用發(fā)送到微信的請求處理后的響應(yīng)結(jié)果,會回調(diào)到該方法 @Override public void onResp(BaseResp resp) {if (resp.getType() == ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX){//微信分享switch (resp.errCode) {case BaseResp.ErrCode.ERR_OK:UnityPlayer.UnitySendMessage("ThirdPartySdkManager", "ShareCallBack", "true");break;default:UnityPlayer.UnitySendMessage("ThirdPartySdkManager", "ShareCallBack", "falses");break;}finish();}else if (resp.getType() == ConstantsAPI.COMMAND_SENDAUTH){//微信登陸SendAuth.Resp authResp = (SendAuth.Resp)resp;final String code = authResp.code;HandlerUtil.getInstance().GetTokenMsg(code,NetworkUtil.GET_TOKEN);finish();} }

}
這時如上面所示 獲取到code假如不需要客戶端直接獲取玩家信息 則可以直接返回到unity端然后再發(fā)給服務(wù)器,假如需要客戶端去直接獲取 則需要調(diào)用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
{

private static String TAG = "NetworkUtil";public static final int GET_TOKEN = 1; public static final int CHECK_TOKEN = 2; public static final int REFRESH_TOKEN = 3; public static final int GET_INFO = 4;public static void sendWxAPI(Handler handler, String url, int msgTag) {HttpsThread httpsThread = new HttpsThread(handler, url, msgTag);httpsThread.start(); }static class HttpsThread extends Thread {private Handler handler;private String httpsUrl;private int msgTag;public HttpsThread(Handler handler, String url, int msgTag) {this.handler = handler;this.httpsUrl = url;this.msgTag = msgTag;}@Overridepublic void run() {int resCode;InputStream in;String httpResult = null;try {URL url = new URL(httpsUrl);URLConnection urlConnection = url.openConnection();HttpsURLConnection httpsConn = (HttpsURLConnection) urlConnection;httpsConn.setAllowUserInteraction(false);httpsConn.setInstanceFollowRedirects(true);httpsConn.setRequestMethod("GET");httpsConn.connect();resCode = httpsConn.getResponseCode();if (resCode == HttpURLConnection.HTTP_OK) {in = httpsConn.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(in, "iso-8859-1"), 8);StringBuilder sb = new StringBuilder();String line;while ((line = reader.readLine()) != null) {sb.append(line).append("\n");}in.close();httpResult = sb.toString();Log.i(TAG, httpResult);Message msg = Message.obtain();msg.what = msgTag;Bundle data = new Bundle();data.putString("result", httpResult);msg.setData(data);handler.sendMessage(msg);}} catch (Exception e) {Log.e(TAG, e.getMessage());}} }

}

networkutil發(fā)送請求后有一個回調(diào)函數(shù) 去處理結(jié)果碼
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;
}

public void GetTokenMsg(String code,int param){NetworkUtil.sendWxAPI(handler, Util.GetTokenUrl(code), param); }public void GetUserInfoMsg(String accessToken,String openId,int param){NetworkUtil.sendWxAPI(handler, Util.GetUserInfoUrl(accessToken,openId), param); }public void GetRefreshTokenMsg(String refreshToken,int param){NetworkUtil.sendWxAPI(handler, Util.GetRefreshTokenUrl(refreshToken), param); }public void GetCheckTokenMsg(String accessToken,String openId,int param){NetworkUtil.sendWxAPI(handler, Util.GetCheckTokenUrl(accessToken,openId), param); }

}
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;

@Override public void handleMessage(Message msg) {int tag = msg.what;Bundle data = msg.getData();JSONObject json = null;switch (tag) {case NetworkUtil.GET_TOKEN: {try {json = new JSONObject(data.getString("result"));openId = json.getString("openid");accessToken = json.getString("access_token");refreshToken = json.getString("refresh_token");scope = json.getString("scope");HandlerUtil.getInstance().GetCheckTokenMsg(accessToken,openId,NetworkUtil.CHECK_TOKEN);} catch (JSONException e) {Log.e(TAG, e.getMessage());UnityPlayer.UnitySendMessage("ThirdPartySdkManager", "LoginCallBack", e.getMessage());}}case NetworkUtil.CHECK_TOKEN: {try {json = new JSONObject(data.getString("result"));int errcode = json.getInt("errcode");if (errcode == 0) {HandlerUtil.getInstance().GetUserInfoMsg(accessToken,openId,NetworkUtil.GET_INFO);//NetworkUtil.sendWxAPI(this, Util.GetUserInfoUrl(accessToken,openId), NetworkUtil.GET_INFO);} else {//NetworkUtil.sendWxAPI(this, Util.GetRefreshTokenUrl(refreshToken),NetworkUtil.REFRESH_TOKEN);HandlerUtil.getInstance().GetRefreshTokenMsg(refreshToken,NetworkUtil.REFRESH_TOKEN);}} catch (JSONException e) {Log.e(TAG, e.getMessage());}break;}case NetworkUtil.REFRESH_TOKEN: {try {json = new JSONObject(data.getString("result"));openId = json.getString("openid");accessToken = json.getString("access_token");refreshToken = json.getString("refresh_token");scope = json.getString("scope");HandlerUtil.getInstance().GetUserInfoMsg(accessToken,openId,NetworkUtil.GET_INFO);//NetworkUtil.sendWxAPI(this, Util.GetUserInfoUrl(accessToken,openId), NetworkUtil.GET_INFO);} catch (JSONException e) {Log.e(TAG, e.getMessage());}break;}case NetworkUtil.GET_INFO: {try {json = new JSONObject(data.getString("result"));final String nickname, sex, province, city, country, headimgurl;headimgurl = json.getString("headimgurl");String encode;encode = Util.getcode(json.getString("nickname"));nickname = "nickname: " + new String(json.getString("nickname").getBytes(encode), "utf-8");sex = "sex: " + json.getString("sex");province = "province: " + json.getString("province");city = "city: " + json.getString("city");country = "country: " + json.getString("country");String userInfo = Util.GetUserInfo(nickname,sex,province,city,country,headimgurl);UnityPlayer.UnitySendMessage("ThirdPartySdkManager", "LoginCallBack", userInfo);} catch (JSONException e) {Log.e(TAG, e.getMessage());} catch (UnsupportedEncodingException e) {Log.e(TAG, e.getMessage());}break;}} }

}
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 ""; }

}
至此 微信登陸的流程差不多結(jié)束了 但安卓的工程還需要做一些改變

上面說了 是導(dǎo)出jar包給unity使用所以需要這個操作,當(dāng)然要

最后還需要一個入口必須繼承UnityPlayerActivity 這個是unity跟安卓的入口,當(dāng)然還需要配置文件
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;

@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 注冊語音//GCloudVoiceEngine.getInstance().init(getApplicationContext(),this);//注冊電量獲取監(jiān)聽器//registerReceiver(batteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));activity = Tool.this; }//獲得電量 public static int GetBattery() {return _power; }public static void CopyTextToClipboard(final Context activity, final String str) throws Exception {if (Looper.myLooper() == null){Looper.prepare();}clipboard = (ClipboardManager) activity.getSystemService(Activity.CLIPBOARD_SERVICE);ClipData textCd = ClipData.newPlainText("data", str);clipboard.setPrimaryClip(textCd); }//創(chuàng)建電池信息接收器 private BroadcastReceiver batteryReceiver = new BroadcastReceiver(){@Overridepublic void onReceive(Context context, Intent intent) {int level = intent.getIntExtra("level", 0);//取得電池剩余容量int scale = intent.getIntExtra("scale", 100);//取得電池總?cè)萘縚power = (level * 100) / scale;} };@Override //界面銷毀時,注銷監(jiān)聽器 protected void onDestroy() {super.onDestroy();unregisterReceiver(batteryReceiver); }

}

<?xml version="1.0" encoding="utf-8"?>


<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><applicationandroid:allowBackup="true"><activity android:name="com.xxx.xxx.Tool"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><meta-data android:name="unityplayer.UnityActivity" android:value="true" /></activity><activityandroid:name="com.xxx.xxx.wxapi.WXEntryActivity"android:exported="true"android:launchMode="singleTop"/>

配置好主入口及回調(diào)
這個時候 只需要導(dǎo)出jar包了點擊右上側(cè)的Gradle按鈕 出現(xiàn)這個
點擊assemble生成jar包,最后jar包生成在這個文件夾下

到此 安卓這邊工程已完結(jié) 接下來是unity端的事了
首先建立一個ThirdPartySdkManager,這個負責(zé)第三方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;
}
}
在實例化時就已經(jīng)向微信注冊,當(dāng)然保證只能注冊一次,只需要微信登陸即可
public void WechatLogin()
{
#if UNITY_EDITOR
#elif UNITY_ANDROID
AndroidJavaClass loginC = new AndroidJavaClass(wechatToolPackageName);
loginC.CallStatic(“LoginWechat”, “app_wechat”);//后期改為隨機數(shù)加session來校驗
#elif UNITY_IPHONE
OpenWechat_iOS(“app_wechat”);
#endif
}

/// <summary> 微信登錄回調(diào) </summary> /// <param name="code">授權(quán)成功后拿到的code</param> public void LoginCallBack(string code) {Debug.LogError("登錄返回的數(shù)據(jù)" + code);if (!string.IsNullOrEmpty(code)){//向服務(wù)器發(fā)送登錄請求CallBack?.Invoke(code);}elseDebug.LogError("登錄失敗,請重試" + code); }

我這里是客戶端獲取用戶信息的 所以返回的直接是玩家信息
將安卓工程下的libs文件夾拷貝到unity端的Plugins/Android/下,將AndroidManifest也拷到文件夾下,將導(dǎo)出的jar包也考入此文件夾,填入keystore,注意 包名一定要與微信開放平臺的一致 好拉 打包測試

總結(jié)

以上是生活随笔為你收集整理的unity接入原生微信(导出jar包到unity)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。