Unity 接入微信sdk安卓篇

接入环境

本次使用unity5.3.0,使用AndroidStudio 2.1 ,微信Sdk Android_SDK_3.1.1
参考链接:
雨松大大的教程http://www.xuanyusong.com/archives/667
http://blog.csdn.net/crazy1235/article/details/46733221

Untiy端做的准备

unity调用java方法一共有四种形式,分别是:

没有返回值的普通方法
AndroidJavaObject jo = new AndroidJavaObject("android.content.res.Configuration");
jo.Call("setToDefaults");

带有返回值的普通方法
AndroidJavaObject jo = new AndroidJavaObject("java.lang.String", "some string");
int hash = jo.Call<int>("hashCode");

没有返回值的静态方法
AndroidJavaObject jo = new AndroidJavaObject("android.os.Binder");
jo.CallStatic("flushPendingCommands");

带有返回值的静态方法
AndroidJavaObject jo = new AndroidJavaObject("java.lang.String");
string valueString = jo.CallStatic<string>("valueOf", 42.0);

我用的方法如下,第一个是获取java的类,参数就是类的路径(我的类名:Interface)。第二个方法就是调用类的静态方法,第一个参数是方法名,第二个参数的需要传递的参数,自己定义吧。

AndroidJavaObject jo = new AndroidJavaObject("com.sdk.my.Interface");
jo.CallStatic("InterFaceUnity","msg");

在unity端需要调用的接口的地方定义好方法,然后在Building Settings中导出Google Android Project,Export导出。

Android端做的准备

打开AndroidStudio导入刚才从unity导出的Android工程。
在AndroidStudio开始界面,或者在已打开的工程中选择File new 中选择
等待导入完成。导入完成之后在把下载的微信jar包导入到AndroidStudio中,首先拷贝到libs目录下,然后右击该文件选择addAsLibrary。
下面的函数是unity调用的静态函数,通过函数传来的参数可以去判断需要调起什么函数。

public class Interface {
    static public void InterFaceUnity(String msg)
    {
        Log.i("sv111",msg);
//        WeChatController.GetInstance().SendToWei("111");
//        WeChatController.GetInstance().ShareLinkUrl();
          WeChatController.GetInstance().WeChatLogin();
    }
}

新建一个WeChatController类

public class WeChatController {
    static private IWXAPI api; 
    private static WeChatController _instance;

    private  WeChatController(){};
    public static WeChatController GetInstance(){
        if(_instance == null)
        {
            _instance = new WeChatController();
        }
        return _instance;
    }
    //此方法在应用程序启动时需要调用把APP_ID注册到微信中 可以在主Activity中的OnCreate()中调用此函数。
    public void RegToWx(Context context){ 
        api = WXAPIFactory.createWXAPI(context,Constants.APP_ID);
        api.registerApp(Constants.APP_ID);
    }
    //分享文字
    public void SendToWei(String name) {
        WXTextObject textObj = new WXTextObject();
        textObj.text = "textObj.text";
        // 用WXTextObject对象初始化一个WXMediaMessage对象
        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = textObj;
        // 发送文本类型的消息时,title字段不起作用
        // msg.title = "Will be ignored";
        msg.description = "msg.description";
        // 构造一个Req
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = "sharetext"; // transaction字段用于唯一标识一个请求
        req.message = msg;
        req.scene = true ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession;
        // 调用api接口发送数据到微信
        api.sendReq(req);
    }
    public void ShareLinkUrl() {
        WXWebpageObject webpage = new WXWebpageObject();
        webpage.webpageUrl = "http://www.baidu.com";
        //用WXMebpageObject 对象初始化一个WXMediaMessage对象,填写标题,描述
        WXMediaMessage msg = new WXMediaMessage(webpage);
        msg.title = "百度大法好";
        msg.description = "网页描述:我是饭太黏";  //描述只在发送给朋友时显示,发送到朋友圈不显示

        //链接图片
        Resources re = UnityPlayerActivity._instance.getResources();  //通过一个活动的Activity  (UnityPlayerActivity._instance)提换为可用的Activity
        Bitmap thumb = BitmapFactory.decodeResource(re,R.drawable.app_icon); //图片小于32k,如果drawable下没有图片可以把图片的代码注释掉;
        msg.thumbData = Util.bmpToByteArray(thumb, true);

        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = "shareurl";
        req.message = msg;
        req.scene = true ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession;
        api.sendReq(req);
    }
    public void WeChatLogin()
    {
        Log.i("sv111", "WeChatLogin"+R.drawable.app_icon);
        SendAuth.Req req = new SendAuth.Req();
        req.transaction = "Login";
        req.scope = "snsapi_userinfo";   // 应用授权作用域,如获取用户个人信息则填写snsapi_userinfo
        req.state = "wechat_sdk_demo_test";
        api.sendReq(req);
    }
}

