趁着失业了,闲着没事儿学习了下 Xamarin.Android binding,在以往的开发中,我相信很多人都遇到过 binding 的坑,也不例外,
我也踩了很多雷,好在认识了个大佬,指导了很多 !
在做这个工作前,我上网搜索了一下关于 binding 的文章,也有,但是比较少,而且文章都是一两年前,很多 SDK 都更新了很多代了,
按照他们之前的一些做法就会有问题。
我尝试绑定了微信 SDK、支付宝 SDK、百度地图 SDK,在大神帮助下,一步一步绑定成功了。
而且我相信这几个 SDK 在开发中用到的概率也还是很大的,所以特此分享下绑定遇到的坑,也为了更好的记录自己遇到的问题。
话不多说,直接上代码。
1. 准备工作: 下载百度 android 开发包,毕竟工欲善其事必先利其器,地址:
2. 开发环境,这里就不讲解开发环境搭建了。我这儿的环境的是 VS2017+win10,后续的两个绑定都是如此。
3.Binding:
有了前面的百度地图绑定示例,后面的两个绑定基本都类似了,无非就是修修改改编译不过的问题。
SDK 下载地址:
微信 SDK 下载地址:
还是按照之前的操作,将 jar 文件复制到 Jars 文件夹里,设置编译属性为 EmbeddedJar
这里呢说一下博主在绑定过程中 遇到的坑:
一开始编译的时候,提示名称重复,我心想 so easy,这难道不我啊,毕竟有两个绑定的经验了,然后就再 Metadata.xml 添加了如下两句代码:
- <attr path="/api/package[@name='com.tencent.mm.opensdk.modelbase']/class[@name='BaseResp']/field[@name='errCode']"
- name="managedName">
- errCode
- </attr>
- <attr path="/api/package[@name='com.tencent.mm.opensdk.modelmsg']/class[@name='WXMediaMessage']/field[@name='mediaObject']"
- name="managedName">
- mediaObject
- </attr>
而且也如预期一样编译成功了,心想这不是多难啊。然后就想照着这个 这样写个支付 Demo,写着写着,准备用到 PayReq 这个类的时候,结果发现如何引用都找不到它,这就尴尬了。
我反编译看了下微信 SDK 源码,
我发现是有这个类的,但是为什么绑定没有呢? 我又在绑定项目工程下的目录去查看了生成的类文件,结果也没有叫做 PayReq 的类
What ? 这咋办呢,然后看了下警告信息,发现是这个类不能正确映射,然后就缺失了,但是这咋办呢?翻了一下午的 Xamarin 论坛,又全是英文,也没有找到什么有效的解决办法,But 我最前面说认识了个大佬啊,不懂就请教啊。
大佬告诉我你这错误原因可能是 JDK 版本 设置的过高的原因,让我改成 JDK1.7,目标编译框架设置成 6.0 试试
大佬就是大佬,一针见血的找到问题,剩下的就是两个小问题,重命名就搞定了,到此编译成功!
- <attr path="/api/package[@name='com.tencent.mm.opensdk.modelbase']/class[@name='BaseResp']/field[@name='errCode']"
- name="managedName">
- errCode
- </attr>
- <attr path="/api/package[@name='com.tencent.mm.opensdk.modelmsg']/class[@name='WXMediaMessage']/field[@name='mediaObject']"
- name="managedName">
- mediaObject
- </attr>
但是又遇到一个奇葩问题,在实例化 PayReq 对象时,VS 还是找不到这个类,我用 ILSpay 看了生成的类,是有这个的 !
But 并不能影响什么,因为还是可以编译成功!!!
而且如果我将编译好的 dll 文件单独放到 安卓工程里面去引用的话,编译是没有问题的,这个时候 VS 也能知道这个类,在对象浏览器中也能看到这个类,我试过将两个工程里面的 obj、bin 目录下的文件都删除,然后重新编译,结果还是这个问题,直接引用这个 binding 工程找不到 PayReq 这个类,但是却能编译成功。不知道是不是 VS17 的一个 Bug,如果那位园友遇到过这个问题,也可以留言说一下。
微信支付后回调 Activity 代码:
- using System;
- using Android.App;
- using Android.Content;
- using Android.OS;
- using Com.Tencent.MM.Opensdk.Modelbase;
- using Com.Tencent.MM.Opensdk.Openapi;
- using Android.Util;
- using Android.Widget;
- using Com.Tencent.MM.Opensdk.Constants;
- namespace XamarinWeiXinDemo
- {
- /// <summary>
- /// 微信支付回调Activity
- /// </summary>
- public class WXPayEntryActivity : Activity, IWXAPIEventHandler
- {
- private IWXAPI api;
- public void onCreate(Bundle savedInstanceState)
- {
- base.OnCreate(savedInstanceState);
- //SetContentView(R.layout.pay_result);
- //布局是可以自定义
- api = WXAPIFactory.CreateWXAPI(this, "App_ID");
- api.HandleIntent(Intent, this);
- }
- protected override void OnNewIntent(Intent intent)
- {
- base.OnNewIntent(intent);
- Intent = intent;
- api.HandleIntent(intent, this);
- }
- public void OnReq(BaseReq p0)
- {
- }
- public void OnResp(BaseResp p0)
- {
- Log.Debug("微信支付回调", "onPayFinish, errCode = " + p0.errCode);
- if (p0.Type == ConstantsAPI.CommandPayByWx)
- {
- //0 成功 展示成功页面
- //-1 错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
- //-2 用户取消 无需处理。发生场景:用户不支付了,点击取消,返回APP。
- if (p0.errCode == 0)
- {
- //支付成功逻辑
- Toast.MakeText(this, "支付成功", ToastLength.Long).Show();
- }
- else
- {
- //支付失败
- Toast.MakeText(this, "支付失败", ToastLength.Long).Show();
- }
- Finish();
- }
- }
- }
- }
三个绑定 demo 都已经传至 GitHub
百度地图:
微信:
支付宝:
如果觉得对你有帮助,请帮我点个赞, 你的推荐是我学习的动力。
来源: http://www.cnblogs.com/CallMeUncle/p/6562440.html