前言:

  新手上路,这几天在弄百度地图SDK的使用(吐槽 : 官网上的开发指南简直就是实力坑爹,可能是开发人员太忙,维护不及时吧),我对本次学习的要求也不高:能正常显示地图,能定位,能添加mark(覆盖物),点击mark时能提示当前位置信息就行,再深的东西,以后有时间再去研究吧,毕竟新手还是欠火候。
  
因为软件开发更新换代太快,各位看官看的时候可能本文内容就已经过时了,所以先交代一下开发环境:

应用开发开发工具:
  Android Studio 1.5.1

百度地图版本信息:
  Android 地图 SDK v3.7.1
  Android 定位 SDK v6.2.2

正文:

一、效果图

废话多说,先来一发截图,一眼就能看出来到底实现了哪些功能:

          图1-1.实现定位
         

        图1-2.拖拽到新的位置
 
如上面两幅图所示,图1-1显示的是当程序正常运行后,就会定位到当前位置,显示位置信息(’气泡’),图1-2显示的是当拖动mark到新的位置后,显示当前的位置信息,大家可能注意到图1-2右下角红色圆圈圈住的图标,是可以点击的,作用是实现重新定位。

二、开发过程

2.1导入库文件

去百度开发者中心下载最新的开发包,现在是支持按功能需求来下载开发包,我就贪婪的全都下载了(下载地址),最好的学习方式就是下载示例代码,模仿着写。解压下载好的库文件。
首先:在工程app/libs目录下放入BaiduLBS_Android.jar包,如图2-1所示。
然后:在src/main/目录下新建jniLibs目录,在jniLibs新建armeabi文件(这个文件要根据你的手机的cpu类型来创建,armeabi就是针对普通的或旧的arm cpu,armeabi-v7a是针对有浮点运算或高级扩展功能的arm cpu),然后把动态链接库.so文件拷贝到该目录下,如图2-2所示。
最后:对于每个jar文件,右键-选择Add As Library,导入到工程中。

        图2-1.导入jar包文件
        

        图2-2.导入.so库文件

环境配置也可以参考官方指南.

2.2布局文件

修改activity_main.xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.yu.baidumapdemo.MainActivity"><TextView
        android:id="@+id/title"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="百 度 地 图" /><com.baidu.mapapi.map.MapView
        android:id="@+id/map_view"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_below="@id/title"android:clickable="true"/><Button
        android:id="@+id/request_location"android:layout_width="45dp"android:layout_height="45dp"android:layout_alignParentBottom="true"android:layout_alignParentLeft="true"android:layout_marginBottom="5dp"android:layout_marginLeft="50dp"android:background="@drawable/custom_loc"/>
</RelativeLayout>

布局文件如上所述,很简单,一个TextView显示一个标题(之后我用它来显示当前位置),一个com.baidu.mapapi.map.MapView,这是最重要的用来,是显示地图的控件,最后放了一个Button,就是图1-2中红圈所示的按钮,用来重新获取定位。

2.3java类代码

2.3.1初始化SDK

新建类 BaiduMapDemoApplication继承自Application

