Xamarin.Android 绑定友盟社会化分享组件

时间:2023-03-09 07:02:27
Xamarin.Android 绑定友盟社会化分享组件

Xamarin.Android 绑定友盟社会化分享组件

最近在开发博客园Android App的时候需要用到友盟社会化分享组件,在github上搜了一下都没有找到最新版本绑定好的项目,就自己动手来绑定一个最新版本的友盟社会化分享组件(文章发布时的最新版为v6.4.3)。

下载友盟Android版SDK

友盟社会化分享组件 v6.4.3

本文只使用到微信,QQ,新浪微博,故只下载了精简版

创建绑定项目

创建步骤如图所示:

Xamarin.Android 绑定友盟社会化分享组件

Xamarin.Android 绑定友盟社会化分享组件

添加友盟SDK的jar包到绑定项目的Jars文件夹下

添加下载的友盟SDK项目中main,platforms,shareboard,shareview文件夹中的jar包到绑定项目的Jars文件夹下,如图示:

Xamarin.Android 绑定友盟社会化分享组件

Xamarin.Android 绑定友盟社会化分享组件

修改所有jar包的属性EmbeddedJar,如图示:

Xamarin.Android 绑定友盟社会化分享组件

生成项目

全部修改好之后,生成项目,出现一大堆错误,先别急,看一下都有些什么错误。

Xamarin.Android 绑定友盟社会化分享组件

好了,双击第一个错误,打开后发现UMImageMark类竟然继承的是自己,这应该就是错误的源头了。

Xamarin.Android 绑定友盟社会化分享组件

然后我们把UMImageMark继承的类改为Java.Lang.Object试试,ok,错误消失了。

Xamarin.Android 绑定友盟社会化分享组件

但是这样改是没有用的,因为这已经是生成好的代码了,要改就只能在源头上更改了,怎么办呢? 打开Transforms文件夹下的Metadata.xml文件,在这里编写修改的代码就行了。

Xamarin.Android 绑定友盟社会化分享组件

但是怎么修改UMImageMark类的继承类呢?按下面的方式添加一行代码就搞定了。

<attr path="/api/package[@name='com.umeng.social.tool']/class[@name='UMImageMark']" name="extends">Java.Lang.Object</attr>

然后再生成一下,看有没有效果。

Xamarin.Android 绑定友盟社会化分享组件

上面的错误没有了,说明成功了。可是还是有好多错误。接下来看下一个错误。双击打开第一个错误,发现CancelEventArgs类是一个分布类再两个文件中存在,google一下发现是因为IUMShareListener接口和IUMAuthListener接口存在相同的方法,所以绑定的时候会生成相同的类。好了,知道了原因就好办了,只要把其中一个接口中的方法名字改一下就好了,代码如下:

<attr path="/api/package[@name='com.umeng.socialize']/interface[@name='UMAuthListener']/method[@name='onCancel']" name="managedName"> OnAuthCancel </attr>

<attr path="/api/package[@name='com.umeng.socialize']/interface[@name='UMAuthListener']/method[@name='onComplete']" name="managedName"> OnAuthComplete </attr>

<attr path="/api/package[@name='com.umeng.socialize']/interface[@name='UMAuthListener']/method[@name='onError']" name="managedName"> OnAuthError </attr>

<attr path="/api/package[@name='com.umeng.socialize']/interface[@name='UMAuthListener']/method[@name='onStart']" name="managedName"> OnAuthStart </attr>

重新生成一下。

Xamarin.Android 绑定友盟社会化分享组件

Good,成功了,只剩下3个错误了。

下一个错误一看就知道是因为修饰符的原因造成的,把继承类的这个方法修饰符protected改成public就可以了,代码:

<attr path="/api/package[@name='com.umeng.socialize.sina.params']/class[@name='BrowserRequestParamBase']/method[@name='onCreateRequestParamBundle' and count(parameter)=1 and parameter[1][@type='android.os.Bundle']]" name="visibility">public</attr>

重新生成一下。

Xamarin.Android 绑定友盟社会化分享组件

好了,还有2个错误。错误提示说“UMShareAPI.InitThread”不实现继承的抽象成员“QueuedWork.UMAsyncTask.DoInBackground()”,打开发现已经有了DoInBackground方法了,但是没有override关键字修饰。

Xamarin.Android 绑定友盟社会化分享组件

怎么办呢,只能新建一个UMShareAPI分布类来重写这个方法了。在Additions文件夹下新建一个UMShareAPI类,注意修改命名空间为Com.Umeng.Socialize,然后重写DoInBackground方法。由于原来已经有了一个叫DoInBackground的方法,所以需要把原来的方法名修改成DoInBackgrounds就搞定了,代码:

namespace Com.Umeng.Socialize { public partial class UMShareAPI { public partial class InitThread : global::Com.Umeng.Socialize.Common.QueuedWork.UMAsyncTask { protected override Java.Lang.Object DoInBackground() { return DoInBackgrounds(); } } } }

<attr path="/api/package[@name='com.umeng.socialize']/class[@name='UMShareAPI.InitThread']/method[@name='doInBackground' and count(parameter)=0]" name="name">DoInBackgrounds</attr>

保存后重新生成一下,搞定了。

Xamarin.Android 绑定友盟社会化分享组件

最后一个错误是类名和属性名冲突了,修改一下类名就行了。

<attr path="/api/package[@name='com.umeng.socialize.utils']/class[@name='Log']/field[@name='LOG']" name="name">Logs</attr>

重新生成。搞定。大功告成。

========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

最后

下载地址

Github

这个项目中是我在使用Xamarin.Android的时候自己用到的绑定库,包含了友盟统计,友盟社会化分享,讯飞版本自动更新。