移动应用开发课件:特色应用(NDK、传感器、地图)_第1页
移动应用开发课件:特色应用(NDK、传感器、地图)_第2页
移动应用开发课件:特色应用(NDK、传感器、地图)_第3页
移动应用开发课件:特色应用(NDK、传感器、地图)_第4页
移动应用开发课件:特色应用(NDK、传感器、地图)_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#12特色应用AndroidNDKAndroid传感器系统

位置服务

地图应用学习目标2在Android上,应用程序的开发,大部分基于Java语言来实现。要使用c或是c++的程序或库,就需要使用NDK来实现。NDK是NativeDevelopmentKit的简称。它是一个工具集,集成了Android的交叉编译环境,并提供了一套比较方便的Makefile,可以帮助开发者快速开发C或是C++的动态库,并自动的将so和java程序打包成apk,在Android上运行。NDK简介3只有当应用程序真的是个处理器杀手的时候你才需要使用NDK。设计的算法需要利用DalvikVM中所有的处理器资源,则原生运行较为有利。在Android2.2中,JIT编译器会提高类似代码的效率。NDK效率4若现有的应用程序中有大量的C语言代码,使用NDK不仅可以加速你的项目的开发进程,也能在Android和非Android项目中保持修改的同步。这对于那些为其他平台而写的OpenGLES应用程序来说尤为如此。NDK可移植性5这是原生代码,在使用时由处理器构架编译。它支持何种处理器构架?目前的NDK中,只支持ARMv5TE和ARMv7-A指令集。默认设置下,目标架构被设置为ARMv5TE,它可以在使用ARM芯片的Android设备上运行。NDK兼容性6AndroidVM允许java代码通过JNI去调用原生代码(nativecode)NDK使用简介7NDK使用简介//C代码,将编译成库#include<string.h>#include<jni.h>jstring//返回值Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv*env,//JNI环境jobjectthiz){return(*env)->NewStringUTF(env,"HellofromJNI!");}8Android的传感器系统综述层次结构硬件抽象层使用9传感器系统可以让智能手机的功能更加丰富多彩Android的Sensor系统涉及了Android的各个层次。Android系统支持多种传感器,有的传感器已经在Android的框架中使用,大多数传感器由应用程序来使用。传感器系统综述10传感器种类传感器系统综述11传感器层次传感器系统综述12Android的传感器系统从驱动程序层次到上层都有所涉及,自下而上涉及到的各个层次为:各种Sensor的内核中的驱动程序Sensor的硬件抽象层(硬件模块)Sensor系统的JNISensor的JAVA类JAVA框架中对Sensor的使用JAVA应用程序对Sensor的使用Sensor系统层次结构13Sensor系统的JNI部分的函数列表:Sensor系统层次结构14Sensor系统层次结构传感器系统的JAVA部分包含了以下几个文件: SensorManager.java:

实现传感器系统核心的管理类SensorManager Sensor.java:

单一传感器的描述性文件Sensor SensorEvent.java:

表示传感器系统的事件类SensorEvent SensorEventListener.java:

传感器事件的监听者SensorEventListener接口 SensorListener.java:

