精品資料(2021-2022年收藏的)相機中使用GPS和網(wǎng)絡定位獲取用戶拍照時的地理位置_第1頁
精品資料(2021-2022年收藏的)相機中使用GPS和網(wǎng)絡定位獲取用戶拍照時的地理位置_第2頁
精品資料(2021-2022年收藏的)相機中使用GPS和網(wǎng)絡定位獲取用戶拍照時的地理位置_第3頁
精品資料(2021-2022年收藏的)相機中使用GPS和網(wǎng)絡定位獲取用戶拍照時的地理位置_第4頁
精品資料(2021-2022年收藏的)相機中使用GPS和網(wǎng)絡定位獲取用戶拍照時的地理位置_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、相機中使用定位服務獲取拍照時的地理位置M廠產(chǎn)品軟件部 鄒建敏一、基礎知識現(xiàn)代智能手機的一個重要功能就是定位,當用戶在使用相機拍照時如果能夠記錄當前照片拍攝時的地理位置信息,并且按照不同的地理位置把照片分成不同的文件夾,對于喜歡旅游和拍照的用戶來說這是一個很好的體驗。在Android手機中通過定位獲取地理位置一般有以下幾種方式: 1、 GPS或AGPS:使用GPS定位需要在室外使用,在室內(nèi)是接受不到GPS衛(wèi)星信號,也當然不能定位。GPS使用一個衛(wèi)星群將地點和時間數(shù)據(jù)從太空直接發(fā)送到你的手機上。如果手機接收來自3個衛(wèi)星的信號,那么它可以顯示你在地圖上的方位,如果手機可以接收4個衛(wèi)星的信號,它還可以

2、顯示出你的海拔。在室內(nèi)由于接受不到GPS衛(wèi)星信號,可以使用AGPS(輔助GPS)定位,它的原理和GPS定位的不同點在于AGPS是通過使用數(shù)據(jù)網(wǎng)絡(GPRS、3G等)或者Wi-Fi向GPS衛(wèi)星發(fā)送定位數(shù)據(jù),所以使用AGPS需要網(wǎng)絡支持,而GPS不需要網(wǎng)絡。2、 基站定位:由于運營商的每個基站都有確定的編號和位置,運營商可以根據(jù)用戶當前使用的基站與周圍基站的距離來確定用戶的當前的位置,所以基站定位在基站分布密集的城市定位更精確。3、 Wi-Fi定位:原理與基站定位相同,主要區(qū)別在于Wi-Fi定位使用的是用戶當前接入點的位置,由于Wi-Fi的覆蓋區(qū)域更小,所以它的精確度更高。 后兩種定位方式由于需要

3、網(wǎng)絡的支持,所以在Android SDK中統(tǒng)一為基于網(wǎng)絡的定位即網(wǎng)絡定位。2、 如何使用定位服務獲取地理位置結(jié)束監(jiān)聽獲取和使用最新的位置信息開啟位置服務監(jiān)聽實現(xiàn)監(jiān)聽器的接口(LocationListener)獲取位置服務的LocationManager取位置服務管理器(LocationManager)理器(LocationManager)在Android手機的應用中使用定位服務,一般有以下幾個步驟:下面結(jié)合11071項目相機中GPS定位和網(wǎng)絡定位來了解在手機應用中怎么獲取當前的地理位置。1、 獲取定位服務的LocationManager/定義LocationManager對象private L

4、ocationManager mLocationManager = null; /通過getSystemService()方法獲取LocationManagerif (null = mLocationManager) mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);2、 實現(xiàn)監(jiān)聽器的接口(android.location.LocationListener),其中有些重要的變量和函數(shù)如下:/實現(xiàn)接口的內(nèi)部類變量 Location mLastLocation; /定義Location對象S

5、tring mProvider; /獲取Location的Providerboolean mValid = false; /標志獲取的Location是否有效/內(nèi)部類的構(gòu)造函數(shù),需要參數(shù)provider,provider一般有兩種: LocationManager.GPS_PROVIDER和LocationManager.NETWORK_PROVIDERpublic LocationListener(String provider) mProvider = provider; /設置provider(定位方式) mLastLocation = new Location(mProvider);

6、/創(chuàng)建Location對象/當獲取到新位置或者位置發(fā)生變化時調(diào)用,public void onLocationChanged(Location newLocation) /判斷獲取到的位置是否合法if (newLocation.getLatitude() = 0.0 &&newLocation.getLongitude() = 0.0) return;/當獲取到的位置合法時,通過Location的set()方法更新位置mLastLocation.set(newLocation);mValid = true;/獲取當前最新的位置對象,首先判斷當前的Location是否合法,如果合

