当前位置:   article > 正文

android设备操作(十一)_setsurfacetexturelistener

setsurfacetexturelistener

介绍App开发常用的一些设备操作,主要包括如何使用摄像头进行拍照、如何使用麦克风进行录音并结合摄像头进行录像、如何播放录制好的音频和视频、如何使用常见传感器实现业务功能、如何使用定位功能获取位置信息、如何利用短距离通信技术实现物联网等。

一、 摄  像  头

1. 表面视图SurfaceView

     Android的绘图机制是由UI线程在屏幕上绘图,一般情况下不允许其他线程直接做绘图操作。

     但是该机制在处理复杂多变的页面时会产生问题,比如时刻变化着的游戏界面、拍照或录像时不断变换着的预览界面              就会导致UI线程资源堵塞,即界面卡死的状况。

     表面视图SurfaceView是Android用来解决子线程绘图的特殊视图,它拥有独立的绘图表面,因此表面视图的界面能够               在一个独立线程中进行绘制。

如何使用表面视图

        表面视图通过表面持有者SurfaceHolder完成绘图操作,调用SurfaceView对象的getHolder方法可获得SurfaceHolder                对象。 下面是SurfaceHolder的常用方法。 l

            ockCanvas:锁定并获取绘图表面的画布。

            unlockCanvasAndPost:解锁并刷新绘图表面的画布。

             addCallback:添加绘图表面的回调接口SurfaceHolder.Callback。

             removeCallback:移除绘图表面的回调接口。

              isCreating:判断绘图表面是否有效。

              getSurface:获取绘图表面的对象,即预览界面。

              setFixedSize:设置预览界面的尺寸。

表面视图开启多个线程的绘图效果

2.  使用Camera拍照

Camera类的常用方法:

           getNumberOfCameras:获取本设备的摄像头数目。

           open:打开摄像头,默认打开后置摄像头。

           setParameters:设置摄像头的拍照参数。具体参数通过下列方法设置。

           setPreviewSize:设置预览界面的尺寸。

           setPictureSize:设置保存图片的尺寸。

           setPictureFormat:设置图片格式。

           setFocusMode:设置对焦模式。

           setPreviewDisplay:设置预览界面的表面持有者。

           startPreview:开始预览。

           unlock:录像时需要对摄像头解锁,这样摄像头才能持续录像。

           setDisplayOrientation:设置预览的角度。

           autoFocus:设置对焦事件。

           takePicture:开始拍照,并设置拍照相关事件。

           setPreviewCallback:设置预览回调事件,通常在连拍时调用。

           stopPreview:停止预览。

            lock:录像完毕对摄像头加锁。

            release:释放摄像头。

使用Camera拍摄一张照片(单拍)

           以后置摄像头为例,需要注意以下几点:

         (1)若想持续对焦,则需调用setFocusMode方法设置对焦模式为FOCUS_MODE_CONTINUOUS_PICTURE,否                则照片可能会模糊。

         (2)Android的0度在三点钟的水平位置,而手机屏幕是垂直位置,从水平位置到垂直位置需要旋转90度。

         (3)调用takePicture完成拍照动作,该接口的第三个参数PictureCallback表示JPG图像的回调接口。

使用Camera拍摄多张照片(连拍)

          连续拍摄的原理是把预览画面上的图片依次保存下来,从而形成照片连拍的效果。

         实现连拍功能要先调用setPreviewCallback方法设置预览回调接口,然后实现回调接口中的onPreviewFrame方法,            在该方法中获得并保存每张预览照片。

Camera的拍照效果

3.  纹理视图TextureView

           表面视图不是通过onDraw方法和dispatchDraw方法进行绘图,所以无法使用View的基本视图方法。

           为了解决表面视图的不足之处,Android在4.0之后引入了纹理视图TextureView。

          与表面视图相比,纹理视图并没有创建一个单独的绘图表面用来绘制,可以像普通视图一样执行变换操作。