传感器的监听者SensorListener接口(不推荐使用)15Sensor系统层次结构SensorManager的主要的接口如下所示16Sensor系统层次结构Sensor的主要的接口如下所示Sensor类的初始化在SensorManager的JNI代码中实现,在SensorManager.java维护了一个Sensor的列表。17传感器系统层次结构SensorEvent类比较简单,实际上是Sensor类加上了数值(values),精度(accuracy),时间戳(timestamp)等内容。SensorEventListener接口描述了SensorEvent的监听者内容如下所示:18Sensor的硬件抽象层hardware/libhardware/include/hardware/目录中的sensors.h是Android传感器系统硬件层的接口。Sensor模块的定义如下所示:19Sensor的硬件抽象层sensors_data_t表示传感器的数据:20Sensor的硬件抽象层Sensor的控制设备和数据设备21Sensor的硬件抽象层sensor_t表示一个传感器的描述性定义:22Sensor的硬件抽象层Sensor的硬件抽象层实现的要点:传感器的硬件抽象层可以支持多个传感器,需要构建一个sensor_t类型的数组。传感器控制设备和数据设备结构,可能被扩展。传感器在Linux内核的驱动程序,很可能使用misc驱动的程序,这时需要在控制设备开发的时候,同样使用open()打开传感器的设备节点。23Sensor的硬件抽象层传感器数据设备poll是实现的重点,需要在传感器没有数据变化的时候实现阻塞,在数据变化的时候返回,根据驱动程序的情况可以使用poll(),read()或者ioctl()等接口来实现。sensors_data_t数据结构中的数值,是最终传感器传出的数据,在传感器的硬件抽象层中,需要构建这个数据。24传感器系统的使用Android所有的传感器都归传感器管理器SensorManager类管理获取传感器管理器的方法Stringservice_name=Context.SENSOR_SERVICE;SensorManager

sensorManager=(SensorManager)getSystemService(service_name);25传感器系统的使用传感器管理器的几个常量传感器类型方向、加速表、光线、磁场、临近性、温度等。采样率最快、游戏、普通、用户界面。当应用程序请求特定的采样率时,其实只是对传感器子系统的一个提示,或者一个建议。不保证特定的采样率可用。准确性高、低、中、不可靠。26传感器系统的使用现阶段Android支持的传感器有8种传感器类型常量内部整数值中文名称Sensor.TYPE_ACCELEROMETER1加速度传感器Sensor.TYPE_MAGNETIC_FIELD2磁力传感器Sensor.TYPE_ORIENTATION3方向传感器Sensor.TYPE_GYROSCOPE4陀螺仪传感器Sensor.TYPE_LIGHT5环境光照传感器Sensor.TYPE_PRESSURE6压力传感器Sensor.TYPE_TEMPERATURE7温度传感器Sensor.TYPE_PROXIMITY8距离传感器27传感器系统的使用(1)加速度传感器加速度传感器又叫G-sensor,返回x、y、z三轴的加速度数值。该数值包含地心引力的影响,单位是m/s^2。将手机平放在桌面上,x轴默认为0,y轴默认0,z轴默认9.81。将手机朝下放在桌面上,z轴为-9.81。将手机向左倾斜,x轴为正值。将手机向右倾斜,x轴为负值。将手机向上倾斜,y轴为负值。将手机向下倾斜,y轴为正值。28传感器系统的使用(2)磁力传感器磁力传感器简称为M-sensor,返回x、y、z三轴的环境磁场数据。该数值的单位是微特斯拉(micro-Tesla),用uT表示。单位也可以是高斯(Gauss),1Tesla=10000Gauss。硬件上一般没有独立的磁力传感器,磁力数据由电子罗盘传感器提供(E-compass)。电子罗盘传感器同时提供下文的方向传感器数据。29传感器系统的使用(3)方向传感器方向传感器简称为O-sensor,返回三轴的角度数据,方向数据的单位是角度。为了得到精确的角度数据,E-compass需要获取G-sensor的数据,经过计算生产O-sensor数据,否则只能获取水平方向的角度。方向传感器提供三个数据,分别为azimuth、pitch和roll。azimuth:方位,返回水平时磁北极和Y轴的夹角,范围为0°至360°。0°=北,90°=东,180°=南,270°=西。pitch:x轴和水平面的夹角,范围为-180°至180°。当z轴向y轴转动时,角度为正值。roll:y轴和水平面的夹角,由于历史原因,范围为-90°至90°。当x轴向z轴移动时,角度为正值。30传感器系统的使用(4)陀螺仪传感器陀螺仪传感器叫做Gyro-sensor,返回x、y、z三轴的角加速度数据。角加速度的单位是radians/second。根据NexusS手机实测:水平逆时针旋转,Z轴为正。水平逆时针旋转,z轴为负。向左旋转,y轴为负。向右旋转,y轴为正。向上旋转,x轴为负。向下旋转,x轴为正。31传感器系统的使用(5)光线感应传感器光线感应传感器检测实时的光线强度,光强单位是lux,其物理意义是照射到单位面积上的光通量。光线感应传感器主要用于Android系统的LCD自动亮度功能。可以根据采样到的光强数值实时调整LCD的亮度。32传感器系统的使用(6)压力传感器压力传感器返回当前的压强,单位是百帕斯卡hectopascal(hPa)。(7)温度传感器温度传感器返回当前的温度。33传感器系统的使用(8)接近(距离)传感器接近传感器检测物体与手机的距离,单位是厘米。一些接近传感器只能返回远和近两个状态,因此,接近传感器将最大距离返回远状态,小于最大距离返回近状态。接近传感器可用于接听电话时自动关闭LCD屏幕以节省电量。一些芯片集成了接近传感器和光线传感器两者功能34传感器系统的使用从传感器管理器中获取某个或某些传感器的方法第1种:获取某种传感器的默认传感器SensordefaultGyroscope=sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);第2种:获取某种传感器的列表List<Sensor>pressureSensors=sensorManager.getSensorList(Sensor.TYPE_PRESSURE);第3种:获取所有传感器的列表List<Sensor>allSensors=sensorManager.getSensorList(Sensor.TYPE_ALL);35传感器系统的使用对于某一个传感器,它的一些具体信息的获取方法方法描述getMaximumRange()最大取值范围getName()设备名称getPower()功率getResolution()精度getType()传感器类型getVentor()设备供应商getVersion()设备版本号36传感器系统的使用例子(分3步)获得管理器……获得传感器……定义并注册事件监听器监听器需要实现SensorEventListner接口37学习目标:AndroidNDKAndroid传感器系统