7、法則返回Location對象,否則返回Null/定義LocationListener對象3、開啟位置服務監(jiān)聽,使用方法startReceivingLocationUpdates(),如下所示:protected void startReceivingLocationUpdates() CameraLog.v(TAG, "startReceivingLocationUpdates()");if (null = mLocationManager) return;/判斷是否打開GPS開關(guān)if (mLocationManager.isProviderEnabled(Location

8、Manager.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) Cam

9、eraLog.v(TAG, "GPS provider does not exist. " + ex.getMessage();/檢測當前手機網(wǎng)絡是否可用if (checkInternet() /判斷使用網(wǎng)絡方式獲取位置的開關(guān)是否打開if (mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) try /開始要求更新位置信息,使用網(wǎng)絡定位方式mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,500

10、0,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();在上面的代碼中使用到一個重要的函數(shù)來更新位置:LocationManager.re

11、questLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener),該方法的作用是通過給定的provider名稱,并將其綁定指定的LocationListener監(jiān)聽器,周期性的更新位置信息,其中第一個參數(shù)是provider名稱即定位的方式,一般為GPS和NetWork兩種,第二個參數(shù)是更新位置的時間,單位是毫秒,第三個是更新的距離,單位是米,第四個參數(shù)是位置服務的監(jiān)聽。4、 獲取和使用最新的位置信息,主要工作是如何把已經(jīng)獲取到的位置信息(經(jīng)度和緯度)設置到照片中和保

12、存到數(shù)據(jù)庫中(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();/判斷是否已經(jīng)獲取到

13、合法的位置信息if (null != l) break; /退出循環(huán)return l;(2) 使用獲取的位置信息a、 在拍照時把位置信息設置到照片中,在11071的相機中主要有以下步驟:1) 在onSnap()方法中獲取當前的位置信息,通過調(diào)用getCurrentLocation()Location loc = getCurrentLocation();2) 在在onSnap()方法中調(diào)用CameraDevice的setPictureInfo()方法把位置信息添加到照片中mCameraDevice.setPictureInfo(rotation, loc); /設置照片信息以下是該方法的詳解:

14、public void setPictureInfo(int lastOrientation, Location loc) CameraLog.v(TAG, "setPictureInfo()");/判斷當前的Camera是否為打開狀態(tài)if (mCameraStatus = CAMERA_DEVICE_STATUS_CLOSED) CameraLog.v(TAG, CAMERA_DEVICE_NOT_OPENED);return;/設置照片的方向mParameters.setRotation(lastOrientation);/清楚照片參數(shù)中已有的GPS數(shù)據(jù)mParamet

15、ers.removeGpsData();/設置照片的GPS時間戳mParameters.setGpsTimestamp(System.currentTimeMillis() / 1000);/設置照片的位置信息/判斷獲取的位置信息是否為空,為空說明在拍照時還沒有獲取到用戶當前的位置信息if (null != loc) double lat = loc.getLatitude(); /獲取緯度double lon = loc.getLongitude(); /獲取經(jīng)度/判斷經(jīng)度和緯度是否有效boolean hasLatLon = (lat != 0.0d) | (lon != 0.0d);if

16、(hasLatLon) mParameters.setGpsLatitude(lat); /設置照片的緯度信息mParameters.setGpsLongitude(lon); /設置照片的經(jīng)度信息mParameters.setGpsProcessingMethod(loc.getProvider().toUpperCase(); /設置獲取位置的provider即定位的方式/設置高度獲取海拔if (loc.hasAltitude() mParameters.setGpsAltitude(loc.getAltitude(); else mParameters.setGpsAltitude(0)

17、;mCamera.setParameters(mParameters); /更新參數(shù)b、把位置信息保存到數(shù)據(jù)庫中,在保存照片時調(diào)用getCurrentLocation()方法獲取位置信息,并調(diào)用ImageManager.addImage()保存照片信息到數(shù)據(jù)庫中。1)在BaseCameraActivity.java的storeImage()方法中調(diào)用getCurrentLocation()獲取位置信息:mImageCapture.storeImage(jpegData,BaseCameraActivity.this,getCurrentLocation(),storeDir,mCameraEn

18、tryType = CAMERA_ENTRY_FROM_OTHER_APP,mCameraId);2) 在ImageCapture.java的storeImage()方法中調(diào)用ImageManager的addImage()方法保存照片信息到數(shù)據(jù)庫中:mLastContentUri = ImageManager.addImage(context.getContentResolver(),title, dateTaken, loc,storeDir, filename, data, degree);3) 在ImageManager.java的addImage()方法中把經(jīng)度和緯度數(shù)據(jù)保存到數(shù)據(jù)庫中

19、:/判斷位置信息是否為空if (null != location) / 寫入緯度數(shù)據(jù)values.put(Images.Media.LATITUDE, location.getLatitude();/ 寫入經(jīng)度數(shù)據(jù)values.put(Images.Media.LONGITUDE, location.getLongitude();/通過ContentResolver的insert()方法把數(shù)據(jù)保存到數(shù)據(jù)庫中uri = cr.insert(Images.Media.EXTERNAL_CONTENT_URI, values);5、 結(jié)束位置服務的監(jiān)聽,在stopReceivingLocationU

20、pdates()方法中通過調(diào)用LocationManager.removeUpdates()方法來結(jié)束監(jiān)聽:protected void stopReceivingLocationUpdates() if (null = mLocationManager) return;for (int i = 0; i < mLocationListeners.length; i+) try /結(jié)束監(jiān)聽,去除LocationManager的LocationListenermLocationManager.removeUpdates(mLocationListenersi); catch (Exception ex) CameraLog.v(TAG, "fail to remove location listners, ignore", ex);6、在完成以上步驟后,要在Android應用中使用位置服務還需要很重要的一步:AndroidManifest.xml中使用注冊服務的權(quán)限在相機中已經(jīng)把拍照時的經(jīng)度和緯度設置到照片中并保存至數(shù)據(jù)庫中,那么怎么把經(jīng)度和緯度轉(zhuǎn)反向編碼換成具體的地理位置,這一步在11071項目中由相冊完成,主要通過Geocoder的public list<Addres

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論