android百度地图自动定位
最近一直在研究百度地圖方面的項目,第一次接觸,多多少少有些不知所措,因此,掉坑是經常的事,用我們猿人的話說,經常跳坑的猿人才是真正的猿人(出自個人,嘻嘻),所以,掉坑不是壞事,而是咱們猿人掌握知識的必不可少的部分。雖然,掉坑正常,但是重復掉同樣的坑就有點。。。。。。所以,猿人還有一個最重要的特質就是善于總結,得出自己套路,這樣才會避免每次都會在同一地點摔跤。。。。。。
上面說到了研究百度地圖方面的項目,在閑暇之余呢,我就想自己實現一個簡單的定位功能,經過短時間的代碼實現,發現并沒有實現定位功能,經過debugger發現,provider一直為null,然后各種百度啊,查看百度地圖API啊,并沒有得與解決,然后我就一直梳理整個思路,最終把問題定位在權限這塊,最終才得以解決。所以,在這我也想吧我經歷的這個坑給記錄下來,給大家分享分享。(由于剛接觸,道行還不深,真知灼見,還望海涵)。
說到,集成百度地圖,那就離不開百度地圖SDK,怎么申請百度的API_KEY在這就不多說了,度娘那一大推。。。。。但是申請完API_KEY只后一定得記住,不過不記住也沒關系,在百度地圖開發者中心能查看的到。
開始吧。。。。。。
一、添加jar包,百度地圖SDK和百度定位SDK的jar拷貝到工程的libs中
二、在清單文件中添加permission(權限)
三、將申請的百度地圖API_KEY添加到清單文件中
四、在清單文件中注冊定位服務service
五、布局文件
六、MainActivity代碼
(1)控件的初始化
(2)首先應該檢測gps是否正常,如果設備的gps沒開啟,需提示用戶開啟
(3)通過系統系統的Criteria類選擇合適的地理位置和設置只要展示的數據類型,以下是最常用的幾種類型:
具體的方法如下:
此時程序會報錯,報錯的地方就是在調用getLastKnownLocation()方法時,因為此時是在訪問系統的東西,系統內的東西的權限使用是相當嚴格的,所以,我們需要在此處check permission,判斷一下權限或者try…catch…一下
如果不這樣,系統會啟動安全保護(SecurityException),不會執行獲取GPS信息,此時的provider一直是null的,再繼續。。。。。
(4)實現對位置移動的監聽,監聽內需實現locationListener的四個方法,分別是紅色區域內圈出的。。。。。
(5)實現定位的方法,并且改變地圖展示的層級
由于GPS返回回來的坐標是沒有經過處理的,所以需要轉換成百度地圖一直的坐標,按理說需要Gis的換算才能與百度地圖吻合上,這就有點麻煩了,對Gis不了解的猿人肯定是一臉懵逼,不知如何下手啊,干著急啊,,,,就度娘啊,還是一臉懵逼啊,其實很多朋友都忽略了一點,就是百度地圖API,他既然能提供SDK,那么這塊的基本轉換的接口肯定是有的,果不其然,官方API文檔提供了自動轉換的類,如下:
因此在定位的方法內,先將GPS返回的的經緯度進行轉換,加上以上3行代碼,輕輕松松解決了。。。。。
此時本應該可以完事的,但是在Android6.0之后的設備運行會出問題,別忘了添加運行時權限,因此還需加上一下代碼
最后在oncreat()方法內調用requestPermissions()方法,即可,requestPermissions()在哪調用這是關鍵,這是第一個坑,當時我不是在oncreate()內調用的,在調試的時候一直不會定位,可把我給愁的
那么第二個坑接著就來了,咱們在位置發生變化時需要調用以下方法
那么當緊接著移動的時候,上一次的對象應該移除掉,因此需要在監聽內執行remove操作,這一點很多朋友會忽視
至此,整個自動定位的功能的實現和我所遇到的坑都描述完了,寫得不是很好,但是還是希望能幫助到大家,歡迎大家指正!!!謝謝
import android.Manifest; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.provider.Settings; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.widget.Toast;import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.utils.CoordinateConverter;public class MainActivity extends AppCompatActivity {private MapView mapView;private BaiduMap aMap;private boolean isFirstLocate = true;private LocationManager locationManager;private String provider;// 權限請求碼private final int REQUEST_CODE = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);SDKInitializer.initialize(getApplicationContext());setContentView(R.layout.activity_main);initView();requestPermissions();locationManager = (LocationManager) MainActivity.this.getSystemService(Context.LOCATION_SERVICE);openGPSSetting();getLocation();}private void initView() {mapView = (MapView) findViewById(R.id.mapView);aMap = mapView.getMap();// 開啟交通圖aMap.setTrafficEnabled(true); // 設置地圖展示的方式:衛星地圖等aMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);}//定位private void navigateTo(Location location) {if (isFirstLocate) {LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());// 將google地圖、soso地圖、aliyun地圖、mapabc地圖和amap地圖// 所用坐標轉換成百度坐標CoordinateConverter converter = new CoordinateConverter();converter.from(CoordinateConverter.CoordType.COMMON);//sourceLatLng待轉換坐標converter.coord(ll);LatLng desLatLng = converter.convert();MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(desLatLng);aMap.animateMapStatus(update);update = MapStatusUpdateFactory.zoomTo(17f);aMap.animateMapStatus(update);isFirstLocate = false;}}//檢測gps模塊是否正常private void openGPSSetting() {if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {Toast.makeText(this, "GPS模塊正常", Toast.LENGTH_SHORT).show();return;}Toast.makeText(this, "請開啟GPS!", Toast.LENGTH_SHORT).show();// 跳轉到GPS的設置頁面Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);startActivityForResult(intent, 0); // 此為設置完成后返回到獲取界面}private void getLocation() {// android通過criteria選擇合適的地理位置服務Criteria criteria = new Criteria();criteria.setAccuracy(Criteria.ACCURACY_FINE);// 高精度criteria.setAltitudeRequired(false);// 設置不需要獲取海拔方向數據criteria.setBearingRequired(false);// 設置不需要獲取方位數據criteria.setCostAllowed(false);// 設置允許產生資費criteria.setPowerRequirement(Criteria.POWER_LOW);// 低功耗provider = locationManager.getBestProvider(criteria, true);// 獲取GPS信息requestPermissions();if (ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) !=PackageManager.PERMISSION_GRANTED) {// TODO: Consider calling// ActivityCompat#requestPermissions// here to request the missing permissions, and then overriding// public void onRequestPermissionsResult(int requestCode, String[] permissions,// int[] grantResults)// to handle the case where the user grants the permission. See the documentation// for ActivityCompat#requestPermissions for more details.return;}Location location = locationManager.getLastKnownLocation(provider);// 通過GPS獲取位置updateUIToNewLocation(location); // 設置監聽器,自動更新的最小時間為間隔N秒(這里的單位是微秒)或最小位移變化超過N米(這里的單位是米)locationManager.requestLocationUpdates(provider, 1 * 1000, 0.00001F,locationListener);}private void updateUIToNewLocation(Location location) {if (location != null) {navigateTo(location);Toast.makeText(this, "緯度" + location.getLatitude(), Toast.LENGTH_SHORT).show();Toast.makeText(this, "經度" + location.getLongitude(), Toast.LENGTH_SHORT).show();// Location類的方法:// getAccuracy():精度(ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION)// getAltitude():海撥// getBearing():方位,行動方向// getLatitude():緯度// getLongitude():經度// getProvider():位置提供者(GPS/NETWORK)// getSpeed():速度// getTime():時刻} else {Toast.makeText(this, "無法獲取地理信息", Toast.LENGTH_SHORT).show();}}//// 定義對位置變化的監聽函數LocationListener locationListener = new LocationListener() {public void onLocationChanged(Location location) {if (location != null) {navigateTo(location);}if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {// TODO: Consider calling// ActivityCompat#requestPermissions// here to request the missing permissions, and then overriding// public void onRequestPermissionsResult(int requestCode, String[] permissions,// int[] grantResults)// to handle the case where the user grants the permission. See the documentation// for ActivityCompat#requestPermissions for more details.return;}locationManager.removeUpdates(this); // locationManager.setTestProviderEnabled(provider, false);}public void onStatusChanged(String provider, int status, Bundle extras) {}public void onProviderEnabled(String provider) {}public void onProviderDisabled(String provider) {}};private void requestPermissions() {if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {// 申請權限ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE);}}// 請求運行時權限的回調方法// requestCode:用于識別申請權限的請求碼// permissions:請求的權限// grantResults:對應權限的請求結果@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch (requestCode) {case REQUEST_CODE:if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 允許權限Toast.makeText(MainActivity.this, "允許權限", Toast.LENGTH_SHORT).show();} else {// 拒絕權限Toast.makeText(MainActivity.this, "拒絕權限", Toast.LENGTH_SHORT).show();}break;}}}總結
以上是生活随笔為你收集整理的android百度地图自动定位的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV4.5.2(+opencv_
- 下一篇: android:layout_gravi