如何使用纹理视图

      面是TextureView的常用方法。

            lockCanvas:锁定并获取画布。

           unlockCanvasAndPost:解锁并刷新画布。

           setSurfaceTextureListener:设置表面纹理的监听器。

           isAvailable:判断表面纹理是否可用。

           getSurfaceTexture:获取表面纹理。

给纹理视图设置透明度的效果

4. 使用Camera 2拍照

camera 2支持以下5点新特性:

           (1)支持每秒30帧的全高清连拍。

           (2)支持在每帧之间使用不同的设置。

           (3)支持原生格式的图像输出。

           (4)支持零延迟快门和电影速拍。

           (5)支持相机在其他方面的手动控制,比如设置噪音消除的级别。

camera2的管理类及其用法(上)

          camera2在架构上做了大幅改造,原先的Camera类被拆分为多个管理类,主要有下面4个:

          1. 相机管理器CameraManager

                     相机管理器用于获取可用摄像头列表、打开摄像头等。其对象从系统服务CAMERA_SERVICE获取。 因为                                    camera2是Android5.0之后才有的新特性,不少手机还不能很好的支持,所以最好先检查相机的支持级别。

         2. 相机设备CameraDevice

                    相机设备用于创建拍照请求、添加预览界面、创建拍照会话等。

        3. 相机拍照会话CameraCaptureSession

                    相机拍照会话用于设置单拍会话(每次只拍一张照片)、连拍会话(自动连续拍摄多张照片)等。

        4. 图像读取器ImageReader

                    图像读取器用于获取并保存照片信息,一旦有图像数据生成,立刻触发onImageAvailable方法。

         这几个相机类之间大致的处理流转为:                                                       TextureView→SurfaceTextureListener→CameraManager→StateCallback→CameraDevice→CaptureRequest.Builder→CameraCaptureSession→ImageReader→OnImageAvailableListener→Bitmap。

camera2的拍照效果

5.  运行时动态授权管理

App涉及到硬件设备的操作,比如拍照、录音、定位、SD卡等等,都要在AndroidManifest.xml中声明相关的权限。

可是Android系统为了防止某些App滥用权限,又允许用户在系统设置里面对App禁用某些权限。

但这又带来另一个问题,用户打开App之后,App可能因为权限不足导致无法正常运行,甚至直接崩溃闪退。

有鉴于此,Android从6.0开始引入了运行时权限管理机制,允许App在运行过程中动态检查是否拥有某项权限,一旦发现           缺少某种必需的权限,则系统会自动弹出小窗提示用户去开启该权限。

动态授权的弹窗

二、 麦  克  风

介绍以麦克风为基础的声效应用,首先简要说明拖动条SeekBar的用法,描述如何使用拖动条调整各类音量大小;然后介绍媒体录制器MediaRecorder与媒体播放器MediaPlayer,并演示通过媒体录制器和媒体播放器完成录音和播音功能;最后演示通过媒体录制器和媒体播放器完成录像和放映功能。

1.  拖动条SeekBar

拖动条SeekBar继承自进度条ProcessBar,与进度条的不同之处在于:

      (1)进度条只能在代码中修改进度,不能由用户改变进度值;

       (2)拖动条不但可以在代码中修改进度,还可以由用户在屏幕上通过拖动操作改变进度。

        拖动条可用于音频和视频播放时的进度条,用户通过拖动操作控制播放器快进或快退到指定位置,然后从新位置开始播放。

如何使用拖动条

        下面是SeekBar新增加的4个方法。

                  setThumb:设置当前进度位置的图标。

                  setThumbOffset:设置当前进度图标的偏移量。

                  setKeyProgressIncrement:设置使用方向键更改进度时每次的增加值。

                  setOnSeekBarChangeListener:设置拖动变化事件。

下面是拖动条的展示效果。

2.  音量控制

Android有6类铃音,分别是通话音、系统音、铃音、媒体音、闹钟音、通知音,铃音类型的取值说明见下表。

