定位到当前位置 百度地图android_android开发百度地图 定位到当前位置 - CSDN
  • 问题描述:Android百度地图进行定位,如果我们要将当前位置显示地图上,在使用时我们会用到定位监听器,然后将获得位置对BaiduMap对象进行位置上的更新,达到显示当前位置的目的。由于我们在定位后还可能要...

    问题描述:Android中百度地图进行定位,如果我们要将当前位置显示到地图上,在使用时我们会用到定位监听器,然后将获得到的位置对BaiduMap对象进行位置上的更新,达到显示当前位置的目的。由于我们在定位后还可能要进行自主的移动,则我们会用一个flag标识是否已经定位到当前的位置。但是在使用flag后,由于第一次定位,BaiduMap可能还未加载成功,导致地图无法移动到我们当前位置。

    解决方式:在地图移动成功后再进行flag的修改。

    改后的代码:

    	/*移动到指定位置*/
    	private void navigateTo(BDLocation location){
    	    if (isFirstLocate){
    	        LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());
    	        MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
    	        mBaiduMap.animateMapStatus(update);
    	        update = MapStatusUpdateFactory.zoomTo(16f);
    	        mBaiduMap.animateMapStatus(update);
    	        /*判断baiduMap是已经移动到指定位置*/
    	        if (mBaiduMap.getLocationData()!=null)
    	        if (mBaiduMap.getLocationData().latitude==location.getLatitude()
    	                &&mBaiduMap.getLocationData().longitude==location.getLongitude()){
    	            isFirstLocate = false;
    	        }
    	    }
    	    MyLocationData.Builder locationBuilder =
    	            new MyLocationData.Builder();
    	    locationBuilder.latitude(location.getLatitude());
    	    locationBuilder.longitude(location.getLongitude());
    	    MyLocationData locationData = locationBuilder.build();
    	    mBaiduMap.setMyLocationData(locationData);
    	}
    注:在描述中如果出现问题,希望大家能够指正。

    展开全文
  • 文章目录配置百度地图获取 SHA1获取百度地图密钥(AK)配置 Android Studio显示地图配置 AndroidManifest.xml 文件在布局文件中添加地图容器初始化地图管理MapView生命周期定位到当前位置配置 AndroidManifest.xml ...


    其实百度地图的官方文档已经很详细了,按照文档中的步骤来进行配置就能行。
    在此记录一下 Android 中引入百度地图实现定位信息步骤,顺便解决其中遇到的

    百度地图官网

    以下操作基于 Android Studio 3.5

    配置百度地图

    获取 SHA1

    这里先来讲一下怎么获取 SHA1,因为在配置百度地图时会使用 SHA1。
    步骤在百度地图官网有详细说明,参考 http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-project/ak
    获取方式有两种,但本质都相同:
    方式一:
    找到自己安装 Android SDK 的位置(默认位置是 C:\用户\用户名 ),该位置下面有一个 .android 文件夹:
    在这里插入图片描述
    使用 cmd 命令进入该文件夹下:
    在这里插入图片描述
    然后执行命令 keytool -list -v -keystore debug.keystore
    在这里插入图片描述
    最后就可以得到自己的 SHA1 了。
    方式二:
    在 Android Studio 中通过命令行获取,步骤如下:
    点击左下角的 Terminal
    首先执行 c: 进入 .android 所在盘符(我的是 C 盘)
    然后执行 cd /Users/w/.android,进入 .android 文件夹
    接下来的步骤同方式一。
    在这里插入图片描述

    获取百度地图密钥(AK)

    进入百度地图官网,先注册百度账号,然后申请成为开发者,这两步非常简单,就不在此说明。
    成为开发者之后,点击获取密钥:
    在这里插入图片描述
    然后会进入控制台,点击创建应用。(第一次进入时没有任何应用,这里我已经创建了一个应用)
    在这里插入图片描述
    创建应用:

    1. 应用名称随便设置一个即可
      在这里插入图片描述
    2. 应用类型选择 Android SDK
      在这里插入图片描述
    3. 启用服务用默认的即可(默认是全部勾选的,可根据自己的需求来选择),这里我使用默认
      在这里插入图片描述
    4. 接着设置发布版 SHA1(在上面的步骤中我们已经得到了SHA1),可不用设置开发版 SHA1
      在这里插入图片描述
    5. 然后设置包名,此包名必须和项目的包名一致
      在这里插入图片描述
      在这里插入图片描述
    6. 最后提交即可。

    提交之后就可以看见我们刚才创建的应用了:
    在这里插入图片描述

    配置 Android Studio

    其实在百度地图官网中有详细的步骤,可参考官网的。
    首先,下载开发包:
    在这里插入图片描述
    然后选择自己需要的,然后下载即可:
    注意,要想使用定位功能的话,必须下载基础定位、离线定位、室内定位和全量定位其中的一个,这一点在官网的文档中也有说明。
    在这里插入图片描述
    下载完成后解压,解压后的文件如下:
    在这里插入图片描述
    其中的 libs 文件目录:
    在这里插入图片描述
    然后在 Android Studio 中进行配置:

    1. 添加jar文件
      打开解压后的开发包文件夹,找到 BaiduLBS_Android.jar 文件将其拷贝至工程的 app/libs 目录下
      在这里插入图片描述

    2. 添加so文件
      在src/main/目录下新建 jniLibs 目录(如果您的项目中已经包含该目录不用重复创建),在下载的开发包中拷贝项目中需要的CPU架构对应的so文件文件夹到jniLibs目录
      在这里插入图片描述
      在这里插入图片描述

    3. 往工程中添加jar文件
      在工程配置中需要将前面添加的jar文件集成到我们的工程中。
      在libs目录下,选中每一个jar文件(此处只有一个 BaiduLbs_Android.jar )右键,选择 Add As Library
      在这里插入图片描述
      此时会发现在 app 目录的 build.gradle 的 dependencies 块中生成了工程所依赖的jar文件的对应说明,如下所示:
      在这里插入图片描述
      注意:最新版本的Android Studio中compile被替换为implementation,具体的写法与您的Android Studio版本有关。

    4. 配置应用混淆
      打开app目录下的build.gradle文件,在release代码块中添加如下内容(若已经由Android Studio自动生成,则不用手动配置)

    proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    

    在这里插入图片描述
    编写混淆文件,打开app目录下的proguard-rules.pro文件,添加如下代码。

    -keep class com.baidu.** {*;}
    -keep class mapsdkvi.com.** {*;}    
    -dontwarn com.baidu.**
    

    至此已完成AndroidStudio开发环境的配置,接下来就使用百度地图。

    显示地图

    配置 AndroidManifest.xml 文件

    1. <application>中加入如下代码配置开发密钥(AK):
    <application>  
        <meta-data  
            android:name="com.baidu.lbsapi.API_KEY"  
            android:value="开发者 key" />  
    </application>
    

    在这里插入图片描述

    AK 的获取如下:
    在这里插入图片描述
    2. 在 <application/>外部添加如下权限声明:

    <!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,POI检索等 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 获取网络状态,根据网络状态切换进行数据请求网络转换 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- 读取外置存储。如果开发者使用了so动态加载功能并且把so文件放在了外置存储区域,则需要申请该权限,否则不需要 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!-- 写外置存储。如果开发者使用了离线地图,并且数据写在外置存储区域,则需要申请该权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    

    在这里插入图片描述

    在布局文件中添加地图容器

    <com.baidu.mapapi.map.MapView  
        android:id="@+id/bmapView"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:clickable="true" />
    

    初始化地图

    方式一:
    新建一个自定义的 Application 类 DemoApplication.java,在其onCreate方法中完成SDK的初始化。示例代码如下:

    public class DemoApplication extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
            //在使用SDK各组件之前初始化context信息,传入ApplicationContext   
            SDKInitializer.initialize(this);
            //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
            //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
            SDKInitializer.setCoordType(CoordType.BD09LL);
        }
    }
    

    然后在AndroidManifest.xml文件中声明该Application
    在这里插入图片描述
    方式二:
    直接在 Activity 中初始化:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // 初始化地图,此语句必须放在布局初始化(即 setContentView() )之前
            SDKInitializer.initialize(getApplicationContext());
            setContentView(R.layout.activity_mylocation);
        }
    }
    

    管理MapView生命周期

    在 Activity 中添加如下代码:

    public class MainActivity extends Activity {  
        private MapView mMapView = null;  
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState); 
            // 初始化地图,此语句必须放在布局初始化(即 setContentView() )之前
            // 地图初始化,在初始化方法中任选一种即可
            // SDKInitializer.initialize(getApplicationContext());   
            setContentView(R.layout.activity_main);  
            //获取地图控件引用  
            mMapView = findViewById(R.id.bmapView);  
        }  
        @Override  
        protected void onResume() {  
           super.onResume();  
           //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理  
           mMapView.onResume();  
        }  
        @Override  
        protected void onPause() {  
          super.onPause();  
          //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  
          mMapView.onPause();  
        } 
        @Override  
        protected void onDestroy() {  
          super.onDestroy();  
          //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理  
          mMapView.onDestroy();  
        }  
    }
    

    最后,运行即可,建议在真机上运行,真机运行的配置步骤在后面有提到。
    坑1:在运行时,可能出现地图不显示的情况,这时手动打开该应用获取位置信息的权限,这点非常重要。

    运行效果(默认就是定位在北京):
    在这里插入图片描述
    坑2:如果开发包中只包含以下应用,则程序会在运行时闪退:
    在这里插入图片描述
    对比上面下载的开发包,此处没有选择全景图功能,下载后的文件解压后如下:
    在这里插入图片描述
    会发现,少了一个 jar 包,刚开始以为没多大区别,反正配置的时候也就只使用了 BaiduLBS_Android.jar,结果程序运行时直接闪退,这个 bug 找了好久才发现(基于 Android Studio 3.6上运行时出现闪退),最后发现只要在下载开发包时加上全景图功能就行了。

    真机运行

    可以使用无线和USB连接电脑的方式在手机上调试程序。在此使用USB的方式,步骤如下:

    1. USB连接电脑,并在手机的 仅充电/传输文件 选项中选择 传输文件
    2. 进入关于手机,然后 连续点击版本号,直到提示当前已是开发者模式
    3. 进入更多设置,打开 允许安装未知来源 的软件。
    4. 进入更多设置,进入 开发者模式,然后打开 USB调试USB安装(如果有的话)。
    5. 等待电脑自动配置(速度很快)。
    6. 然后在 AS (Android Studio)中,选择自己的手机运行即可(AS会自动识别当前手机)
    7. 初次运行可能会给手机上安装适配的驱动,安装即可。

    定位到当前位置

    确保开发包中包含基本定位功能,在下载开发包时,我已经提到过,要想定位的话,就必须下载基础定位、离线定位、室内定位和全量定位其中的一个
    在这里插入图片描述

    配置 AndroidManifest.xml 文件

    1. 添加定位权限
      在显示地图的前提下,需要额外配置如下权限:
    <!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,POI检索等 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 获取网络状态,根据网络状态切换进行数据请求网络转换 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- 读取外置存储。如果开发者使用了so动态加载功能并且把so文件放在了外置存储区域,则需要申请该权限,否则不需要 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!-- 写外置存储。如果开发者使用了离线地图,并且数据写在外置存储区域,则需要申请该权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    
    <!-- 以上是显示地图的权限,如果你已经配置过,就不用再配置了 -->
    
    <!-- ----------------------- 分 割 线 ----------------------- -->
    
    <!-- 以下是获取当前位置的权限,也就是需要额外加上的权限 -->
    <!-- 这个权限用于进行网络定位 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- 这个权限用于访问GPS定位 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    
    1. 在Application标签中声明定位的service组件
    <service android:name="com.baidu.location.f"
        android:enabled="true"
        android:process=":remote"/>
    

    在这里插入图片描述
    当然了,这一步也需要添加 AK,由于我们在显示地图时,已经添加过了,所以就可以不用添加了(如已添加过,请忽略此步骤):

    <application>  
        <meta-data  
            android:name="com.baidu.lbsapi.API_KEY"  
            android:value="开发者 key" />  
    </application>
    

    布局

    <com.baidu.mapapi.map.MapView
            android:id="@+id/bmapView"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:clickable="true" />
    
    <TextView
            android:id="@+id/text_tishi"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="原始的textView"
            android:layout_marginTop="20dp"
            android:textSize="13sp"
            android:gravity="center"
            android:padding="10dp"/>
    

    编码

    接下来就是编码了,话不多说,直接上代码(大部分都是在官网直接抄的):

    package com.dysy.lsidemo;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.widget.TextView;
    
    import com.baidu.location.BDAbstractLocationListener;
    import com.baidu.location.BDLocation;
    import com.baidu.location.LocationClient;
    import com.baidu.location.LocationClientOption;
    import com.baidu.mapapi.map.BaiduMap;
    import com.baidu.mapapi.map.BitmapDescriptor;
    import com.baidu.mapapi.map.BitmapDescriptorFactory;
    import com.baidu.mapapi.map.MapStatusUpdateFactory;
    import com.baidu.mapapi.map.MapView;
    import com.baidu.mapapi.map.MyLocationConfiguration;
    import com.baidu.mapapi.map.MyLocationData;
    import com.baidu.mapapi.model.LatLng;
    
    public class MainActivity extends AppCompatActivity {
        private MapView mMapView = null;
        private BaiduMap mBaiduMap = null;
        private LocationClient mLocationClient = null;
        private TextView mtextView;
        // 是否是第一次定位
        private boolean isFirstLocate = true;
        // 当前定位模式
        private MyLocationConfiguration.LocationMode locationMode;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //获取地图控件引用
            mMapView = findViewById(R.id.bmapView);
            //获取文本显示控件
            mtextView = findViewById(R.id.text_tishi);
    		// 得到地图
            mBaiduMap = mMapView.getMap();
            // 开启定位图层
            mBaiduMap.setMyLocationEnabled(true);
            //定位初始化
            mLocationClient = new LocationClient(this);
    
            //通过LocationClientOption设置LocationClient相关参数
            LocationClientOption option = new LocationClientOption();
            option.setOpenGps(true); // 打开gps
            option.setCoorType("bd09ll"); // 设置坐标类型
            option.setScanSpan(1000);
            // 可选,设置地址信息
            option.setIsNeedAddress(true);
            //可选,设置是否需要地址描述
            option.setIsNeedLocationDescribe(true);
    
            //设置locationClientOption
            mLocationClient.setLocOption(option);
    
            //注册LocationListener监听器
            MyLocationListener myLocationListener = new MyLocationListener();
            mLocationClient.registerLocationListener(myLocationListener);
            //开启地图定位图层
            mLocationClient.start();
        }
    
        // 继承抽象类BDAbstractListener并重写其onReceieveLocation方法来获取定位数据,并将其传给MapView
        public class MyLocationListener extends BDAbstractLocationListener {
            @Override
            public void onReceiveLocation(BDLocation location) {
                //mapView 销毁后不在处理新接收的位置
                if (location == null || mMapView == null){
                    return;
                }
                
                // 如果是第一次定位
                LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
                if (isFirstLocate) {
                    isFirstLocate = false;
                    //给地图设置状态
                    mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(ll));
                }
                
                MyLocationData locData = new MyLocationData.Builder()
                        .accuracy(location.getRadius())
                        // 此处设置开发者获取到的方向信息,顺时针0-360
                        .direction(location.getDirection()).latitude(location.getLatitude())
                        .longitude(location.getLongitude()).build();
                mBaiduMap.setMyLocationData(locData);
                
    			// ------------------  以下是可选部分 ------------------
                // 自定义地图样式,可选
                // 更换定位图标,这里的图片是放在 drawble 文件下的
                BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);
                // 定位模式 地图SDK支持三种定位模式:NORMAL(普通态), FOLLOWING(跟随态), COMPASS(罗盘态)
                locationMode = MyLocationConfiguration.LocationMode.NORMAL;
                // 定位模式、是否开启方向、设置自定义定位图标、精度圈填充颜色以及精度圈边框颜色5个属性(此处只设置了前三个)。
                MyLocationConfiguration mLocationConfiguration = new MyLocationConfiguration(locationMode,true,mCurrentMarker);
                // 使自定义的配置生效
                mBaiduMap.setMyLocationConfiguration(mLocationConfiguration);
    			// ------------------  可选部分结束 ------------------
    			
                // 显示当前信息
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append("\n经度:" + location.getLatitude());
                stringBuilder.append("\n纬度:"+ location.getLongitude());
                stringBuilder.append("\n状态码:"+ location.getLocType());
                stringBuilder.append("\n国家:" + location.getCountry());
                stringBuilder.append("\n城市:"+ location.getCity());
                stringBuilder.append("\n区:" + location.getDistrict());
                stringBuilder.append("\n街道:" + location.getStreet());
                stringBuilder.append("\n地址:" + location.getAddrStr());
    
                mtextView.setText(stringBuilder.toString());
            }
        }
    
        @Override
        protected void onResume() {
            mMapView.onResume();
            super.onResume();
        }
    
        @Override
        protected void onPause() {
            mMapView.onPause();
            super.onPause();
        }
    
        @Override
        protected void onDestroy() {
            mLocationClient.stop();
            mBaiduMap.setMyLocationEnabled(false);
            mMapView.onDestroy();
            mMapView = null;
            super.onDestroy();
        }
    }
    

    最后运行即可。

    注意事项:

    1. 请在真机中运行
    2. 请保证真机处于联网状态
    3. 请手动打开该应用获取位置的权限
    4. 如果未能获取到位置信息,那么请在室外有 GPS 信号的地方试试

    最后强调一下这里遇到的一个坑,在使用地图时,通过状态码发现能够获取到当前的位置信息,但是地图还是定位到北京,经过 Google 发现,要在第一次定位时定位到当前位置,于是添加如下代码(在上面我已经添加过了):

    // 是否是第一次定位
    private boolean isFirstLocate = true;
    
        ……
        
    // 如果是第一次定位
    LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
    if (isFirstLocate) {
    	isFirstLocate = false;
    	//给地图设置状态         
    	mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(ll));
    }
    

    运行效果:
    在这里插入图片描述

    状态码

    在程序运行时,如果定位失败,可以通过查看状态码来解决。
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 一、百度地图基本的配置 我们知道,一个最基本的地图是肯定满足不了我们的需求的,所以就要进行一些设置,来改变地图。 首先我们看最基本的: //地图控件 private MapView mapView; //百度地图 private ...

     

    一、百度地图基本的配置

    我们知道,一个最基本的地图是肯定满足不了我们的需求的,所以就要进行一些设置,来改变地图。
    首先我们看最基本的:

        //地图控件
        private MapView mapView;
        //百度地图
        private BaiduMap baiduMap;
    
        /**
         * 初始化控件
         */
        public void initView(){
            mapView = (MapView)findViewById(R.id.mapView);
        }
    
        /**
         * 初始化地图
         */
        public void initMap(){
            //得到地图实例
            baiduMap = mapView.getMap();
            /*
            设置地图类型
             */
            //普通地图
            baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
            //卫星地图
            //baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
            //空白地图, 基础地图瓦片将不会被渲染。在地图类型中设置为NONE,将不会使用流量下载基础地图瓦片图层。使用场景:与瓦片图层一起使用,节省流量,提升自定义瓦片图下载速度。
            //baiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);
            //开启交通图
            baiduMap.setTrafficEnabled(true);
            //关闭缩放按钮
            mapView.showZoomControls(false);
        }
    

    以上代码就是最基本的设置了,很简单的样子,所以不过多停留在此。

    二、定位与显示中心点

    说到定位,不得不提起android6.0的动态权限,如果版本小于6.0则不会有问题,一旦大于等于6.0直接定位就不行了,必须要申请动态权限,所以在这里我就直接将动态权限简单的说一下。不过大家都知道因为国内很多厂商对android系统进行所谓的包壳,所以我们永远也摸不清这些壳的尿性,因此在这里是选择了PermissionsDispatcher第三方权限框架来做。
    下面我们就来看看它的用法:
    首先在build.gradle里加入依赖

    compile 'com.github.hotchemi:permissionsdispatcher:2.2.0'
    annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:2.2.0'
    

    依赖成功后我们先要看看它的几个注解和方法:
    @NeedsPermission:申请权限成功时
    @OnShowRationale:申请权限告诉用户原因时
    @OnPermissionDenied:申请权限被拒绝时
    @OnNeverAskAgain:申请权限被拒绝并勾选不再提醒时
    @RuntimePermissions:注释此Activity或Fragment,在Make project生成类时会用到
    onRequestPermissionsResult:回调方法

    首先我们对需要定位权限的当前Activity类加上@RuntimePermissions注解:

    @RuntimePermissions
    public class MainActivity extends AppCompatActivity {}
    

    下面我们使用上面剩下的注解和方法来完成对权限的动态申请:

    @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            // NOTE: delegate the permission handling to generated method
            MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
        }
    
        /**
         * 申请权限成功时
         */
        @NeedsPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
        void ApplySuccess() {
        }
    
        /**
         * 申请权限告诉用户原因时
         * @param request
         */
        @OnShowRationale(Manifest.permission.ACCESS_COARSE_LOCATION)
        void showRationaleForMap(PermissionRequest request) {
            showRationaleDialog("使用此功能需要打开定位的权限", request);
        }
    
        /**
         * 申请权限被拒绝时
         *
         */
        @OnPermissionDenied(Manifest.permission.ACCESS_COARSE_LOCATION)
        void onMapDenied() {
            Toast.makeText(this,"你拒绝了权限,该功能不可用",Toast.LENGTH_LONG).show();
        }
    
        /**
         * 申请权限被拒绝并勾选不再提醒时
         */
        @OnNeverAskAgain(Manifest.permission.ACCESS_COARSE_LOCATION)
        void onMapNeverAskAgain() {
            AskForPermission();
        }
    
        /**
         * 告知用户具体需要权限的原因
         * @param messageResId
         * @param request
         */
        private void showRationaleDialog(String messageResId, final PermissionRequest request) {
            new AlertDialog.Builder(this)
                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(@NonNull DialogInterface dialog, int which) {
                            request.proceed();//请求权限
                        }
                    })
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(@NonNull DialogInterface dialog, int which) {
                            request.cancel();
                        }
                    })
                    .setCancelable(false)
                    .setMessage(messageResId)
                    .show();
        }
    
        /**
         * 被拒绝并且不再提醒,提示用户去设置界面重新打开权限
         */
        private void AskForPermission() {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("当前应用缺少定位权限,请去设置界面打开\n打开之后按两次返回键可回到该应用哦");
            builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    return;
                }
            });
            builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    intent.setData(Uri.parse("package:" + MainActivity.this.getPackageName())); // 根据包名打开对应的设置界面
                    startActivity(intent);
                }
            });
            builder.create().show();
        }
    

    我们可以看到其中四个注解后面跟得有参数,这个参数就是我们需要申请的权限。然后在onRequestPermissionsResult里出现了以下一句代码:

    MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
    

    这句代码里的类和方法是没有的,它是通过对Activity或者Fragment@RuntimePermissions注解后并且进行Make project后才出现的。
    至此,定位权限的动态申请就搞定了,上面只是该框架的简单用法。更加全面的文档:PermissionsDispatcher

    既然权限搞定了,那么我们就可以一鼓作气的完成的定位并显示了。
    1.我们在之前的InitMap方法里加上以下代码:

        // 开启定位图层
        baiduMap.setMyLocationEnabled(true);
        //声明LocationClient类
        mLocationClient = new LocationClient(this);
        //注册监听函数
        mLocationClient.registerLocationListener(myListener);
        initLocation();
        //开始定位
        mLocationClient.start();
    

    2.声明一些需要的变量,配置定位参数,实现定位监听方法,设置中心点和marker

        //防止每次定位都重新设置中心点和marker
        private boolean isFirstLocation = true;
        //初始化LocationClient定位类
        private LocationClient mLocationClient = null;
        //BDAbstractLocationListener为7.2版本新增的Abstract类型的监听接口,原有BDLocationListener接口
        private BDLocationListener myListener = new MyLocationListener();
        //经纬度
        private double lat;
        private double lon;
    
        /**
         * 配置定位参数
         */
        private void initLocation() {
            LocationClientOption option = new LocationClientOption();
            //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
            option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
            //可选,默认gcj02,设置返回的定位结果坐标系
            option.setCoorType("bd09ll");
            //可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
            int span = 5000;
            option.setScanSpan(span);
            //可选,设置是否需要地址信息,默认不需要
            option.setIsNeedAddress(true);
            //可选,默认false,设置是否使用gps
            option.setOpenGps(true);
            //可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
            option.setLocationNotify(true);
            //可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
            option.setIsNeedLocationDescribe(true);
            //可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
            option.setIsNeedLocationPoiList(true);
            //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
            option.setIgnoreKillProcess(false);
            //可选,默认false,设置是否收集CRASH信息,默认收集
            option.SetIgnoreCacheException(false);
            //可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
            option.setEnableSimulateGps(false);
            mLocationClient.setLocOption(option);
        }
    
        /**
         * 实现定位监听 位置一旦有所改变就会调用这个方法
         * 可以在这个方法里面获取到定位之后获取到的一系列数据
         */
        public class MyLocationListener implements BDLocationListener {
    
            @Override
            public void onReceiveLocation(BDLocation location) {
                //获取定位结果
                location.getTime();    //获取定位时间
                location.getLocationID();    //获取定位唯一ID,v7.2版本新增,用于排查定位问题
                location.getLocType();    //获取定位类型
                location.getLatitude();    //获取纬度信息
                location.getLongitude();    //获取经度信息
                location.getRadius();    //获取定位精准度
                location.getAddrStr();    //获取地址信息
                location.getCountry();    //获取国家信息
                location.getCountryCode();    //获取国家码
                location.getCity();    //获取城市信息
                location.getCityCode();    //获取城市码
                location.getDistrict();    //获取区县信息
                location.getStreet();    //获取街道信息
                location.getStreetNumber();    //获取街道码
                location.getLocationDescribe();    //获取当前位置描述信息
                location.getPoiList();    //获取当前位置周边POI信息
    
                location.getBuildingID();    //室内精准定位下,获取楼宇ID
                location.getBuildingName();    //室内精准定位下,获取楼宇名称
                location.getFloor();    //室内精准定位下,获取当前位置所处的楼层信息
                //经纬度
                lat = location.getLatitude();
                lon = location.getLongitude();
                
                //这个判断是为了防止每次定位都重新设置中心点和marker
                if (isFirstLocation) {
                    isFirstLocation = false;
                    //设置并显示中心点
                    setPosition2Center(baiduMap, location, true);
                }
            }
        }
    
        /**
         * 设置中心点和添加marker
         *
         * @param map
         * @param bdLocation
         * @param isShowLoc
         */
        public void setPosition2Center(BaiduMap map, BDLocation bdLocation, Boolean isShowLoc) {
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(bdLocation.getRadius())
                    .direction(bdLocation.getRadius()).latitude(bdLocation.getLatitude())
                    .longitude(bdLocation.getLongitude()).build();
            map.setMyLocationData(locData);
    
            if (isShowLoc) {
                LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
                MapStatus.Builder builder = new MapStatus.Builder();
                builder.target(ll).zoom(18.0f);
                map.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
            }
        }
    
    

    3.最后我们在onCreate方法里进行android版本的判断,根据android版本来决定直接定位显示还是需要动态权限以及需要在权限申请成功的方法里调用initMap方法和生命周期的管理,代码如下:

        //当android系统小于5.0的时候直接定位显示,不用动态申请权限
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            initMap();
        } else {
            MainActivityPermissionsDispatcher.ApplySuccessWithCheck(this);
        }
    
        /**
        * 申请权限成功时
        */
        @NeedsPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
        void ApplySuccess() {
            initMap();
        }
    
        @Override
        public void onResume() {
            super.onResume();
            //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
            mapView.onResume();
        }
    
        @Override
        public void onPause() {
            super.onPause();
            //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
            mapView.onPause();
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
            // 退出时销毁定位
            mLocationClient.unRegisterLocationListener(myListener);
            mLocationClient.stop();
            // 关闭定位图层
            baiduMap.setMyLocationEnabled(false);
            mapView.onDestroy();
            mapView = null;
        }
    

    最后我们来看看运行效果

    动态申请权限.png

    定位显示当前位置.png

    到此为止,android集成百度地图的定位与显示当前位置就结束了,从第一篇文章到第二篇所有的地方我都注释的比较细,以便新手学习和参考。最后因为我公司的项目中还涉及到了动态添加点和几何图形覆盖物,所以还有有一篇结尾的文章,大家耐心等待~

     

    展开全文
  • 说明:通过定位sdk获取的BDLocation类中...如果要具体显示位置在哪,除了通过定位sdk获取经纬度之外,还需要通过百度地图来显示。 效果图: 参考百度定位开发文档:http://lbsyun.baidu.com/index.php?title=a...

    说明:通过定位sdk获取的BDLocation类中包含了当前位置的:经纬度,省、市、区、街道等地址信息。如果应用只需要获取用户当前位置所在的市、县、区等信息,那么定位sdk就可以满足你的需求。如果要具体显示位置在哪,除了通过定位sdk获取经纬度之外,还需要通过百度地图来显示。

    效果图:

    参考百度定位开发文档:http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/get-location/latlng

    一、引入定位的so包

    注意:我这个是续接上一篇的

    Android入门之——百度地图开发(一)

    二、添加定位权限

     

    <!-- 这个权限用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <!-- 这个权限用于访问GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
    <!-- 用于读取手机当前的状态-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
    <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <!-- 访问网络,网络定位需要上网-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- SD卡读取权限,用户写入离线定位数据-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <!-- 这个权限用于访问GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
    <!-- 用于读取手机当前的状态-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
    <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <!-- 访问网络,网络定位需要上网-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- SD卡读取权限,用户写入离线定位数据-->

     

    三、在Application标签中声明service组件

     

    <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service> android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service>

    四、代码

    1.定义四个变量

    BaiduMap mBaiduMap;//定义地图实例
    
    public LocationClient mLocationClient = null;//定义LocationClient 
    private MyLocationListener myListener = new MyLocationListener();//继承BDAbstractLocationListener的class
    boolean ifFrist = true;//判断是否是第一次进去

    2.onCreat方法

     mBaiduMap = mMapView.getMap();//获取地图实例对象
            // 开启定位图层
            mBaiduMap.setMyLocationEnabled(true);
            //设置定位图标是否有箭头
            mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING, true,null));
            //声明LocationClient类
            mLocationClient = new LocationClient(getApplicationContext());
            //注册监听函数
            mLocationClient.registerLocationListener(myListener);

    初始化LocationClientOption

     LocationClientOption option = new LocationClientOption();
            option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
            //可选,设置定位模式,默认高精度
            //LocationMode.Hight_Accuracy:高精度;
            //LocationMode. Battery_Saving:低功耗;
            //LocationMode. Device_Sensors:仅使用设备;
    
            option.setCoorType("bd09ll");
            //可选,设置返回经纬度坐标类型,默认gcj02
            //gcj02:国测局坐标;
            //bd09ll:百度经纬度坐标;
            //bd09:百度墨卡托坐标;
            //海外地区定位,无需设置坐标类型,统一返回wgs84类型坐标
    
            option.setScanSpan(1000);
            //可选,设置发起定位请求的间隔,int类型,单位ms
            //如果设置为0,则代表单次定位,即仅定位一次,默认为0
            //如果设置非0,需设置1000ms以上才有效
    
            option.setOpenGps(true);
            //可选,设置是否使用gps,默认false
            //使用高精度和仅用设备两种定位模式的,参数必须设置为true
    
            option.setLocationNotify(true);
            //可选,设置是否当GPS有效时按照1S/1次频率输出GPS结果,默认false
    
            option.setIgnoreKillProcess(false);
            //可选,定位SDK内部是一个service,并放到了独立进程。
            //设置是否在stop的时候杀死这个进程,默认(建议)不杀死,即setIgnoreKillProcess(true)
    
            option.SetIgnoreCacheException(false);
            //可选,设置是否收集Crash信息,默认收集,即参数为false
    
            option.setWifiCacheTimeOut(5 * 60 * 1000);
            //可选,7.2版本新增能力
            //如果设置了该接口,首次启动定位时,会先判断当前WiFi是否超出有效期,若超出有效期,会先重新扫描WiFi,然后定位
    
            option.setEnableSimulateGps(false);
            //可选,设置是否需要过滤GPS仿真结果,默认需要,即参数为false
            option.setIsNeedAddress(true);

    LocationClient设置LocationClientOption参数

    mLocationClient.setLocOption(option);//将配置好的LocationClientOption对象,通过setLocOption方法传递给LocationClient对象使用

    3.开启定位

     @Override
        protected void onResume() {
            super.onResume();
            //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
            mMapView.onResume();
            //调用LocationClient的start()方法,便可发起定位请求
            mLocationClient.start();
        }

    4.MyLocationListener实现

     public class MyLocationListener extends BDAbstractLocationListener {
            @Override
            public void onReceiveLocation(BDLocation location) {
                //此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
                //以下只列举部分获取经纬度相关(常用)的结果信息
                //更多结果信息获取说明,请参照类参考中BDLocation类中的说明
    
                double latitude = location.getLatitude();    //获取纬度信息
                double longitude = location.getLongitude();    //获取经度信息
                float radius = location.getRadius();    //获取定位精度,默认值为0.0f
    
                String coorType = location.getCoorType();
                //获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准
    
                int errorCode = location.getLocType();
                Log.i("---------", location.getCityCode() + "---" + latitude + "--" + longitude + "----" + coorType + "--" + location.getCountry() + "--" + location.getCity() + "--" + location.getAddrStr());
                //获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明
    
              /*  // 构造定位数据
                MyLocationData locData = new MyLocationData.Builder()
                        .accuracy(location.getRadius())
                        // 此处设置开发者获取到的方向信息,顺时针0-360
                        .direction(100).latitude(location.getLatitude())
                        .longitude(location.getLongitude()).build();
    
                // 设置定位数据
                mBaiduMap.setMyLocationData(locData);*/
    
                if (ifFrist) {
                    LatLng ll = new LatLng(location.getLatitude(),
                            location.getLongitude());
                    MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
                    // 移动到某经纬度
                    mBaiduMap.animateMapStatus(update);
                    update = MapStatusUpdateFactory.zoomBy(5f);
                    // 放大
                    mBaiduMap.animateMapStatus(update);
    
                    ifFrist = false;
                }
    
                // 显示个人位置图标
                MyLocationData.Builder builder = new MyLocationData.Builder();
                builder.latitude(location.getLatitude());
                builder.longitude(location.getLongitude());
                MyLocationData data = builder.build();
                mBaiduMap.setMyLocationData(data);
            }
        }

    5.activity销毁时候销毁定位

     @Override
        protected void onDestroy() {
            super.onDestroy();
            //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
            mMapView.onDestroy();
            mLocationClient.stop();
            mBaiduMap.setMyLocationEnabled(false);
        }

    至此定位就可以出来,不清楚的可以看注释也可以留言提问;

     

    展开全文
  • 百度地图定位--上传当前位置百度地图定位--
  • 百度地图定位自己的位置~ 有需要的下载,
  • 百度地图 定位
  • 步骤:1、获取当前的经纬度 2、显示地图 3、改变地图中心的经纬度1、获取当前的经纬度 请参考网址: http://blog.csdn.net/zhengyikuangge/article/details/519215492、显示地图 请参考网址: ...
  • Android 百度地图定位

    2018-04-23 13:47:30
    1.打开百度地图开放平台,找到功能与服务,选择定位,点击Android 定位SDK(v7.5),然后这就是官方文档了。 2.然后注册登陆,创建应用,填写之后得到一个AK,以前是AppKey,一个意思。 a. 应...
  • 然后想给骑手做一个路线导航的功能,能够自动规划自己当前位置到顾客或者商家的路线。 这里调用了百度地图的API。 以下是具体内容。 下载百度地图SDK 上百度地图官网下载,下载时建议把示例代码也下载下来,...
  • 1.前言 开头不说点什么,总是有点不习惯。还是说点什么吧,关于百度地图,我用的次数还是...我的有一个项目中,就是要一开始将地图的可视区域定位当前位置。其实很简单,网上一搜一大堆。 2.详情 说的再多,不如贴
  • Android中基于百度地图来实现定位当前位置在地图上显示,并自定义缩放按钮,百度地图版本V3.1
  • 这篇文章主要是对百度地图进行定位当前位置,同时在当前位置设置圆形覆盖物,后面会实现附近餐馆查找功能。文章比较基础,包括申请API Key、配置环境、官方文档介绍、使用BDLocationListener实现定位监听方法等,...
  • [Android Studio]百度地图定位百度地图开发者注册获取密钥Android 地图 SDK 下载配置编写布局activity_main.xml编写MainActivity.java如果是在虚拟机上运行的话,经纬度只会显示4.9E-324,而且地图显示不是北京就是...
  • 百度地图定位当前城市百度地图定位当前城市百度地图定位当前城市百度地图定位当前城市百度地图定位当前城市百度地图定位当前城市百度地图定位当前城市百度地图定位当前城市百度地图定位当前城市百度地图定位当前城市...
  • Android使用百度定位 在使用百度定位sdk时按照百度官方开发指南: http://lbs.baidu.com/index.php?title=androidsdk/guide/create-map/location 确迟迟无法做到定位,都是如下所示: 多方查找求证后才回过神来——...
  • 在做一个小项目时,使用到百度地图定位功能,在获取到当前经纬度之后,需要获取当前位置信息和当前城市。通过API可以看到提供了两个方法来获取。在位置改变的回调函数中调用 public class MyLocationListener ...
  • Android百度地图显示当前位置方向设置点位样式设置点封装工具 百度地图有专门一个方法设置当前位置,显示效果是一个小蓝点,并且始终在地图图层的最上面。通过结合百度地图定位,与Android的传感器做出与地图应用...
  • 百度地图定位优缺点: 优点: 定位比较快 缺点: 含有so库,定位不太准 集成方法 从百度官方sdk中拷贝库工程中。 修改build.gradle文件 android { sourceSets { main { jniLibs.srcDirs = ['libs'] } ...
  • Android百度地图定位后获取周边位置在列表中展示并选择
1 2 3 4 5 ... 20
收藏数 4,940
精华内容 1,976
关键字:

定位到当前位置 百度地图android