位置服务

地图应用38位置服务位置服务(Location-BasedServices,LBS),又称定位服务或基于位置的服务,融合了GPS定位、移动通信、导航等多种技术,提供了与空间位置相关的综合应用服务2001年7月,DoCoMo发布了第一款具有三角定位功能的手持设备2001年12月,KDDI发布第一款具有GPS功能的手机基于位置的服务发展迅速,已涉及到商务、医疗、工作和生活的各个方面,为用户提供定位、追踪和敏感区域警告等一系列服务39位置服务Android平台支持提供位置服务的API,在开发过程中主要用到LocationManager和LocationProviders对象LocationManager可以用来获取当前的位置,追踪设备的移动路线,或设定敏感区域,在进入或离开敏感区域时设备会发出特定警报LocationProviders是能够提供定位功能的组件集合,集合中的每种组件以不同的技术提供设备的当前位置,区别在于定位的精度、速度和成本等方面40位置服务使用位置服务6个步骤为了使GPS定位功能生效,还需要在AndroidManifest.xml文件中加入用户许可实现代码如下<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/>第1步41位置服务提供位置服务,首先需要获得LocationManager对象获取LocationManager可以通过调用android.app.Activity.getSystemService()函数实现代码第1行的Context.LOCATION_SERVICE指明获取的服务是位置服务代码第2行的getSystemService()函数,可以根据服务名称获取Android提供的系统级服务StringserviceString=Context.LOCATION_SERVICE;LocationManagerLocationManager=(LocationManager)getSystemService(serviceString);第2步42位置服务Android支持的系统级服务表Context类的静态常量值返回对象说明LOCATION_SERVICElocationLocationManager控制位置等设备的更新WINDOW_SERVICEwindowWindowManager最顶层的窗口管理器LAYOUT_INFLATER_SERVICElayout_inflaterLayoutInflater将XML资源实例化为ViewPOWER_SERVICEpowerPowerManager电源管理ALARM_SERVICEalarmAlarmManager在指定时间接受IntentNOTIFICATION_SERVICEnotificationNotificationManager后台事件通知KEYGUARD_SERVICEkeyguardKeyguardManager锁定或解锁键盘SEARCH_SERVICEsearchSearchManager访问系统的搜索服务VIBRATOR_SERVICEvibratorVibrator访问支持振动的硬件CONNECTIVITY_SERVICEconnectionConnectivityManager网络连接管理WIFI_SERVICEwifiWifiManagerWi-Fi连接管理INPUT_METHOD_SERVICEinput_methodInputMethodManager