如何使用音量管理器

          管理这些铃声音量的工具是AudioManager,其对象从系统服务AUDIO_SERVICE中获取。

          下面是AudioManager的常用方法。

                     getStreamMaxVolume:获取指定类型铃声的最大音量。

                     getStreamVolume:获取指定类型铃声的当前音量。

                     getRingerMode:获取指定类型铃声的响铃模式。

                     setStreamVolume:设置指定类型铃声的当前音量。

                     setRingerMode:设置指定类型铃声的响铃模式。

                     adjustStreamVolume:调整指定类型铃声的当前音量。

音量调整方向的取值说明

adjustStreamVolume方法的第二个参数是调整方向,音量调整方向的取值说明见下表。

3.  录音与播音

Android中没有单独操作麦克风的工具类,如果要录音就用媒体录制器MediaRecorder,如果要播音就用媒体播放器MediaPlayer。

1). 媒体录制器MediaRecorder

         MediaRecorder是Android自带的音频和视频录制工具,它通过操纵摄像头和麦克风完成媒体录制,既可录制视频,又可单独录制音频。

2). 媒体播放器MediaPlayer

          MediaPlayer是Android自带的音频和视频播放器,可用于播放MediaRecorder录制的媒体文件,加上MP3、WAV、MID、OGG等音频文件,以及MKV、MOV、AVI等视频文件。

如何使用媒体录制器(上)

下面是MediaRecorder的常用方法(录音与录像通用)。

              reset:重置录制资源。

              prepare:准备录制。

               start:开始录制。

                stop:结束录制。

                release:释放录制资源。

                 setOnErrorListener:设置错误监听器。

                 setOnInfoListener:设置信息监听器。

                setMaxDuration:设置可录制的最大时长,单位毫秒。

                 setMaxFileSize:设置可录制的最大文件大小,单位字节。

                 setOutputFile:设置输出文件的路径。

如何使用媒体录制器(下)

下面是MediaRecorder用于音频录制的方法(录像时要一起录音)。

                 setAudioSource:设置音频来源。

                 setOutputFormat:设置媒体输出格式。

                 setAudioEncoder:设置音频编码器。

                 setAudioSamplingRate:设置音频的采样率,单位千赫兹(kHz)。

                 setAudioChannels:设置音频的声道数。

                 setAudioEncodingBitRate:设置音频每秒录制的字节数。

如何使用媒体播放器(上)

   下面是MediaPlayer的常用方法(播音与放映通用)。

                   reset:重置播放器。

                   prepare:准备播放。

                   start:开始播放。

                   pause:暂停播放。

                    stop:停止播放。

                    setOnPreparedListener:设置准备播放监听器。

                    setOnCompletionListener:设置结束播放监听器。

                    setOnSeekCompleteListener:设置播放拖动监听器。

如何使用媒体播放器(下)

                   create:创建指定Uri的播放器。

                   setDataSource:设置播放数据来源的文件路径。

                   setVolume:设置音量。

                   setAudioStreamType:设置音频流的类型。

                   setLooping:设置是否循环播放。

                   isPlaying:判断是否正在播放。

                   seekTo:拖动播放进度到指定位置。

                   getCurrentPosition:获取当前播放进度所在的位置。

                   getDuration:获取播放时长,单位毫秒。

4.  录像与放映

              录制视频与录音一样都使用媒体录制器MediaRecorder。

             播放视频与播音一样都使用媒体播放器MediaPlayer。

             MediaRecorder和MediaPlayer处理音频与视频的大部分方法相同,不同的是录像与放映多出了对摄像头、表面视图以及视频进行编码和解码的操作。

          如何使用MediaRecorder录制视频

             下面是MediaRecorder录制视频的专用方法。

                        setCamera:设置相机对象。

                        setPreviewDisplay:设置预览界面。

                        setOrientationHint:设置预览的角度。

                        setVideoSource:设置视频来源。

                        setOutputFormat:设置媒体输出格式。

                        setVideoEncoder:设置视频编码器。

                        setVideoSize:设置视频的分辨率。

                        setVideoFrameRate:设置视频每秒录制的帧数。

                         setVideoEncodingBitRate:设置视频每秒录制的字节数。

