1. 程式人生 > >unity3d+androidstudio:接微信官方分享sdk

unity3d+androidstudio:接微信官方分享sdk

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.如果測試微信調不起來,清除微信快取,即可,因為上次的錯誤資訊儲存了