HTML5技术

C#开发移动应用系列(3.使用照相机扫描二维码+各种基础知识) - GuZhenYin

字号+ 作者:H5之家 来源:H5之家 2017-06-24 17:01 我要评论( )

前言 上篇文章地址: C#开发移动应用系列(1.环境搭建) C#开发移动应用系列(2.使用WebView搭建WebApp应用) 今天我们来讲一下如何使用Camera来调用照相机扫描二维码. (Tips:大神别问我为什么不用Camera2,饭要一口口吃..慢慢来.....................其实是我还没

前言

上篇文章地址:

C#开发移动应用系列(1.环境搭建)

C#开发移动应用系列(2.使用WebView搭建WebApp应用)

今天我们来讲一下如何使用Camera来调用照相机扫描二维码.

(Tips:大神别问我为什么不用Camera2,饭要一口口吃..慢慢来.....................其实是我还没看懂..)

确定一下本篇的学习目标:

1.学会如何调用Camera来实现照相机预览

2.学会如何跳转Activity并传值

3.学会如何识别相机预览中的二维码,并读取

效果图:

 

 

 

正文

1.学会如何调用Camera来实现照相机预览

   我们先来看看如何使用Camera来实现照相机预览..

   我们首先新建一个Activity,...嗯..暂且命名为SaoYiSaoActivity (不是骚..是扫..)

   在Resources\layout 创建对应的界面,SaoYiSao.axml

   在SaoYiSaoActivity的OnCreate中加载这个页面,代码如下:

   

OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.SaoYiSao); }

在SaoYiSao.axml中拖入控件SurfaceView,这里的SurfaceView是用来展示预览画面的..(具体的SurfaceView作用自行百度..或者等我下篇..)

同样,我们把它铺满全屏,如图:

下面我们开始写代码...

因为我们要调用照相机和监控SurfaceView.所以我们的SaoYiSaoActivity 需要继承一些东西,代码如下:

public class SaoYiSaoActivity : Activity,Android.Hardware.Camera.IPreviewCallback,ISurfaceHolderCallback

需要继承Android.Hardware.Camera.IPreviewCallback来获取照相机的预览回调

需要继承ISurfaceHolderCallback来获取SurfaceView发生在表面的事件和变化

我们实现这两个接口,会得到如下几个方法

OnPreviewFrame(),来自于Android.Hardware.Camera.IPreviewCallback

SurfaceChanged()

SurfaceCreated()

SurfaceDestroyed()

我们一个一个来实现,

不过在此之前,先回到OnCreate()方法中,初始化一下我们的SurfaceView

编写代码如下:

OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.SaoYiSao); surface = FindViewById<SurfaceView>(Resource.Id.surfaceView1); holder = surface.Holder; //设置线程回调为本类 holder.AddCallback(this); //表明该Surface不包含原生数据 holder.SetType(Android.Views.SurfaceType.PushBuffers); //设置这个Surface的大小 holder.SetFixedSize(300, 200); }

解释都在注释里了..我就不多说了..

下面开始实现刚才的接口..

首先来实现 SurfaceCreated(),代码如下(注:这里是重点):

SurfaceCreated(ISurfaceHolder holder) 2 { 3 camera = Android.Hardware.Camera.Open(); 4 Android.Hardware.Camera.Parameters p = camera.GetParameters(); 5 p.PictureFormat = ImageFormatType.Jpeg; 6 camera.SetParameters(p); 7 camera.SetPreviewCallback(this); 8 camera.SetPreviewDisplay(holder); 9 camera.StartPreview(); }

讲一下这些代码做了什么,首先很明显..打开照相机.第二句,获取照相机的参数,设置图片类型为Jpeg.重新把参数赋值给照相机.

设置照相机的预览回调为自身类,设置照相机显示为SurfaceView的线程

最后,开始预览.

 

然后我们实现SurfaceDestroyed(),这里是当Surface被销毁之前调用的方法,代码如下(注:也很重要):

public void SurfaceDestroyed(ISurfaceHolder holder) { //删除回调 holder.RemoveCallback(this); //删除照相机回调 camera.SetPreviewCallback(null); //停止照相机预览 camera.StopPreview(); //释放照相机 camera.Release(); camera = null; }

一定要写这些,不然照相机会一直处于占用状态..然后GG..

实现上面两个方法.其实我们就可以调用照相机预览了...

OnPreviewFrame()这个方法,我们暂时先不实现 放个空的.打个断点

运行,我们会发现.OnPreviewFrame()这个方法会被不停的调用.

里面有两个参数

 

public void OnPreviewFrame(byte[] data, Android.Hardware.Camera camera)

很明显,这个字节类型的data就是每次照相机预览传回来的当前帧的图片信息.

camera当然就是照相机了..

所以我们就可以从这里一直获取预览的图片帧..(不要心急,慢慢来)

我们进入第二个知识点

2.学会如何跳转Activity并传值

我们知道,安卓的每一个界面转换都是由一个或者多个Activity实现的..

前面我们也单独写了一个SaoYiSaoActivity

那么我们该如何跳转过去呢..往下看..

我们在MainActivity添加一个Button,给他添加一个点击事件,代码如下:

 

btn2.Click += delegate { Intent intent = new Intent(this,typeof(SaoYiSaoActivity)); intent.AddFlags(ActivityFlags.SingleTop); StartActivityForResult(intent, 1); };

用SaoYiSaoActivity类型申明一个Intent ,

然后添加Activity启动模式,为SingleTop.

因为我们要获取SaoYiSaoActivity传递回来的参数,所以我们采用StartActivityForResult来跳转.

第一个参数当然就是要跳转的Intent ,第二个是获取返回值用的Code编号(注意:要大于0)

这样我们就实现了跳到SaoYiSaoActivity..

那么如何获取SaoYiSaoActivity给的返回值呢?.

我们重写Activity的OnActivityResult方法,如下:

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 高德地图和canvas画图结合应用的一些感想(一) - sky2008wj

    高德地图和canvas画图结合应用的一些感想(一) - sky2008wj

    2017-06-24 14:04

  • .NET 开发环境搭建 - Alan_beijing

    .NET 开发环境搭建 - Alan_beijing

    2017-06-20 11:01

  • 微信公众平台网页开发实战--3.利用JSSDK在网页中获取地理位置(HTML5+jQuery) - 一个自由的出版人

    微信公众平台网页开发实战--3.利用JSSDK在网页中获取地理位置(HTML5

    2017-06-20 10:00

  • 微信公众平台网页开发实战--2.从手机相册中选照片然后分享 - 一个自由的出版人

    微信公众平台网页开发实战--2.从手机相册中选照片然后分享 - 一个自

    2017-06-17 11:00

网友点评
t