如何使用MediaPlayer播放视频

               下面是MediaPlayer播放视频的专用方法。

                         setDisplay:设置播放界面,参数为SurfaceHolder类型。

                         setSurface:设置播放表层,参数可通过SurfaceHolder对象的getSurface方法获得。

                         setScreenOnWhilePlaying:设置是否使用SurfaceHolder显示,也就是是否保持屏幕高亮,从而持续播放视频。

                         setVideoScalingMode:设置视频的缩放模式。

                         setOnVideoSizeChangedListener:设置视频缩放监听器。

三、 传  感  器

本节介绍常见传感器的用法与相关应用场景,首先列举Android目前支持的传感器种类,然后对常用传感器分别进行说明,包括加速度传感器的用法和摇一摇的实现、磁场传感器的用法和指南针的实现,以及计步器、感光器、陀螺仪等其他传感器的基本用法

1.  传感器的种类

         传感器Sensor是一系列感应器的总称,是Android设备用来感知周围环境和运动信息的工具。

         因为具体的感应信息依赖于相关硬件,所以虽然Android定义了众多感应器,但是并非每部手机都能支持这么多感应器。

         传感器一般借助于硬件监听环境信息改变,有时会结合软件监听用户的运动信息。   

传感器的常见种类

2.  摇一摇——加速度传感器

加速度传感器是最常见的感应器,大部分智能手机都内置了加速度传感器。

加速度传感器运用最广泛的功能是微信的摇一摇,用户通过摇晃手机寻找周围的人。

摇一摇的实现步骤

 

3.  指南针——磁场传感器

获得加速度和磁场强度两个数值之后,再通过SensorManager的getRotationMatrix方法与getOrientation方法计算方向角度。

指南针的实现效果

4.  计步器、感光器和陀螺仪

         计步器的原理是通过手机的前后摆动模拟步伐节奏的监测。Android中与计步器有关的传感器有两个。

         (1)一个是步行检测(TYPE_STEP_DETECTOR) 步行检测的返回数值为1时,表示当前监测到一个步伐;

          (2)另一个是步行计数(TYPE_STEP_ COUNTER) 步行计数的返回数值是累加后的数值,表示本次开机激活后的总步           伐数。

感光器

       感光器也叫光线传感器,借助于前置摄像头的曝光,一旦遮住前置摄像头,传感器监测到的光线强度立马就会降低。 在实          际开发中,光线传感器往往用于感应手机正面的光线强弱,从而自动调节屏幕亮度

陀螺仪

       陀螺仪顾名思义是测量平衡的仪器,它的测量结果为当前与上次位置之间的倾斜角度,这个角度描述的是三维空间上的夹          角,因而其数值由x、y、z三个坐标轴上的角度偏移组成。

       由于陀螺仪具备三维角度的测量功能,因此它又被称作角速度传感器。

       前面介绍的加速度传感器只能检测线性距离的大小,而陀螺仪能够检测旋转角度的大小,所以利用陀螺仪可以还原三维物体      的转动行为。

四、  手机定位

本节介绍手机定位的手段与实现,首先阐述手机定位的工作原理,接着指出各类定位手段对应的手机功能开关;然后对定位的相关工具类进行详细说明,包括定位条件器Criteria、定位管理器LocationManager、定位监听器LocationListener;最后演示通过定位功能获取定位信息的用法。

1.  开启定位功能

手机定位又分为卫星定位和网络定位两大类。

         (1)卫星定位

                         卫星定位服务由几个全球卫星导航系统提供,主要包括美国GPS、俄罗斯格洛纳斯、中国北斗。

                          卫星定位的原理是根据多颗卫星与导航芯片的通信结果得到手机与卫星距离,然后计算手机当前所处的经度、                       纬度以及海拔高度。

                          使用卫星定位需开启手机上的GPS功能。

