百度地图之定位
来源:互联网 发布:机器人技术基础知乎 编辑:程序博客网 时间:2024/05/17 07:10
package com.demo.map;import android.Manifest;import android.content.pm.PackageManager;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.widget.Button;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.baidu.mapapi.map.BitmapDescriptor;import com.baidu.mapapi.map.MapStatus;import com.baidu.mapapi.map.MapStatusUpdateFactory;import com.baidu.mapapi.map.MyLocationConfiguration;import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;import com.baidu.mapapi.SDKInitializer;import com.baidu.mapapi.map.BaiduMap;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.MyLocationData;import com.baidu.mapapi.model.LatLng;public class MainActivity extends AppCompatActivity{ //地图相关 /** * 百度地图控件 */ MapView mMapView=null; /** * 百度地图实例 */ BaiduMap mBaidumap=null; //定位相关 /** * 定位客户端 */ LocationClient mLocClient; /** * 定位模式 */ private LocationMode mCurrentMode; /** * 定位图标 */ BitmapDescriptor mCurrentMarker; /** * 传感器管理器 */ private SensorManager mSensorManager; /** * 当前方向 */ private int mCurrentDirection=0; /** * 当前经度 */ private double mCurrentLat=0.0; /** * 当前纬度 */ private double mCurrentLon=0.0; /** * 当前经度 */ private float mCurrentAccracy; /** * 是否首次定位 */ boolean isFirstLoc=true; /** * 定位数据 */ private MyLocationData locData; /** * 定位监听 */ private MyLocationListener myListener=new MyLocationListener(); /** * 方向监听 */ private DirectionSensorListener DirectionListener=new DirectionSensorListener(); /** * 上一次的方向 */ private Double lastX=0.0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); mSensorManager= (SensorManager) getSystemService(SENSOR_SERVICE);//获取传感器管理服务 mCurrentMode= LocationMode.NORMAL; //初始化地图 mMapView= (MapView) findViewById(R.id.map); mBaidumap=mMapView.getMap(); //开启定位图层 mBaidumap.setMyLocationEnabled(true); //定位初始化 mLocClient=new LocationClient(this); mLocClient.registerLocationListener(myListener); LocationClientOption option=new LocationClientOption(); option.setOpenGps(true);//打开GPS option.setCoorType("bd09ll");//设置坐标类型 option.setIsNeedAddress(true);//是否需要地址信息 option.setScanSpan(1000); LocationPermission(); mLocClient.setLocOption(option); } /** * 获取GPS定位权限(Android6.0 以上需要动态获取权限) */ private void LocationPermission() { int checkPermission = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION); if (checkPermission != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1); Log.d("未获得定位权限", "弹出提示"); return; } } /** * 方向监听 */ public class DirectionSensorListener implements SensorEventListener{ @Override public void onSensorChanged(SensorEvent event) { double x=event.values[SensorManager.DATA_X]; if(Math.abs(x-lastX)>1.0){ mCurrentDirection= (int) x; //设置定位数据 locData=new MyLocationData.Builder() .accuracy(mCurrentAccracy)//精度 .direction(mCurrentDirection) //此处设置开发者获取到的方向信息,顺时针0-360 .latitude(mCurrentLat)//经度 .longitude(mCurrentLon)//纬度 .build(); mBaidumap.setMyLocationData(locData); } lastX=x; } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } } /** * 定位监听 */ public class MyLocationListener implements BDLocationListener{ @Override public void onReceiveLocation(BDLocation bdLocation) { //map view销毁后不在处理新接受的位置 if(bdLocation==null||mMapView==null) { return; } mCurrentLat=bdLocation.getLatitude(); mCurrentLon=bdLocation.getLongitude(); mCurrentAccracy=bdLocation.getRadius(); //设置定位数据 locData=new MyLocationData.Builder() .accuracy(bdLocation.getRadius())//精度 .direction(mCurrentDirection) //此处设置开发者获取到的方向信息,顺时针0-360 .latitude(bdLocation.getLatitude())//经度 .longitude(bdLocation.getLongitude())//纬度 .build(); mBaidumap.setMyLocationData(locData); //第一次定位时,将地图位置移动到当前位置 if(isFirstLoc){ isFirstLoc=false; LatLng ll=new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude()); MapStatus.Builder builder=new MapStatus.Builder(); builder.target(ll).zoom(18.0f); mBaidumap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build())); mCurrentMarker = null; mBaidumap .setMyLocationConfiguration(new MyLocationConfiguration( mCurrentMode, true, null)); } } } //生命周期 @Override protected void onStart() { //为系统的方向传感器注册监听器 mSensorManager.registerListener(DirectionListener,mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION) ,SensorManager.SENSOR_DELAY_UI); //启动监听 mLocClient.start(); super.onStart(); } @Override protected void onPause() { mMapView.onPause(); super.onPause(); } @Override protected void onResume() { mMapView.onResume(); super.onResume(); } @Override protected void onStop() { //取消传感器监听 mSensorManager.unregisterListener(DirectionListener); super.onStop(); } @Override protected void onDestroy() { //退出时销毁定位 mLocClient.stop(); //关闭定位图层 mBaidumap.setMyLocationEnabled(false); mMapView.onDestroy(); mMapView=null; super.onDestroy(); }}
1、在定位监听(MyLocationListener)的回调函数中设置定位的数据
2、在传感器监听(DirectionSensorListener)的回调函数中设置方向数据。
3、需要注意的是 Android6.0以上版本,部分权限除了需要在配置清单文件中添加权限之外,还需要动态的获取权限
阅读全文
0 0
- 百度地图之定位
- 百度地图之定位
- 百度地图之定位
- 百度地图之定位
- 百度地图之定位
- 百度地图 之 定位
- 百度地图之定位
- 百度地图之简单定位
- 百度地图之自我定位
- 百度地图之定位,最新版
- 百度地图之定位数据
- 百度地图之SDK定位
- 百度地图开发之【定位】
- 百度地图之定位当前
- 百度地图开发之定位
- Android百度地图之定位
- 百度地图之定位篇
- 浏览器定位之 - 百度定位地图显示
- iOS 将文本复制到剪切板
- Ubuntu常用指令
- java-单链表
- replaceBlank
- Kolla单节点部署OpenStack Ocata
- 百度地图之定位
- jsp九大内置对象小结
- 利用Python处理Excel数据
- 337C
- 通过Anaconda安装Python
- 通过webservice发布静态页面
- B
- XAMPP里tomcat启动报错:Make sure you have Java JDK or JRE installed and the required ports are free
- 开始我的图像处理学习