package com.yu.baidumapdemo;import android.app.Application;import com.baidu.mapapi.SDKInitializer;/*** Created by yu on 2016-03-09.*/
public class BaiduMapDemoApplication extends Application {@Overridepublic void onCreate() {super.onCreate();// 在使用 SDK 各组间之前初始化 context 信息,传入 ApplicationContext//这样就不用每个Activity都初始化一遍了SDKInitializer.initialize(this);}
}

这个类的功能很简单,因为在使用百度地图的所有功能前都需要调用SDKInitializer.initialize(android.content.Context);来初始化组件,所以新建这个类继承自Application,并在AndroidManifest.xml文件进行配置(为application添加属性 android:name=“.BaiduMapDemoApplication”),保证最先得到初始化。

2.3.2实现地图定位等功能

MainActivity.java:

package com.yu.baidumapdemo;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.Poi;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;import java.util.List;//Ak(百度密钥): 8w4BMfqde5lkbGy3xz6h6Y7C
public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";   //日志的TAGprivate Button requestButton = null;    //重新定位按钮private TextView locationText = null;   //显示位置信息的TextViewprivate MapView mapView = null;         //显示地图的控件private BaiduMap baiduMap = null;       //地图管理器private Marker marker = null ;          //覆盖物//初始化bitmap信息,不用的时候请及时回收recycle   //覆盖物图标private BitmapDescriptor bd = BitmapDescriptorFactory.fromResource(R.drawable.location_arrows);//定位服务的客户端。宿主程序在客户端声明此类,并调用,目前只支持在主线程中启动private LocationClient locationClient = null;//是否是首次定位,实际上没有用到,因为我设置了不定时请求位置信息boolean isFirstLoc = true;//定位监听器(实现定位请求回调接口),当客户端请求定位或者开始定位的时候会触发public BDLocationListener myListener = new BDLocationListener() {@Overridepublic void onReceiveLocation(BDLocation bdLocation) {Log.d(TAG, "BDLocationListener -> onReceiveLocation");String addr; //定位结果//mapView销毁后不在处理新接收的位置if(bdLocation == null || mapView == null) {Log.d(TAG, "BDLocation or mapView is null");locationText.setText("定位失败...");return;}if(!bdLocation.getLocationDescribe().isEmpty()) {addr = bdLocation.getLocationDescribe();}else if (bdLocation.hasAddr()) {addr = bdLocation.getAddrStr();}else {Log.d(TAG, "BDLocation has no addr info");addr = "定位失败...";return;}//以下打印日志,打印一些详细信息,供参考//------------------------------------位置信息日志--------------------------------------------------StringBuilder sBuilder = new StringBuilder();sBuilder.append("\nTime : " + bdLocation.getTime());            //服务器返回的当前定位时间sBuilder.append("\nError code : " + bdLocation.getLocType());   //定位结果码sBuilder.append("\nLatitude : " + bdLocation.getLatitude());    //获取纬度坐标sBuilder.append("\nLongtitude : " + bdLocation.getLongitude()); //获取经度坐标sBuilder.append("\nRadius : " + bdLocation.getRadius());        //位置圆心//根据定位结果码判断是何种定位以及定位请求是否成功if(bdLocation.getLocType() == BDLocation.TypeGpsLocation) {//GPS定位结果sBuilder.append("\nSpeed : " + bdLocation.getSpeed());//当前运动的速度sBuilder.append("\nSatellite number : " + bdLocation.getSatelliteNumber());//定位卫星数量sBuilder.append("\nHeight : " + bdLocation.getAltitude());  //位置高度sBuilder.append("\nDirection : " + bdLocation.getDirection());  //定位方向sBuilder.append("\nAddrStr : " + bdLocation.getAddrStr());  //位置详细信息sBuilder.append("\nStreet : " + bdLocation.getStreetNumber() + " " + bdLocation.getStreet());//街道号、路名sBuilder.append("\nDescribtion : GPS 定位成功");}else if (bdLocation.getLocType() == BDLocation.TypeNetWorkLocation) {//网络定位结果sBuilder.append("\nAddrStr : " + bdLocation.getAddrStr()); //位置详细信息sBuilder.append("\nStreet : " + bdLocation.getStreetNumber() + " " + bdLocation.getStreet());//街道号、路名sBuilder.append("\nOperators : " + bdLocation.getOperators());//运营商编号sBuilder.append("\nDescribtion : 网络定位成功");}else if(bdLocation.getLocType() == BDLocation.TypeOffLineLocation) {//离线定位结果sBuilder.append("\nAddrStr : " + bdLocation.getAddrStr()); //位置详细信息sBuilder.append("\nStreet : " + bdLocation.getStreetNumber() + " " + bdLocation.getStreet());//街道号、路名sBuilder.append("\nDescribtion : 离线定位成功");}else if(bdLocation.getLocType() == BDLocation.TypeServerError) {sBuilder.append("\nDescribtion : 服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");}else if(bdLocation.getLocType() == BDLocation.TypeNetWorkException) {sBuilder.append("\nDescribtion : 网络故障,请检查网络连接是否正常");}else if(bdLocation.getLocType() == BDLocation.TypeCriteriaException) {sBuilder.append("\nDescribtion : 无法定位结果,一般由于定位SDK内部检测到没有有效的定位依据," +"比如在飞行模式下就会返回该定位类型, 一般关闭飞行模式或者打开wifi就可以再次定位成功");}//位置语义化描述sBuilder.append("\nLocation decribe : " + bdLocation.getLocationDescribe());//poi信息(就是附近的一些建筑信息),只有设置可获取poi才有值List<Poi> poiList = bdLocation.getPoiList();if(poiList != null) {sBuilder.append("\nPoilist size : " + poiList.size());for (Poi p : poiList) {sBuilder.append("\nPoi : " + p.getId() + " " + p.getName() + " " + p.getRank());}}//打印以上信息Log.d(TAG, "定位结果详细信息 : " + sBuilder.toString());//----------------------------------------------定位----------------------------------------//构建生成定位数据对象            //定位数据构建器MyLocationData myLocationData = new MyLocationData.Builder().accuracy(bdLocation.getRadius())   //设置定位数据的精度信息,单位米.direction(100)                     //设定定位数据的方向信息??啥意思??.latitude(bdLocation.getLatitude()) //设定定位数据的纬度.longitude(bdLocation.getLongitude())//设定定位数据的经度.build();   //构建生生定位数据对象//设置定位数据, 只有先允许定位图层后设置数据才会生效,setMyLocationEnabled(boolean)baiduMap.setMyLocationData(myLocationData);if(isFirstLoc) {//Log.d(TAG,"首次定位开始");//isFirstLoc = false;//地理坐标基本数据结构:经度和纬度LatLng latLng = new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude());//为当前定位到的位置设置覆盖物MarkerresetOverlay(latLng);//描述地图状态将要发生的变化         //生成地图状态将要发生的变化,newLatLngZoom设置地图新中心点MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLngZoom(latLng,18.0f);//MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLngZoom(latLng);//以动画方式更新地图状态,动画耗时 300 ms  (聚焦到当前位置)baiduMap.animateMapStatus(mapStatusUpdate);}locationText.setText(addr);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG, "onCreate");//在使用SDK各组件之前初始化context信息,传入ApplicationContext//注意该方法要再setContentView方法之前实现//最好使用全局的Context 即用getApplicationContext()//SDKInitializer.initialize(getApplicationContext());//由于已在BaiduMapDemoApplication中初始化过,就不再次初始化setContentView(R.layout.activity_main);//加载布局文件//获取地图控件的引用mapView = (MapView) findViewById(R.id.map_view);//重新定位按钮requestButton = (Button) findViewById(R.id.request_location);//定位结果显示locationText = (TextView) findViewById(R.id.title);locationText.setText("正在定位...");//获取地图控制器baiduMap = mapView.getMap();//允许定位图层,如果不设置这个参数,那么baiduMap.setMyLocationData(myLocationData);定位不起作用baiduMap.setMyLocationEnabled(true);//设置mark覆盖物拖拽监听器baiduMap.setOnMarkerDragListener(new MyMarkerDragListener());//设置mark覆盖物点击监听器baiduMap.setOnMarkerClickListener(new MyMarkerClickListener());//生成定位服务的客户端对象,此处需要注意:LocationClient类必须在主线程中声明locationClient = new LocationClient(getApplicationContext());//注册定位监听函数,当开始定位.start()或者请求定位.requestLocation()时会触发locationClient.registerLocationListener(myListener);//设定定位SDK的定位方式setLocationOption();//开始、请求定位//locationClient.start();requestLocation();//重新定位按钮设置监听器requestButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//开始定位,或者重新定位requestLocation();}});}//开始定位或者请求定位private void requestLocation() {//如果请求定位客户端已经开启,就直接请求定位,否则开始定位//很重要的一点,是要在AndroidManifest文件中注册定位服务,否则locationClient.isStarted一直会是false,// 而且可能出现一种情况是首次能定位,之后再定位无效if(locationClient != null && locationClient.isStarted()) {Log.d(TAG, "requestLocation.");locationText.setText("正在定位...");//请求定位,异步返回,结果在locationListener中获取.locationClient.requestLocation();}else if (locationClient != null && !locationClient.isStarted()) {Log.d(TAG, "locationClient is started : " + locationClient.isStarted());locationText.setText("正在定位...");//定位没有开启 则开启定位,结果在locationListener中获取.locationClient.start();}else {Log.e(TAG,"request location error!!!");}}@Overrideprotected void onDestroy() {super.onDestroy();Log.d(TAG, "onDestroy");//注销定位监听器locationClient.unRegisterLocationListener(myListener);//停止定位locationClient.stop();//不允许图层定位baiduMap.setMyLocationEnabled(false);//清除覆盖物clearOverlay();//回收Bitmap资源bd.recycle();//在activity执行onDestroy时执行MapView.onDestroy(),实现地图生命周期管理mapView.onDestroy();mapView = null;}@Overrideprotected void onResume() {super.onResume();Log.d(TAG, "onResume");//在activity执行onResume时执行MapView. onResume(),实现地图生命周期管理mapView.onResume();}@Overrideprotected void onPause() {super.onPause();Log.d(TAG, "onPause");//在activity执行onPause时执行MapView. onResume(),实现地图生命周期管理mapView.onPause();}//设定定位服务客户端locationClient的定位方式private void setLocationOption(){//获取配置参数对象,用于配置定位SDK各配置参数,比如定位模式、定位时间间隔、坐标系类型等LocationClientOption option = new LocationClientOption();//可选,默认false,设置是否使用gpsoption.setOpenGps(true);/** 高精度定位模式:这种定位模式下,会同时使用网络定位和GPS定位,优先返回最高精度的定位结果;* 低功耗定位模式:这种定位模式下,不会使用GPS,只会使用网络定位(Wi-Fi和基站定位);* 仅用设备定位模式:这种定位模式下,不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位。*///可选,默认高精度,设置定位模式,高精度,低功耗,仅设备option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认gcj02,设置返回的定位结果坐标系option.setCoorType("bd09ll");//可选,默认0,即仅定位一次,设置定时发起定位请求的间隔需要大于等于1000ms才是有效的/** 定位sdk提供2种定位模式,定时定位和app主动请求定位。* setScanSpan < 1000 则为 app主动请求定位;* setScanSpan >=1000,则为定时定位模式(setScanSpan的值就是定时定位的时间间隔))* 定时定位模式中,定位sdk会按照app设定的时间定位进行位置更新,定时回调定位结果。此种定位模式适用于希望获得连续定位结果的情况。* 对于单次定位类应用,或者偶尔需要一下位置信息的app,可采用app主动请求定位这种模式。*///option.setScanSpan(2000);//可选,设置是否需要地址信息,默认不需要option.setIsNeedAddress(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”option.setIsNeedLocationDescribe(true);//设置是否需要返回位置POI信息,可以在BDLocation.getPoiList()中得到数据option.setIsNeedLocationPoiList(true);//在网络定位时,是否需要设备方向 true:需要 ; false:不需要option.setNeedDeviceDirect(true);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死option.setIgnoreKillProcess(false);//可选,默认false,设置是否收集CRASH信息,默认收集option.SetIgnoreCacheException(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要option.setEnableSimulateGps(false);//设定定位SDK的定位方式locationClient.setLocOption(option);}//初始化添加覆盖物markprivate void initOverlay(LatLng latLng) {Log.d(TAG, "Start initOverlay");//设置覆盖物添加的方式与效果MarkerOptions markerOptions = new MarkerOptions().position(latLng)//mark出现的位置.icon(bd)       //mark图标.draggable(true)//mark可拖拽.animateType(MarkerOptions.MarkerAnimateType.drop)//从天而降的方式//.animateType(MarkerOptions.MarkerAnimateType.grow)//从地生长的方式;//添加markmarker = (Marker) (baiduMap.addOverlay(markerOptions));//地图上添加mark//弹出View(气泡,意即在地图中显示一个信息窗口),显示当前mark位置信息setPopupTipsInfo(marker);Log.d(TAG,"End initOverlay");}//清除覆盖物private void clearOverlay(){baiduMap.clear();marker = null;}//重置覆盖物private void resetOverlay(LatLng latLng) {clearOverlay();initOverlay(latLng);}//覆盖物拖拽监听器public class MyMarkerDragListener implements BaiduMap.OnMarkerDragListener {@Overridepublic void onMarkerDrag(Marker marker) {}//拖拽结束,调用方法,弹出View(气泡,意即在地图中显示一个信息窗口),显示当前mark位置信息@Overridepublic void onMarkerDragEnd(Marker marker) {setPopupTipsInfo(marker);}@Overridepublic void onMarkerDragStart(Marker marker) {}}//覆盖物点击监听器public class MyMarkerClickListener implements BaiduMap.OnMarkerClickListener {@Overridepublic boolean onMarkerClick(Marker marker) {//调用方法,弹出View(气泡,意即在地图中显示一个信息窗口),显示当前mark位置信息setPopupTipsInfo(marker);return false;}}//想根据Mark中的经纬度信息,获取当前的位置语义化结果,需要使用地理编码查询和地理反编码请求//在地图中显示一个信息窗口private void setPopupTipsInfo(Marker marker){//获取当前经纬度信息final LatLng latLng = marker.getPosition();final String[] addr = new String[1];//实例化一个地理编码查询对象GeoCoder geoCoder = GeoCoder.newInstance();//设置反地理编码位置坐标ReverseGeoCodeOption option = new ReverseGeoCodeOption();option.location(latLng);//发起反地理编码请求geoCoder.reverseGeoCode(option);//为地理编码查询对象设置一个请求结果监听器geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {@Overridepublic void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {Log.d(TAG, "地理编码信息 ---> \nAddress : " + geoCodeResult.getAddress()+ "\ntoString : " + geoCodeResult.toString()+ "\ndescribeContents : " + geoCodeResult.describeContents());}//当获取到反编码信息结果的时候会调用@Overridepublic void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {//获取地理反编码位置信息addr[0] = reverseGeoCodeResult.getAddress();//获取地址的详细内容对象,此类表示地址解析结果的层次化地址信息。ReverseGeoCodeResult.AddressComponent addressDetail = reverseGeoCodeResult.getAddressDetail();Log.d(TAG, "反地理编码信息 ---> \nAddress : " + addr[0]+ "\nBusinessCircle : " + reverseGeoCodeResult.getBusinessCircle()//位置所属商圈名称+ "\ncity : " + addressDetail.city  //所在城市名称+ "\ndistrict : " + addressDetail.district  //区县名称+ "\nprovince : " + addressDetail.province  //省份名称+ "\nstreet : " + addressDetail.street      //街道名+ "\nstreetNumber : " + addressDetail.streetNumber);//街道(门牌)号码StringBuilder poiInfoBuilder = new StringBuilder();//poiInfo信息List<PoiInfo> poiInfoList = reverseGeoCodeResult.getPoiList();if(poiInfoList != null) {poiInfoBuilder.append("\nPoilist size : " + poiInfoList.size());for (PoiInfo p : poiInfoList) {poiInfoBuilder.append("\n\taddress: " + p.address);//地址信息poiInfoBuilder.append(" name: " + p.name + " postCode: " + p.postCode);//名称、邮编//还有其他的一些信息,我这里就不打印了,请参考API}}Log.d(TAG,"poiInfo --> " + poiInfoBuilder.toString());//动态创建一个View用于显示位置信息Button button = new Button(getApplicationContext());//设置view是背景图片button.setBackgroundResource(R.drawable.location_tips);//设置view的内容(位置信息)button.setText(addr[0]);//在地图中显示一个信息窗口,可以设置一个View作为该窗口的内容,也可以设置一个 BitmapDescriptor 作为该窗口的内容InfoWindow infoWindow = new InfoWindow(BitmapDescriptorFactory.fromView(button), latLng, -47, new InfoWindow.OnInfoWindowClickListener() {@Overridepublic void onInfoWindowClick() {//当InfoWindow被点击后隐藏baiduMap.hideInfoWindow();}});//InfoWindow infoWindow = new InfoWindow(button, latLng, -47);//显示信息窗口baiduMap.showInfoWindow(infoWindow);}});/*不能放在下面 因为可能得到的数据还没来得及回调Button button = new Button(getApplicationContext());button.setBackgroundResource(R.drawable.location_tips);button.setText(addr[0]);//InfoWindow infoWindow = new InfoWindow(BitmapDescriptorFactory.fromView(button),latLng,-47,null);InfoWindow infoWindow = new InfoWindow(button,latLng,-47);baiduMap.showInfoWindow(infoWindow);*/return ;}
}