输入法管理第2步43位置服务在获取到LocationManager后,还需要指定LocationManager的定位方法,然后才能够调用LocationManagerLocationManager支持的定位方法有两种GPS定位:可以提供更加精确的位置信息,但定位速度和质量受到卫星数量和环境情况的影响网络定位:提供的位置信息精度差,但速度较GPS定位快第3步44位置服务LocationManager支持定位方法代码示例:定义定位方法为GPSLocationManager类的静态常量值说明GPS_PROVIDERgps使用GPS定位,利用卫星提供精确的位置信息,需要android.permissions.ACCESS_FINE_LOCATION用户权限NETWORK_PROVIDERnetwork使用网络定位,利用基站或Wi-Fi提供近似的位置信息,需要具有如下权限:android.permission.ACCESS_COARSE_LOCATION或android.permission.ACCESS_FINE_LOCATION.第3步Stringprovider=LocationManager.GPS_PROVIDER;45位置服务定义处理位置变化事件监听类实现locationListener的代码框架如下LocationListenerlocationListener=newLocationListener(){

publicvoidonLocationChanged(Locationlocation){

}

publicvoidonProviderDisabled(Stringprovider){

}

publicvoidonProviderEnabled(Stringprovider){

}

publicvoidonStatusChanged(Stringprovider,intstatus,Bundleextras){

}};第4步46位置服务定义处理位置变化事件监听类实现locationListener的代码框架如下LocationListenerlocationListener=newLocationListener(){

publicvoidonLocationChanged(Locationlocation){

}

publicvoidonProviderDisabled(Stringprovider){

}

publicvoidonProviderEnabled(Stringprovider){

}

publicvoidonStatusChanged(Stringprovider,intstatus,Bundleextras){

}};第4步47位置服务第2行的onLocationChanged()在设备的位置改变时被调用第4行的onProviderDisabled()在用户禁用具有定位功能的硬件时被调用第6行的onProviderEnabled()在用户启用具有定位功能的硬件时被调用第8行的onStatusChanged()在提供定位功能的硬件的状态改变时被调用,如从不可获取位置信息状态到可以获取位置信息的状态,反之亦然第4步48位置服务指定位置变化事件频率:根据位置的距离变化量和时间间隔设定产生位置变化事件的条件。避免因微小的距离变化而产生大量的位置改变事件LocationManager中设定位置变化监听频率的代码如下参数1:定位的方法,GPS定位或网络定位参数2:产生位置改变事件的时间间隔,单位为微秒参数3:距离条件,单位是米,>此距离才激发事件参数4:回调函数,在满足条件后的事件处理函数代码将产生位置改变事件的条件设定为距离改变10米,时间间隔为2秒locationManager.requestLocationUpdates(provider,2000,10,locationListener);第5步49位置服务以使用GPS定位为例,获取位置信息的代码如下代码第2行返回的Location对象中,包含了可以确定位置的信息,如经度、纬度和速度等通过调用Location中的getLatitude()和getLonggitude()方法可以分别获取位置信息中的纬度和经度,示例代码如下Locationlocation=locationManager.getLastKnownLocation(provider);doublelat=location.getLatitude();doublelng=location.getLongitude();第6步50位置服务CurrentLocationDemo是一个提供位置服务的基本示例,提供了显示当前位置新的功能,并能够监视设备的位置变化51位置服务调试方法最理想的调试方式是将程序上传到物理设备上运行也可以使用模拟器提供的虚拟方式模拟设备的位置变化打开DDMS中的模拟器控制在LocationControls中的Longitude和Latitude部分输入设备当前的经度和纬度点击Send按钮,将虚拟的位置信息发送到Android模拟器中52位置服务在程序运行过程中,可以在模拟器控制器中改变经度和纬度坐标值,程序在检测到位置的变化后,会将最新的位置信息显示在界面上53学习目标:AndroidNDKAndroid传感器系统

