前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >unity3d+androidstudio:接微信官方分享sdk

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

作者头像
立羽
发布2023-08-24 14:40:12
发布2023-08-24 14:40:12
20700
代码可运行
举报
文章被收录于专栏:Unity3d程序开发Unity3d程序开发
运行总次数:0
代码可运行

AndroidStudio:

导入unity与微信的两个jar包

MyWxShare类

代码语言:javascript
代码运行次数:0
复制
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类:微信返回通知的活动

代码语言:javascript
代码运行次数:0
复制
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文件修改

代码语言:javascript
代码运行次数:0
复制
<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修改

代码语言:javascript
代码运行次数:0
复制
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#调用

代码语言:javascript
代码运行次数:0
复制
    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.如果测试微信调不起来,清除微信缓存,即可,因为上次的错误信息保存了

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-11-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • AndroidStudio:
  • 导入unity与微信的两个jar包
  • MyWxShare类
  • WXEntryActivity类:微信返回通知的活动
  • AndroidManifest文件修改
  • Grade修改
  • Unity端:
  • 包签名
  • C#调用
  • 特别注意
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档