新建一个Util类,此类是直接从微信Demo中直接拷贝过来的,分享链接会用到 具体我也不是很懂。可以直接从demo中拷贝。在此不再贴出来了。
新建一个Constants类,此类中存放一些id之类的信息。

public class Constants {
    public static final String APP_ID = "写自己的Id"; //从微信申请的id
    public static class ShowMsgActivity {
        public static final String STitle = "showmsg_title";
        public static final String SMessage = "showmsg_message";
        public static final String BAThumbData = "showmsg_thumb_data";
    }
}

微信回调函数,在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activityb. 实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法,在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法,例如

public class WXEntryActivity extends Activity implements IWXAPIEventHandler{

    private static final int TIMELINE_SUPPORTED_VERSION = 0x21020001;

    private IWXAPI api;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
      //  setContentView(R.layout.entry);
        Log.i("sv111","onCreate");
        api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);

        api.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        Log.i("sv111","onNewIntent");
        super.onNewIntent(intent);

        setIntent(intent);
        api.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq req) {
        Log.i("sv111","onReq");
        switch (req.getType()) {
            case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
                goToGetMsg();
                break;
            case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
                goToShowMsg((ShowMessageFromWX.Req) req);
                break;
            default:
                break;
        }
    }

    @Override
    //请求微信后的回调
    public void onResp(BaseResp resp) {
        Log.i("sv111","onresp");
        int result = 0;
        String str = "";
        int type = 0;
        if(resp.transaction.equals("sharetext") )  //通过唯一标示去识别
        {
            str = "分享文字";
            type = 1;
        }else if (resp.transaction.equals("shareurl") )
        {
            str = "分享链接";
            type = 2;
        }else if (resp.transaction.equals("Login") )
        {
            str = "登陆";
            type = 3;
        }
        switch (resp.errCode) {
            case BaseResp.ErrCode.ERR_OK:  //正确返回
                str += "成功";
                if (type == 3)
                {
                    OnRespAuth((SendAuth.Resp)resp);  //强转为SendAuth.Resp对象
                }
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL: //用户取消
                str += "取消";
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED: //认证否决  (用户拒绝授权)
                str += "失败";
                break;
            case BaseResp.ErrCode.ERR_SENT_FAILED: //发送失败
                str += "发送失败";
                break;
            default:
                str += "未知错误";
                break;
        }

        Toast.makeText(this, str, Toast.LENGTH_LONG).show();
        finish();///
    }

    public void OnRespAuth(SendAuth.Resp resp)
    {
        Log.i("sv111","OnRespAuth");
        Log.i("sv111",resp.code);
        Log.i("sv111",resp.url);
    }
}
也可以拿微信demo里的WXEntryActivity类进行修改。

至此应该就可以调用起微信sdk了 ,有什么问题可以留言共同讨论。
注意:安卓平台需要签名,包名和申请的id必须一致才能调起微信,否侧调不起来。

你可能感兴趣的:(Unity接-sdk)