应为上面的代码注释很详细,这里简单介绍一下流程:
首先:获取地图显示控件对象MapView -> mapView
然后:获取地图控制对象BaiduMap -> baiduMap,并允许显示图层定位
再后:为baiduMap设置监听器:覆盖物拖拽监听器,覆盖物点击监听器(二者的主要作用是在地图中显示一个信息窗口,来提示用户当前的位置信息)
接着:获取定位服务客户端对象 LocationClient -> locationClient,并注册定位监听函数(BDLocationListener)以及设置定位方式
最后:调用locationClient .start()开启定位或者如果定位服务已开启,则调用locationClient .requestLocation()再次请求定位,这两个方法成功调用后,会触发定位监听器(BDLocationListener),然后监听器中获取定位结果以及定位信息,并且添加覆盖物和显示信息窗口(气泡)。

2.4配置AndroidManifest.xml文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.yu.baidumapdemo"><!--读取系统设置的数据库(launcher.db)的权限--><uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /><!--屏幕保持唤醒 不锁屏--><uses-permission android:name="android.permission.WAKE_LOCK"/><!--允许应用程序更改主屏幕中的设置和快捷方式--><uses-permission android:name="android.permission.WRITE_SETTINGS" /><!-- 这个权限用于进行网络定位--><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.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission><application
        android:name=".BaiduMapDemoApplication"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><service
            android:name="com.baidu.location.f"android:enabled="true"android:process=":remote" ></service><meta-data
            android:name="com.baidu.lbsapi.API_KEY"android:value="8w4BMfqde5lkbGy3xz6h6Y7C"/></application></manifest>