位置服务

地图应用了解地图密钥的申请方法掌握获取位置信息的方法掌握MapView和MapController的使用方法掌握Google地图覆盖层的使用方法

54Google地图应用(1)申请地图密钥首先向Google申请一组经过验证的“地图密钥”(MapAPIKey),然后使用MapView(com.google.android.maps.MapView)就可以将Google地图嵌入到Android应用程序中,才能正常使用Google的地图服务“地图密钥”是访问Google地图数据的密钥,无论是模拟器还是在真实设备中需要使用这个密钥55Google地图应用(1)申请地图密钥注册“地图密钥”的第一步是申请一个Google账户,也就是Gmail电子邮箱,申请地址是找到保存Debug证书的keystore的保存位置,并获取证书的MD5散列值keystore是一个密码保护的文件,用来存储Android提供的用于调试的证书,获取MD5散列值的主要目的是为下一步申请“地图密钥”做准备56Google地图应用(1)申请地图密钥获取证书的保存地址:首先打开Eclipse,通过Window→Preferences打开配置窗体,在Android→Build栏中的Defaultdebugkeystore中可以找到57Google地图应用(1)申请地图密钥为了获取Debug证书MD5散列值的,需要打开命令行工具CMD,然后切换到keystore的目录,输入如下命令如果提示无法找到keytool,可以将<JavaSDK>/bin的路径添加到系统的PATH变量中例如:

"C:\ProgramFiles(x86)\Java\jdk1.7.0\bin\keytool.exe"–list–keystoredebug.keystorekeytool–list–keystoredebug.keystore58Google地图应用(1)申请地图密钥在提示输入keystore密码时,输入缺省密码android,MD5散列将显示在最下方。笔者的MD5散列值为68:76:89:C8:A4:24:61:F9:EA:F3:F7:70:CC:FD:C8:1559Google地图应用(1)申请地图密钥申请“地图密钥”的最后一步是打开申请页面,输入MD5散列值60Google地图应用(1)申请地图密钥61Google地图应用(1)申请地图密钥输入MD5散列值后,点击GenerateAPIKey按钮,将提示用户输入Google账户,正确输入Google账户后,将产生申请“地图密钥”的获取结果62Google地图应用(1)申请地图密钥例:若获取的“地图密钥”是0mVK8GeO6WUz4S2F94z52CIGSSlvlTwnrE4DsiA,在以后使用到MapView的时候都需要输入这个密钥每位开发者都需要根据自己的Debug证书的MD5散列值,到Google网站上申请一个用于调试程序的“地图密钥”,而不能直接使用别人申请的密钥63Google地图应用(2)使用Google地图MapView的地图的显示控件,可以设置不同的显示模式,例如卫星模式、街道模式或交通模式MapController则是MapView的控制器,可以控制MapView的显示中心和缩放级别等功能64Google地图应用(2)使用Google地图在建立工程时将com.google.android.maps的扩展库添加到工程中,这样就可以使用Google地图的所有功能添加com.google.android.maps扩展库的方式是在创建工程时,在BuildTarget项中选择GoogleAPIs创建工程后,修改/res/layout/main.xml文件,在布局中加入一个MapView控件,并设置刚获取的“地图密钥”65Google地图应用(2)使用Google地图在xml文件中定义MapView及其属性 <com.google.android.maps.MapView android:id="@+id/mapview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:enabled="true" android:clickable="true" android:apiKey="0mVK8GeO6WUz4S94z52CIGSSlvlTwnrE4DsiA"/>66Google地图应用(2)使用Google地图仅在布局中添加MapView控件,还不能够直接在程序中调用这个控件,还需要将程序本身设置成MapActivity(com.google.android.maps.MapActivity)MapActivity类负责处理显示Google地图所需的生命周期和后台服务管理publicclassGoogleMapDemoextendsMapActivity{ privateMapViewmapView; privateMapControllermapController; …}67Google地图应用(2)使用Google地图经纬度坐标需要转化为GeoPoint再使用以下代码设定的经度为126.676530486*1E6、纬度为45.7698895661*1E6的地理坐标点Doublelng=126.676530486*1E6; Doublelat=45.7698895661*1E6; GeoPointpoint=newGeoPoint(Value(),Value());68Google地图应用(2)使用Google地图第1行代码获取了MapController通过MapController进行各项设置mapController=mapView.getController();mapController.setCenter(point);

