




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
相机中使用定位服务获取拍照时的地理位置M厂产品软件部 邹建敏一、基础知识现代智能手机的一个重要功能就是定位,当用户在使用相机拍照时如果能够记录当前照片拍摄时的地理位置信息,并且按照不同的地理位置把照片分成不同的文件夹,对于喜欢旅游和拍照的用户来说这是一个很好的体验。在Android手机中通过定位获取地理位置一般有以下几种方式: 1、 GPS或AGPS:使用GPS定位需要在室外使用,在室内是接受不到GPS卫星信号,也当然不能定位。GPS使用一个卫星群将地点和时间数据从太空直接发送到你的手机上。如果手机接收来自3个卫星的信号,那么它可以显示你在地图上的方位,如果手机可以接收4个卫星的信号,它还可以显示出你的海拔。在室内由于接受不到GPS卫星信号,可以使用AGPS(辅助GPS)定位,它的原理和GPS定位的不同点在于AGPS是通过使用数据网络(GPRS、3G等)或者Wi-Fi向GPS卫星发送定位数据,所以使用AGPS需要网络支持,而GPS不需要网络。2、 基站定位:由于运营商的每个基站都有确定的编号和位置,运营商可以根据用户当前使用的基站与周围基站的距离来确定用户的当前的位置,所以基站定位在基站分布密集的城市定位更精确。3、 Wi-Fi定位:原理与基站定位相同,主要区别在于Wi-Fi定位使用的是用户当前接入点的位置,由于Wi-Fi的覆盖区域更小,所以它的精确度更高。 后两种定位方式由于需要网络的支持,所以在Android SDK中统一为基于网络的定位即网络定位。2、 如何使用定位服务获取地理位置结束监听获取和使用最新的位置信息开启位置服务监听实现监听器的接口(LocationListener)获取位置服务的LocationManager取位置服务管理器(LocationManager)理器(LocationManager)在Android手机的应用中使用定位服务,一般有以下几个步骤:下面结合11071项目相机中GPS定位和网络定位来了解在手机应用中怎么获取当前的地理位置。1、 获取定位服务的LocationManager/定义LocationManager对象private LocationManager mLocationManager = null; /通过getSystemService()方法获取LocationManagerif (null = mLocationManager) mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);2、 实现监听器的接口(android.location.LocationListener),其中有些重要的变量和函数如下:/实现接口的内部类变量 Location mLastLocation; /定义Location对象String mProvider; /获取Location的Providerboolean mValid = false; /标志获取的Location是否有效/内部类的构造函数,需要参数provider,provider一般有两种: LocationManager.GPS_PROVIDER和LocationManager.NETWORK_PROVIDERpublic LocationListener(String provider) mProvider = provider; /设置provider(定位方式) mLastLocation = new Location(mProvider); /创建Location对象/当获取到新位置或者位置发生变化时调用,public void onLocationChanged(Location newLocation) /判断获取到的位置是否合法if (newLocation.getLatitude() = 0.0 &newLocation.getLongitude() = 0.0) return;/当获取到的位置合法时,通过Location的set()方法更新位置mLastLocation.set(newLocation);mValid = true;/获取当前最新的位置对象,首先判断当前的Location是否合法,如果合法则返回Location对象,否则返回Null/定义LocationListener对象3、开启位置服务监听,使用方法startReceivingLocationUpdates(),如下所示:protected void startReceivingLocationUpdates() CameraLog.v(TAG, startReceivingLocationUpdates();if (null = mLocationManager) return;/判断是否打开GPS开关if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) try /开始要求更新位置信息,使用GPS定位方式mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,5000,0F,mLocationListeners0); catch (java.lang.SecurityException ex) CameraLog.v(TAG, Fail to request location update, ignore., ex); catch (IllegalArgumentException ex) CameraLog.v(TAG, GPS provider does not exist. + ex.getMessage();/检测当前手机网络是否可用if (checkInternet() /判断使用网络方式获取位置的开关是否打开if (mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) try /开始要求更新位置信息,使用网络定位方式mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,5000,0F,mLocationListeners1); catch (java.lang.SecurityException ex) CameraLog.v(TAG, Fail to request location update, ignore., ex); catch (IllegalArgumentException ex) CameraLog.v(TAG, Network provider does not exist. + ex.getMessage();在上面的代码中使用到一个重要的函数来更新位置:LocationManager.requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener),该方法的作用是通过给定的provider名称,并将其绑定指定的LocationListener监听器,周期性的更新位置信息,其中第一个参数是provider名称即定位的方式,一般为GPS和NetWork两种,第二个参数是更新位置的时间,单位是毫秒,第三个是更新的距离,单位是米,第四个参数是位置服务的监听。4、 获取和使用最新的位置信息,主要工作是如何把已经获取到的位置信息(经度和纬度)设置到照片中和保存到数据库中(1) 获取最新的位置信息,主要方法是getCurrentLocation(),改方法返回一个Location对象。protected Location getCurrentLocation() CameraLog.v(TAG, getCurrentLocation();Location l = null;for (int i = 0; i mLocationListeners.length; i+) /获取LocationListener中最新更新的位置信息l = mLocationListenersi.current();/判断是否已经获取到合法的位置信息if (null != l) break; /退出循环return l;(2) 使用获取的位置信息a、 在拍照时把位置信息设置到照片中,在11071的相机中主要有以下步骤:1) 在onSnap()方法中获取当前的位置信息,通过调用getCurrentLocation()Location loc = getCurrentLocation();2) 在在onSnap()方法中调用CameraDevice的setPictureInfo()方法把位置信息添加到照片中mCameraDevice.setPictureInfo(rotation, loc); /设置照片信息以下是该方法的详解:public void setPictureInfo(int lastOrientation, Location loc) CameraLog.v(TAG, setPictureInfo();/判断当前的Camera是否为打开状态if (mCameraStatus = CAMERA_DEVICE_STATUS_CLOSED) CameraLog.v(TAG, CAMERA_DEVICE_NOT_OPENED);return;/设置照片的方向mParameters.setRotation(lastOrientation);/清楚照片参数中已有的GPS数据mParameters.removeGpsData();/设置照片的GPS时间戳mParameters.setGpsTimestamp(System.currentTimeMillis() / 1000);/设置照片的位置信息/判断获取的位置信息是否为空,为空说明在拍照时还没有获取到用户当前的位置信息if (null != loc) double lat = loc.getLatitude(); /获取纬度double lon = loc.getLongitude(); /获取经度/判断经度和纬度是否有效boolean hasLatLon = (lat != 0.0d) | (lon != 0.0d);if (hasLatLon) mParameters.setGpsLatitude(lat); /设置照片的纬度信息mParameters.setGpsLongitude(lon); /设置照片的经度信息mParameters.setGpsProcessingMethod(loc.getProvider().toUpperCase(); /设置获取位置的provider即定位的方式/设置高度获取海拔if (loc.hasAltitude() mParameters.setGpsAltitude(loc.getAltitude(); else mParameters.setGpsAltitude(0);mCamera.setParameters(mParameters); /更新参数b、把位置信息保存到数据库中,在保存照片时调用getCurrentLocation()方法获取位置信息,并调用ImageManager.addImage()保存照片信息到数据库中。1)在BaseCameraActivity.java的storeImage()方法中调用getCurrentLocation()获取位置信息:mImageCapture.storeImage(jpegData,BaseCameraActivity.this,getCurrentLocation(),storeDir,mCameraEntryType = CAMERA_ENTRY_FROM_OTHER_APP,mCameraId);2) 在ImageCapture.java的storeImage()方法中调用ImageManager的addImage()方法保存照片信息到数据库中:mLastContentUri = ImageManager.addImage(context.getContentResolver(),title, dateTaken, loc,storeDir, filename, data, degree);3) 在ImageManager.java的addImage()方法中把经度和纬度数据保存到数据库中:/判断位置信息是否为空if (null != location) / 写入纬度数据values.put(Images.Media.LATITUDE, location.getLatitude();/ 写入经度数据values.put(Images.Media.LONGITUDE, location.getLongitude();/通过ContentResolver的insert()方法把数据保存到数据库中uri = cr.insert(Images.Media.EXTERNAL_CONTENT_URI, values);5、 结束位置服务的监听,在stopReceivingLocationUpdates()方法中通过调用LocationManager.removeUpdates()方法来结束监听:protected void stopReceivingLocationUpdates() if (null = mLocationManager) return;for (int i = 0; i mLocationListeners.length; i+) try /结束监听,去除LocationManager的LocationListenermLocationManager.removeUpdates(mLocationListenersi); catch (Exception ex) CameraLog.v(TAG, fail to remove location listners, ignore, ex);6、在完成以上步骤后,要在Android应用中使用位置服务还需要很重要的一步:AndroidManifest.xml中使用注册服务的权限在相机中已经把拍照时的经度和纬度设置到照片中并保存至数据库中,那么怎么把经度和纬度转反向编码换成具体的地理位置,这一步在11071项目中由相册完成,主要通过Geocoder的public list getFromL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030工业自动化控制芯片设计架构演进方向白皮书
- 2025-2030工业自动化控制系统信息安全风险与防护方案研究报告
- 2025-2030工业级无人机在巡检领域应用成熟度评估报告
- 2025-2030工业物联网在机械制造领域应用现状及前景研究报告
- 植物纤维纸品创新创业项目商业计划书
- 手机屏创新创业项目商业计划书
- 建筑摄影创新创业项目商业计划书
- 智能价格模型创新创业项目商业计划书
- 室内设计表演展示创新创业项目商业计划书
- 小龙虾外卖店创新创业项目商业计划书
- 2025双11大促商家一站式指南
- 助理医师考试题库及答案
- 电梯管理安全试题库及答案解析
- 2.2 6、7的加减法(课件)数学青岛版一年级上册(新教材)
- 消防战斗服穿戴培训课件
- 老年病人误吸预防及护理
- 国庆假期安全课件小学
- GB/T 45817-2025消费品质量分级陶瓷砖
- 2025年4月自考02627运筹学与系统分析试题
- 2025年成都市中考英语试题卷(含标准答案及解析)
- 极简室内风格软装设计
评论
0/150
提交评论