网络定位

             (2)网络定位。网络定位又分为基站定位与WIFI定位。

                           1)基站定位

                                       手机插上SIM卡后,SIM卡会搜索周围的基站信号并接入通信服务。SIM卡必然处于这些基站信号覆盖的                             重叠区域,根据基站位置就能得出该手机的大致方位。

                                        用基站定位需开启手机上的数据连接功能。

                           2)WIFI定位

                                        手机接入某个公共热点网络,比如首都机场的WIFI,提供WIFI热点的路由器有自身的MAC地址与电信                                宽带的网络IP,通过查询WIFI路由器的位置便可得知该手机的大致位置。

                                         使用WIFI定位需开启手机上的WLAN功能。

                                        无论是基站定位还是WIFI定位,都得通过位置服务提供商计算详细位置

手机定位的具体场景

2.  获取定位信息

           开启定位相关功能只是将定位的前提条件准备好,若想获得手机当前所处的位置信息,还要依靠下列的3种定位工具。

           1. 定位条件器Criteria 定位条件器用于设置定位的前提条件,比如精度、速度、海拔、方位等信息。

           2. 定位管理器LocationManager

                     定位管理器用于获取定位信息的提供者、设置监听器,并获取最近一次的位置信息。

           3. 定位监听器LocationListener

                     定位监听器用于监听定位信息的变化事件。

如何使用定位管理器

               定位管理器的对象从系统服务LOCATION_SERVICE获取,常用方法有以下。

                             getBestProvider:获取最佳的定位提供者。

                              isProviderEnabled:判断指定的定位提供者是否可用。

                              getLastKnownLocation:获取最近一次的定位地点。

                              requestLocationUpdates:设置定位监听器。

                              removeUpdates:移除定位监听器。

                              addGpsStatusListener:添加定位状态的监听器。

                              removeGpsStatusListener:移除定位状态的监听器。

卫星定位的实现效果

下面是个卫星定位的效果图,当前定位类型是卫星定位,定位结果是东经119度、北纬26度,海拔高度137米,定位精度13米。

五、  短距离通信

      本节介绍常见的几种短距离通信技术,首先描述了NFC与RFID两种标准的异同点,以及NFC近场通信在App开发中的运用;然后说明红外遥控和射频遥控各自的适用场景,以及如何利用红外信号遥控家用电器;最后阐述了普通蓝牙与低功耗蓝牙(BLE)的区别,以及两台蓝牙设备如何发现对方并进行配对。

1  NFC近场通信

NFC的全称是“Near Field Communication”,意思是近场通信、与邻近的区域通信。

 大众所熟知的NFC技术应用,主要是智能手机的刷卡支付功能。 NFC的历史可比智能手机要悠久得多,它脱胎于上世纪           的RFID无线射频识别技术。

 所谓RFID是“Radio Frequency Identification”的缩写,它通过无线电信号便可识别特定目标并读写数据,而无需自身与该           目标之间建立任何机械或者光学接触。像日常生活中的门禁卡、公交卡,乃至二代身份证,都是采用了RFID技术的卡片。

NFC相较RFID的优势

        因为RFID用的地方太多了,导致随意性较大,反而不便于更好地管控。所以业界重新定义了NFC规范,试图在两个方面进行优化。 

         (1)RFID的信号传播距离较远,致使位于远处的设备也可能获取卡片信息。而NFC的有效工作距离在十厘米之内,即可避免卡片信息被窃取的风险。

         (2)RFID的读写操作是单向的,也就是说,只有读卡器能读写卡片,卡片不能拿读卡器怎么样。NFC不再限于“读卡器——卡片”的模式,两个NFC设备允许互相读写,既可以由设备A读写设备B,也可以由设备B读写设备A。

            改进之后的NFC技术既提高了安全性,又拓宽了应用场合,同时还兼容现有的大部分RFID卡片。

NFC在手机上的应用

          带有NFC功能的手机,在实际生活中主要有三项应用: 

           (1)读卡器 通过支持NFC的手机从带有NFC芯片的标签、贴纸、名片等媒介中读写信息。

           (2)仿真卡 把手机当卡片用,比如拿手机刷公交,此时数据存储在手机当中。

           (3)分享内容 在两部手机之间传输数据,例如交换图片资料或同步设备联系人。