//设置MapView的“显示中点”mapController.setZoom(11);//设置放大层级mapController.animateTo(point);//将MapView显示区域的中心移动到第2行设置的“显示中心”69Google地图应用(2)使用Google地图设定MapView的地图显示模式是否为卫星模式,设置true则为卫星模式,设置false则为普通模式 mapView.setSatellite(false)卫星模式地图模式70Google地图应用(2)使用Google地图由于获取Google地图是需要使用互联网的,所以在运行前还需要在AndroidManifest.xml文件中,添加允许访问互联网的许可<uses-permissionandroid:name="android.permission.INTERNET"/>71Google地图应用(3)使用Overlay通过在MapView上添加覆盖层,可以在指定的位置加添加注解、绘制图像或处理进行鼠标事件等Google地图上可以加入多个覆盖层,所有覆盖层均在地图图层之上,每个覆盖层均可以对用户的点击事件做出响应创建覆盖层继承Overlay类的子类,并通过重载draw()方法为指定位置添加注解,重载onTap()方法处理用户的点击操作72Google地图应用(3)使用Overlay下面的代码是创建Overlay的最小代码集合publicclassTextOverlayextendsOverlay{ @Override publicvoiddraw(Canvascanvas,MapView

mapView,booleanshadow){ if(shadow==false){

} else{ }

super.draw(canvas,mapView,shadow); }

@Override publicboolean

onTap(GeoPointp,MapView

mapView){ returnfalse; }}73Google地图应用(3)使用Overlay第3行代码中draw()方法,shadow变量是用来区分绘制图层的false表示在覆盖层上进行绘制true则表示在隐藏层上进行绘制第14行代码是onTap()方法的返回值返回false表示覆盖层不处理点击事件返回true则表示已经处理了点击事件在覆盖层绘制图形或文字需要使用“画布”(Canvas)来实现,绘制的位置是屏幕坐标,这就需要将地图上的物理坐标与屏幕坐标进行转换74Google地图应用(3)使用OverlayProjection类提供了物理坐标和屏幕坐标的转换功能,可在经度和纬度表示的GeoPoint点和屏幕上Point点进行转换toPixels()方法将物理坐标转换为屏幕坐标fromPixels()方法将屏幕坐标转换为物理坐标两个方法的具体使用方法可以参考下面的代码Projectionprojection=mapView.getProjection();

projection.toPixels(geoPoint,point);projection.fromPixels(point.x,point.y);75Google地图应用(3)使用Overlay下面的内容以MapOverlayDemo示例,说明如何在Google地图上添加覆盖层,并在预订的物理坐标上显示提示信息右图是MapOverlayDemo示例的运行结果76Google地图应用(3)使用OverlayTextOverlay类是MapOverlayDemo示例的覆盖层,主要重载了draw()方法,在指定的物理坐标上绘制了标记点和提示文字建立覆盖层文件的核心代码如下publicclassTextOverlayextendsOverlay{ privatefinalintmR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论