增加以下四个配置(很重要)
  1). 增加权限的申请
  2). 注册application初始化SDK,即:
    为application添加属性 android:name=“.BaiduMapDemoApplication”
  3). 注册定位服务(com.baidu.location.f),这个服务如果不注册,会导致无法进行定位
  4). 配置密钥(AK)

Android — 之百度地图定位+添加Mark+InfoWindow相关推荐

  1. Android开发——百度地图定位

    Android开发--百度地图定位 项目需求 项目内容 注册和获取秘钥 获取项目SHA1码 获取项目AK码 AS依赖配置 AS源码 AndroidManifest文件 布局文件 DemoApplica ...

  2. 基于Android的百度地图定位开发

    百度地图定位 一.注册和获取密钥 1.获取SHA1 2.获取包名 二.AS配置 三.显示地图开发 1.添加地图权限 2.添加地图容器 3.地图初始化 4.创建地图Activity,管理MapView生 ...

  3. Android使用百度地图定位并显示手机位置后使用前置摄像头“偷拍”

    今天老板让我验证一下技术可行性,记录下来. 需求 :定位手机的位置并在百度地图上显示,得到位置后使用前置摄像头进行抓拍 拿到这个需求后,对于摄像头的使用不太熟悉,于是我先做了定位手机并在百度地图上显示 ...

  4. unlegal android,cordova-plugin-baidumaplocation百度地图定位Cordova插件

    百度地图定位Cordova插件,支持Android,IOS 可以在此地址查看example 基于百度地图Android版定位SDK(v7.1)以及百度地图IOS SDK (v3.2.1) 一,申请An ...

  5. flutter 实现Android端百度地图定位

    1.先在百度地图官网申请百度地图AK 百度地图开放平台 | 百度地图API SDK | 地图开发 2.安装flutter百度地图插件 #百度定位flutter_bmflocation: ^1.0.4# ...

  6. Android实现百度地图定位(墨雪亲测)

    1.到百度地图开放平台下载定位SDK: 地址:http://lbsyun.baidu.com/index.php?title=android-locsdk/geosdk-android-downloa ...

  7. Android之百度地图定位最详细使用总结

    Android之百度定位                         如果项目里面有定位功能的话,一般还是觉得蛮高大上的,我们项目用的百度定位,到网上找了很多资料,很多都不全面,很多博客都没有小伙 ...

  8. Android使用百度地图定位SDK在wifi下位置偏差

    前段时间公司上马了一个Android项目,其中用到了百度地图的定位SDK(V 3.1),上线后有用户反馈来说定位的位置不准确(我们展示给用户的地址是具体的街道地址,原来是直接使用的百度地图 SDK,需 ...

  9. Android利用百度地图定位

    百度地图照着百度的教程做的总是出现报错 请帮我看看错误在那 2013-12-13 15:16168海军 | 分类:百度地图 | 浏览1252次 java.lang.RuntimeException: ...

最新文章

  1. java程序a-z b-y,请完成下列Java程序:对大写的26个英文字母加密,从键盘输入一个大写字母串,输出这个串加密后的结 - 赏学吧...
  2. java实现发送QQ邮件
  3. 646. Maximum Length of Pair Chain 最长的链条长度
  4. centos命令行xkill
  5. java多线程回顾1:线程的概念与创建
  6. ENVI分类格式转TIF
  7. 晶振讲述工作原理及作用
  8. css 文字颜色渐变上到下,CSS 实现背景色渐变和文字颜色渐变
  9. 基于Python的指数基金量化投资-全市场的市盈率和市净率计算
  10. Snaker-Designer在Eclipse中的安装和使用
  11. phpWord设置页码奇偶页不同Footer::EVEN
  12. Debussy-54v9安装
  13. 2022年全球与中国激光预警系统市场现状及未来发展趋势
  14. 201871010104-陈园园 《面向对象程序设计(java)》第二周学习总结
  15. C# GroupBy 用法
  16. ov5645 mipi 驱动
  17. 基于stm32单片机的超声波测距显示倒车雷达提醒报警系统Proteus仿真
  18. mysql-查询日期在一个时间段的两种方法
  19. 微博粉丝精灵_微博、抖音、豆瓣等被点名通报!
  20. 风险投资案例典型分析

热门文章

  1. X染色体的基因型填充
  2. 计算机软件水平考试哪个好考,2020年计算机软考高级哪个好考
  3. 动态人脸识别原理和相关测试数据
  4. 初识遗传算法(二): 适应度地形与协同进化
  5. 年休假、婚丧假、产假、病假、事假分别有多少天?你必须懂!
  6. 票根不符合目标服务_档案数字化加工服务广州市天河区岑村东公司电话
  7. 华为带火落后的增程式技术,吓得传统汽车企业瑟瑟发抖
  8. c语言六角星,[转载]六角星的拼法
  9. esata 安装 xp
  10. 异构网络环境matlab搭建代码,异构接入matlab