NFC的几个子标准

    NFC的子标准名称及其适用场合详见下表。

NFC手机作为读卡器的开发步骤

下面通过相对简单的读卡器功能,来介绍如何进行手机App的NFC开发。

(1)首先要在AndroidManifest.xml中声明NFC的操作权限。

(2)其次还要对活动页面声明NFC过滤器。

(3)进行代码方面的处理逻辑。编码方面又有以下3点步骤。

                    1). 初始化NFC适配器

                    2). 启用NFC感应/禁用NFC感应

                    3). 接收到感应消息并对消息解码

NFC手机读取门禁卡的实现效果

NFC手机读取北京一卡通的实现效果

2  红外遥控

红外遥控是一种无线控制技术,它具有功耗小、成本低、易实现等诸多优点,因而被各种电子设备特别是家用电器广泛采用。

 遥控器可能是红外遥控,也可能是射频遥控。红外遥控使用近红外光线作为遥控光源,而射频遥控使用超高频电磁波作为信号载体。

 红外遥控器带着灯泡就像一支手电筒,红外光照到哪里,哪里的电器才会接收响应,这决定了红外遥控的三个特性:                              (1)遥控器要对准电器才有反应。

            (2)遥控器不能距离电器太远,最好是五米之内。

            (3)遥控器与电器之间不能有障碍物。

如何使用红外遥控

              (1)首先要在App工程的AndroidManifest.xml中补充红外权限配置。

              (2)其次在代码中初始化红外遥控的管理器ConsumerIrManager,它的常用方法主要有三个: hasIrEmitter:                             检查设备是否拥有红外发射器。 getCarrierFrequencies:获得可用的载波频率范围。 transmit:发射红外信号。

               (3)最后在准备发射遥控信号之时,调用transmit方法就把红外信号发出去了。

红外信号的编码格式

           红外信号的格式由三个要素决定:

                  (1)用户码

                                  用户码表示厂商代号,每个厂家都有自己的唯一代号。

                  (2)数据码

                                   数据码表示按键的编号,不同的数据码代表不同的按键。

                  (3)电路格式

                                  电路格式表示红外信号的编码协议,每种协议都有专门的指令格式。比如NEC6121协议的红外信号                                 编码格式为:引导码+用户码+数据码+数据反码+结束码。

红外信号的转换规则

          解码仪获得的用户码和数据码并不能直接写在代码中,因为液晶屏上的编码其实是十六进制数,需要转换为二进制                 数才行。

         transmit方法的输入参数要传递整型数组形式的信号,并不是二进制数,这意味着二进制数还得转换成整型数组。                        电平是“电压平台”的简称,指的是某一点电压的高低状态,在数字电路中常用高电平表示“1”,用低电平表示“0”。遥           控器发射红外信号之时,通过“560微秒低电平+1680微秒高电平”代表“1”,通过“560微秒低电平+560微秒低电平”代表“0”。                        Android编码时,使用“560,1680”表示二进制的1,使用“560,560”表示二进制的0。

最终得到的红外信号数值

 

3  蓝牙BlueTooth

                蓝牙是一种短距离无线通信技术,它由爱立信公司于1994年创制,原本想替代连接电信设备的数据线,但是后来发现它也能用于移动设备之间的数据传输,所以蓝牙技术在手机上获得了长足发展。

                蓝牙与前面介绍的NFC和红外都是无线技术标准,它们的实际应用场景各不相同。

                      (1)NFC主要用于操作简单、即时响应的刷卡。

                       (2)红外主要用于需要按键控制、价格低廉的家电遥控。

                        (3)蓝牙主要用于两部设备之间复杂且大量的数据传输。

NFC、红外和蓝牙的技术参数对比

如何使用蓝牙适配器

蓝牙配对的实现步骤

蓝牙配对的请求弹窗

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/713823
推荐阅读
相关标签
  

闽ICP备14008679号