unity3d+androidstudio:接微信官方分享sdk
阿新 • • 發佈:2018-12-19
AndroidStudio:
匯入unity與微信的兩個jar包
MyWxShare類
package com.luoyikun.mywxshare; import android.app.Activity; import android.app.Fragment; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import com.tencent.mm.opensdk.modelmsg.SendMessageToWX; import com.tencent.mm.opensdk.modelmsg.WXMediaMessage; import com.tencent.mm.opensdk.modelmsg.WXTextObject; import com.tencent.mm.opensdk.modelmsg.WXWebpageObject; import com.tencent.mm.opensdk.openapi.IWXAPI; import com.tencent.mm.opensdk.openapi.WXAPIFactory; import com.unity3d.player.UnityPlayer; public class MyWxShare extends Fragment { String m_gameObjectName; String m_funcName; private Context unityContext; private Activity unityActivity; private static final String TAG = "MyWxShare"; public static final String APP_ID ="你的appid"; public IWXAPI api; public void regToWx() { api = WXAPIFactory.createWXAPI(unityContext,APP_ID,true); api.registerApp(APP_ID); } public void UnityFunc(String gameObjectName, String funcName) { m_gameObjectName = gameObjectName; m_funcName = funcName; } private static MyWxShare Instance = null; public static MyWxShare GetInstanceByAndroid(Activity activity,Context context) { if (Instance == null) { Instance = new MyWxShare(); Instance.unityActivity = activity; Instance.unityContext = context; activity.getFragmentManager().beginTransaction().add(Instance, TAG).commit(); } return Instance; } public static MyWxShare GetInstance() { if(Instance == null) { Instance = new MyWxShare(); Instance.unityActivity = UnityPlayer.currentActivity; Instance.unityContext = Instance.unityActivity.getBaseContext(); UnityPlayer.currentActivity.getFragmentManager().beginTransaction().add(Instance, TAG).commit(); } return Instance; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); // 這一句很重要,儲存對該Fragment的引用,防止在旋轉螢幕等操作時時丟失引用(Fragment隸屬於Activity) regToWx(); } // 呼叫 Unity // gameObjectName 為接受訊息的Unity 中 GameObject 的名字 // functionName 為接受訊息的GameObject 掛載 C# 指令碼中的函式名 // _content 為傳送給Unity 的內容 public void CallUnity( String _content) { UnityPlayer.UnitySendMessage(m_gameObjectName, m_funcName, _content); } private String buildTransaction(final String type) { return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis(); } public void shareText(String text,int wxShareType) { WXTextObject textObj = new WXTextObject(); textObj.text = text; WXMediaMessage msg = new WXMediaMessage(); msg.mediaObject =textObj; msg.description = text; SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("text"); req.message = msg; req.scene = wxShareType; api.sendReq(req); } public void shareWebpage(String shareUrl, String title, String desc,String image,int shareType) { WXWebpageObject webPage = new WXWebpageObject(); webPage.webpageUrl = shareUrl; WXMediaMessage msg = new WXMediaMessage(webPage); msg.title = title; msg.description = desc; //圖片載入是使用的ImageLoader.loadImageSync() 同步方法 //並且還要建立圖片的縮圖,因為微信限制了圖片的大小 /* Bitmap thumbBmp = Bitmap.createScaledBitmap(ImageLoaderUtil.getBitmap(image), 200, 200, true); msg.setThumbImage(thumbBmp); thumbBmp.recycle();*/ SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("webpage"); req.message = msg; //好友 req.scene = shareType; // 呼叫api介面傳送資料到微信 api.sendReq(req); } }
WXEntryActivity類:微信返回通知的活動
package 你的app包名.wxapi; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.Toast; import com.luoyikun.mywxshare.MyWxShare; import com.tencent.mm.opensdk.modelbase.BaseReq; import com.tencent.mm.opensdk.modelbase.BaseResp; 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.UnityPlayer; public class WXEntryActivity extends Activity implements IWXAPIEventHandler { private IWXAPI api; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); api = WXAPIFactory.createWXAPI(this, MyWxShare.APP_ID); //把接受到的Intent給wxapi這個物件,它會解析回撥結果,通過我們實現的IWXAPIEventHandler介面回撥給我們 api.handleIntent(getIntent(), this); } protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); api.handleIntent(intent, this); } @Override public void onReq(BaseReq req) { } //這裡是核心:也就是微信支付結果會通知這個回撥函式 在回撥裡我們通過UnityPlayer.UnitySendMessage通知Unity客戶端支付結果 @Override public void onResp(BaseResp resp) { //resp就是回撥所帶的引數 微信->安卓層->Unity (resp) switch (resp.errCode) { case BaseResp.ErrCode.ERR_OK: //分享成功 Toast.makeText(this, "分享成功", Toast.LENGTH_SHORT).show(); break; case BaseResp.ErrCode.ERR_USER_CANCEL: //分享取消 Toast.makeText(this, "分享取消", Toast.LENGTH_SHORT).show(); break; case BaseResp.ErrCode.ERR_AUTH_DENIED: //分享拒絕 Toast.makeText(this, "分享拒絕", Toast.LENGTH_SHORT).show(); break; } //Toast.makeText(this, retCode, Toast.LENGTH_SHORT).show(); //通過這個方法 通知Unity層的某個物體上的某個方法 retCode就是呼叫Unity方法時候傳遞的引數 //UnityPlayer.UnitySendMessage("Cube","GetWxRsp", retCode); finish(); } }
AndroidManifest檔案修改
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.luoyikun.mywxshare" > <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.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:allowBackup="true"> //回撥建立的Activity 如果還有其它 就在下面加入 <activity android:name="你的包名.wxapi.WXEntryActivity" android:exported="true" android:launchMode="singleTop"/> </application> </manifest>
Grade修改
apply plugin: 'com.android.library'
android {
compileSdkVersion 28
defaultConfig {
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation files('libs/libammsdk.jar')
//implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
implementation files('libs/classes.jar')
}
Unity端:
包簽名
然後用打出的apk用官方簽名apk得到簽名在後臺生成 AppId
C#呼叫
public static void WxShareText(string text,EnWxShareType type)
{
AndroidJavaObject pluginObject = new AndroidJavaClass("com.luoyikun.mywxshare.MyWxShare").CallStatic<AndroidJavaObject>("GetInstance");
pluginObject.Call("shareText", text,(int)type);
}
public static void WxShareWebpage(string url,string title,string descr,string img, EnWxShareType type = EnWxShareType.WXSceneSession)
{
AndroidJavaObject pluginObject = new AndroidJavaClass("com.luoyikun.mywxshare.MyWxShare").CallStatic<AndroidJavaObject>("GetInstance");
pluginObject.Call("shareWebpage", url,title,descr,img, (int)type);
}
特別注意
1.得到的簽名在微信後臺一定要填對,不然返回-6 2.如果測試微信調不起來,清除微信快取,即可,因為上次的錯誤資訊儲存了