Xamarin.Android使用ZBar库扫描条码实现

首先要安装Xariman.Android。然后从https://github.com/yiyuanlu/zbar下载相应的zbar.jar和动态库文件。

首先需要使用Xariman.AndroidJava Bindings Library功能,将zbar.jar变成.net调用的DLL文件。需要将zbar.jar的生成操作修改为EmbeddedJar。在转换过程中可能会发生错误:

错误         29     Net.Sourceforge.Zbar.SymbolIterator”不实现接口成员“Java.Util.IIterator.Next()”。“Net.Sourceforge.Zbar.SymbolIterator.Next()”无法实现“Java.Util.IIterator.Next()”,因为它没有匹配的返回类型“Java.Lang.Object”。  

没有关系,直接修改转换后的.cs文件。将返回类型由Net.Sourceforge.Zbar.Symbol改变成Java.Lang.Object。编译就能通过了。

其次,创建一个Android Application。引用刚才生成的Binding Library生成的DLL文件。创建一个目录Libs,下面包含armeabiarmeabi-v7aX86(目前X86不支持so文件的引用),将其中的.so文件的生成操作修改为AndroidNativeLibrary类型(否则在加载动态库时会出错)。

然后参照ZBar官方的Example,将其中的Java代码修改为C#代码。

在代码转换过程中,需要注意的是CameraTestActivity中定义的autoFocusCBpreviewCbbeepListenerJava中可以通过new Interface的方式直接实例。但在C#中不能这样做。所以需要让CameraTestActivity实现MediaPlayer.IOnCompletionListener, Camera.IPreviewCallback, Camera.IAutoFocusCallback三个接口。在OnCreate中将三个变量设置为this就可以了。如:this.autoFocusCB = this;

还有是doAutoFocusJava中是线程,在C#中使用Action

OnPreviewFrame中,Java对结果直接Foreach,但C#中不行。需要如下实现:

Java.Util.IIterator syms = scanner.Results.Iterator();

while (syms.HasNext)

                {

                    Symbol sym = syms.Next().JavaCast();

                    if (sym != null)

                    {

                        Intent intent = new Intent();                                  

                                                        intent.PutExtra("Code", sym.Data);

                        this.SetResult(Result.Ok, intent);

                    }

                    this.Finish();

                }

其中红色的类型转换很重要。

详细的工程参照附件。
Xamarin.Android使用ZBar库扫描条码实现ZBarNet.rar

上一篇:AndroidStudio 插件 之 Findbugs 安装与简单使用教程


下一篇:Application Factories:应用工厂