日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Google Map API v2 步步为营 (二)----- Location

發布時間:2024/4/17 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Google Map API v2 步步为营 (二)----- Location 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

接上篇。

改造一下MapsActivity:

public class MapsActivity extends Activity implements LocationListener, InfoWindowAdapter, OnMarkerClickListener, OnMarkerDragListener{ }

實現4個interface:

android.location.LocationListener

GoogleMap.InfoWindowAdapter

GoogleMap.OnMarkerClickListener

GoogleMap.OnMarkerDragListener

本篇要實現在地圖上定位,主要用到LocationListener接口。

另外3個接口關系到 打標記(Marker),移動標記點,以及點擊標記彈出info窗口。這些功能將在下一篇文中整理。???

?

地圖初始化

首先在onCreate中需要對地圖對象做一些設置:

@Override public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.map);........if(servicesConnected()){initMapView();} }

?

servicesConnected 檢查service是否可用

private boolean servicesConnected() {// Check that Google Play services is availableint resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);// If Google Play services is availableif(ConnectionResult.SUCCESS == resultCode) {log("Google Play services is available.");isServiceOk = true;} else {// Get the error codeConnectionResult connectionResult = new ConnectionResult(resultCode, null);int errorCode = connectionResult.getErrorCode();// Get the error dialog from Google Play servicesDialog errorDialog = GooglePlayServicesUtil.getErrorDialog(errorCode,this,RESULT_CODE_SERVICE_FAILURE);// If Google Play services can provide an error dialogif(errorDialog != null) {errorDialog.show();}isServiceOk = false;}return isServiceOk; }

上一篇說過,手機調試環境需要安裝Google Play服務和play store。如果沒有安裝,這里就會返回錯誤碼。

?

initMapView 初始化

1 private void initMapView(){ 2 mMapView = ((MapFragment)getFragmentManager().findFragmentById(R.id.map_view)).getMap(); 3 mMapView.setMapType(GoogleMap.MAP_TYPE_NORMAL); 4 5 UiSettings setting = mMapView.getUiSettings(); 6 setting.setTiltGesturesEnabled(true); 7 //setting.setCompassEnabled(false); 8 } 9

2行,獲得地圖對象 GoogleMap mMapView;后面很多操作都要通過它。

3行,設在地圖模式為normal

4行,UiSettings 設置人機交互相關的各種按鈕手勢等待,例如:

void setTiltGesturesEnabled(boolean)? 是否允許手勢改變視角;

void setCompassEnabled(boolean)? 是否顯示指南針;

詳細的UiSettings用法可參考官文 https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/UiSettings

?

移動到經緯度地點

先闡明一個概念,Goolge Map假定地圖本身是固定不動的,移動的是camera(public final class CameraUpdate)。

想象一下,在地球上空漂浮著一只佳能無敵兔,把鏡頭對準魔都,焦距拉近看到了一號線,再拉遠,視角傾斜一下,看到了魔都全貌,還是帶廣角的。不錯吧!

?

回到代碼,這里需要用的GPS。通過LocationManager來獲得位置服務

mLocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); mGPSOk = mLocManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

獲得LocationManager,并檢查GPS是否可用。

在onResume函數中注冊監聽

1 @Override 2 protected void onResume(){ 3 super.onResume(); 4 if(isServiceOk == false) 5 return; 6 7 String provider = getBestProvider(); 8 if(provider != null){ 9 mLocManager.requestLocationUpdates(provider, 5*1000, 1, this); 10 } 11 12 updateCurrentLoction(); 13 setLatLng(); 14 }

7行,獲得可用的Location Provider,開啟GPS的情況下這里得到的是GPS provider

9行,注冊位置變化監聽。第二入參5*1000表示每隔5秒更新一次,第三入參表示移動超過1米更新一次。最后一個入參即LocationListener,由于activity implement了LocationListener,所以這里只需要給activity的this指針。

12行和13行的兩個函數,用于主動獲取最新位置,移動地圖到該位置,稍后貼出。

先看一下位置變化的監聽函數,activity在implement了LocationListener后 需要實現一下幾個函數:

1 /* LocationListener begin */ 2 @Override 3 public void onLocationChanged(Location newLoction) { 4 if(mLocation != null){ 5 mLocation.setLatitude(newLoction.getLatitude()); 6 mLocation.setLongitude(newLoction.getLongitude()); 7 animateLatLng(); 8 } 9 } 10 11 @Override 12 public void onProviderDisabled(String arg0) { 13 // TODO Auto-generated method stub 14 } 15 @Override 16 public void onProviderEnabled(String arg0) { 17 // TODO Auto-generated method stub 18 } 19 @Override 20 public void onStatusChanged(String arg0, int arg1, Bundle arg2) { 21 } 22 /* LocationListener end */

3~9行,我這里只處理了onLocationChanged,這個函數在location發生變化時會調用到。

我們用了一個私有數據:private Location mLocation = null;

onLocationChanged函數中,把新的location保存到mLocation中,然后調用animateLatLng把地圖移動到該位置。

=================================================================

mLocation用于記錄每次更新的經緯度,建議在onPause的時候把這個數據保存到本地,我是保存在preference中的。在onResume時讀出來。

這樣可以避免gps不可用的時候,地圖飛回非洲。

當然也可一增加一個對network provider的監聽,通過網絡獲取不太準確的位置,這部份我沒做完整。

因為火星坐標系的問題,我最后換了baidu map,google map的這個apk很多后續的優化就沒做了,汗吧!

=================================================================

有時我們需要主動查詢最新的Location

1 2 private void updateCurrentLoction(){ 3 String bestProvider = getBestProvider(); 4 Location newLoction = null; 5 6 if(bestProvider != null) 7 newLoction = mLocManager.getLastKnownLocation(bestProvider); 8 9 if(mLocation == null){ 10 mLocation = new Location(""); 11 } 12 13 if(newLoction != null){ 14 mLocation.setLatitude(newLoction.getLatitude()); 15 mLocation.setLongitude(newLoction.getLongitude()); 16 } 17 }

3行,獲取最優的provider

7行,獲取最近一次的location

8~16行,同樣的,新位置記錄到mLocation中。

getBestProvider函數體如下:

private String getBestProvider(){? ????
??? Criteria criteria = new Criteria();
??? criteria.setPowerRequirement(Criteria.POWER_LOW);
??? criteria.setAccuracy(Criteria.ACCURACY_FINE);
??? String bestOne = mLocManager.getBestProvider(criteria, true);
??? return bestOne;
}

?

上文用到的兩個函數setLatLng()和animateLatLng()

?

1 private void setLatLng(boolean marked){ 2 if(mLocation == null){ 3 Toast.makeText(this, R.string.gpserr, Toast.LENGTH_LONG).show(); 4 return; 5 } 6 7 double dLat = mLocation.getLatitude(); 8 double dLong = mLocation.getLongitude(); 9 log("setLatLng: (" + dLat + "," + dLong + ")"); 10 11 //LatLng latlng = new LatLng(31.13893, 121.39668); 12 LatLng latlng = new LatLng(dLat, dLong); 13 if((latlng.latitude == 0) && (latlng.longitude == 0)){ 14 //mMapView.moveCamera(CameraUpdateFactory.newLatLng(latlng)); 15 }else{ 16 mMapView.moveCamera(CameraUpdateFactory.newLatLngZoom(latlng, 15)); 17 } 18 } 19 20 private void animateLatLng(boolean guide){ 21 if(mLocation == null){ 22 Toast.makeText(this, R.string.gpserr, Toast.LENGTH_LONG).show(); 23 return; 24 } 25 26 double dLat = mLocation.getLatitude(); 27 double dLong = mLocation.getLongitude(); 28 log("animateLatLng: (" + dLat + "," + dLong + ")"); 29 LatLng latlng = new LatLng(dLat, dLong); 30 31 mMapView.animateCamera(CameraUpdateFactory.newLatLng(latlng)); 32 }

?

先看第一個setLatLng()

7~8行,從mLocation中調用getLatitude()取得維度,getLongitude()取得經度。

12行,構造一個LatLng對象

16行, mMapView.moveCamera(CameraUpdateFactory.newLatLngZoom(latlng, 15));

CameraUpdateFactory.newLatLngZoom(latlng, 15) 返回一個CameraUpdate對象,入參是經緯度和zoom level;

GoogleMap的moveCamera方法把地圖移動到該位置。

animateLatLng()函數

31行? 基本相同,唯一的區別是最后調用的是animateCamera,我們會看到地圖從原location移動到新location的過程。而moveCamera方法是瞬移過去的,不會看到移動過程。

CameraUpdate有很多中構造方法,可以單獨或同時指定位置和放大倍數。指定邊界等待,詳見

https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/CameraUpdateFactory

?

?

最后,要在onPause函數中注銷位置服務監聽

mLocManager.removeUpdates(this);

?

?

?

轉載于:https://www.cnblogs.com/inkheart0124/p/3536322.html

總結

以上是生活随笔為你收集整理的Google Map API v2 步步为营 (二)----- Location的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 动漫精品一区一码二码三码四码 | 亚洲精品999 | 伊人激情在线 | 日韩中文字幕网站 | 欧美视频一区二区 | 99热国产在线观看 | 日韩欧美国产精品 | 欧美大片免费高清观看 | 99av视频| 天天操天天添 | av香港经典三级级 在线 | 日韩不卡一区二区三区 | 一区二区三区欧美 | 人与禽一级全黄 | 狠狠操在线 | 老鸭窝视频在线观看 | 成人av不卡| 日韩欧美精品一区二区 | 日韩一级伦理片 | 91人妻一区二区 | 日韩精品一二三 | 国产小视频免费在线观看 | 免费看国产精品 | 天堂网男人 | 巨胸挤奶视频www网站 | 欧美网 | 国产精品视频导航 | 久久cao| 日韩v在线| 涩涩视频网址 | 日韩大片免费 | 日韩草比 | 国产午夜片 | 日韩激情视频一区二区 | www.国产区 | 中国在线观看免费视频 | 在线观看免费观看在线 | 中文字幕色网 | 少妇高潮灌满白浆毛片免费看 | 小少妇哺乳喂奶播放 | 精品一区二区三区毛片 | 亚洲精选一区二区三区 | 看黄色大片| 中文字幕一区二区在线播放 | 日本69式三人交 | 色婷婷导航 | 欧美午夜大片 | 日韩无码精品一区二区三区 | 黄页网站免费观看 | 88xx成人永久免费观看 | 亚洲一区不卡 | 天堂一区在线 | 日本免费一区二区三区视频 | 99精品国产99久久久久久97 | 午夜激情久久久 | 男女视频在线免费观看 | 无码人妻精品一区二区蜜桃视频 | 激情五月婷婷网 | 男女做事网站 | 深夜福利91| www九色| 黑森林av凹凸导航 | 中日毛片 | 国产麻豆剧传媒精品国产 | 亚洲深夜视频 | 欧美交| 黄色录像网址 | 色女人影院 | 国产无套内射又大又猛又粗又爽 | 亚洲天堂一区二区在线观看 | 一区二区国产精品视频 | 亚洲欧美一区二区三区四区 | 91网站免费 | 精品久久久久一区二区 | 国产成人精品电影 | 操操网站| 一区二区三区精品在线 | 视频一区二区中文字幕 | 成人一二三四区 | 国产精品国产三级国产Av车上的 | av最新地址 | 综合久久综合 | 中文字幕国产一区 | 久久久精品动漫 | 欧洲金发美女大战黑人 | 日韩成人午夜 | av伦理在线 | 久久丫精品忘忧草西安产品 | 黄色视屏在线播放 | 天天躁日日躁aaaxxⅹ | 久久久精品麻豆 | www免费黄色 | a黄色片 | 蜜色av | 国产精品四虎 | 色一情一交一乱一区二区三区 | 国产欧美在线视频 | 成人a毛片 | 亚洲第一二区 |