本篇主要介绍一下如何使用百度地图API来实现定位以及地图的基本使用。
效果图如下:
步骤如下:
一、申请APIKey。
(1)注册百度账号并申请开发者资质:http://developer.baidu.com/user/reg
(2)开始创建应用,申请APIKey:http://lbsyun.baidu.com/apiconsole/key
其中,SHA1指纹可以通过下面方式获取:
开发AndroidStudio的任意一个项目,点击右侧工具栏的Gradle->项目名->:app->Tasks->android->signingReport。
二、准备LBS SDK
这里,需要下载基础地图和定位功能这两个SDK,下载好后,解压一下。
(1)把BaiduLBS_Android.jar复制到libs目录下。
(2)在main目录下,创建一个jniLibs目录,然后把其他所有的文件复制到该目录下。
(3)然后,运行File下的Sync...同步一下项目,以便可以引用到jar包的相应接口。
三、开始实现定位功能。
(1)布局文件就不说了,首先要修改一下清单文件AndroidManifest.xml:
(2)相应的MainActivity.java的代码如下:
主要就两个步骤:申请用户权限和实现BDLocationListener接口。
package com.example.mylocationdemo; import android.Manifest; import android.content.Context; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.tbruyelle.rxpermissions2.Permission; import com.tbruyelle.rxpermissions2.RxPermissions; import io.reactivex.functions.Consumer; public class MainActivity extends AppCompatActivity implements View.OnClickListener, BDLocationListener { private Context mContext; private RxPermissions rxPermissions; private Button btnStart; private TextView tvLocationInfo; private LocationClient mLocationClient; private int grantedPermissionNum = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); baseDataInit(); bindViews(); viewsAddListener(); viewsDataInit(); } @Override protected void onDestroy() { mLocationClient.stop(); super.onDestroy(); } private void baseDataInit() { mContext = this; mLocationClient = new LocationClient(mContext); rxPermissions = new RxPermissions(MainActivity.this); } private void bindViews() { btnStart = findViewById(R.id.Main_btnStart); tvLocationInfo = findViewById(R.id.Main_tvLocationInfo); } private void viewsAddListener() { btnStart.setOnClickListener(this); mLocationClient.registerNotifyLocationListener(this); } private void viewsDataInit() { } @Override public void onClick(View v) { switch (v.getId()) { case R.id.Main_btnStart: { checkUserAllPermissions(); break; } default:break; } } /** * 开始定位 */ private void startLocation() { initLocation(); mLocationClient.start(); } /** * 定时更新位置(每隔5s) */ private void initLocation() { LocationClientOption option = new LocationClientOption(); option.setScanSpan(5000); //强制使用GPS //option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors); //显示详细地址信息 option.setIsNeedAddress(true); mLocationClient.setLocOption(option); } @Override public void onReceiveLocation(BDLocation bdLocation) { new MyLocationAsyncTask().execute(bdLocation); } /** * 获取定位信息的异步任务 */ class MyLocationAsyncTask extends AsyncTask{ @Override protected String doInBackground(BDLocation... bdLocations) { BDLocation bdLocation = bdLocations[0]; StringBuilder currentPosition = new StringBuilder(); currentPosition.append("纬度:").append(bdLocation.getLatitude()).append("\n"); currentPosition.append("经度:").append(bdLocation.getLongitude()).append("\n"); currentPosition.append("定位方式:"); if (bdLocation.getLocType() == BDLocation.TypeGpsLocation) { currentPosition.append("GPS\n"); } else if (bdLocation.getLocType() == BDLocation.TypeNetWorkLocation) { currentPosition.append("网络\n"); } //以下显示详细信息 currentPosition.append("国家:").append(bdLocation.getCountry()).append("\n"); currentPosition.append("省份:").append(bdLocation.getProvince()).append("\n"); currentPosition.append("城市:").append(bdLocation.getCity()).append("\n"); currentPosition.append("区:").append(bdLocation.getDistrict()).append("\n"); currentPosition.append("街道:").append(bdLocation.getStreet()).append("\n"); return currentPosition.toString(); } @Override protected void onPostExecute(String s) { Toast.makeText(mContext, "更新完成", Toast.LENGTH_SHORT).show(); tvLocationInfo.setText(s); } } /** * 申请用户权限 */ private void checkUserAllPermissions() { rxPermissions .requestEach(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_STATE) .subscribe(new Consumer () { @Override public void accept(Permission permission) throws Exception { if (permission.granted) { grantedPermissionNum ++; } else if (permission.shouldShowRequestPermissionRationale) { } else { Toast.makeText(mContext, "定位服务需要您同意相关权限", Toast.LENGTH_SHORT).show(); } if (grantedPermissionNum == 3) { startLocation(); } } }); } }
以上是如何利用百度API来实现定位功能。下面附加一下基础地图的使用:
主要就是对MapView的使用以及相关操作。
(1)布局文件
(2)相应的MapActivity.java的代码如下:
package com.example.mylocationdemo; import android.Manifest; import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.widget.Toast; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; 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.map.MyLocationConfiguration; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.model.LatLng; import com.tbruyelle.rxpermissions2.Permission; import com.tbruyelle.rxpermissions2.RxPermissions; import io.reactivex.functions.Consumer; public class MapActivity extends AppCompatActivity { private Context mContext; private RxPermissions rxPermissions; private MapView mapView; private LocationClient mLocationClient; private BaiduMap baiduMap; private int grantedPermissionNum = 0; private boolean isFirstLocate = true; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //初始化操作一定要在setContentView之前!!! SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_map); rxPermissions = new RxPermissions(MapActivity.this); mContext = this; mLocationClient = new LocationClient(getApplicationContext()); mLocationClient.registerNotifyLocationListener(new MyLocationListener()); mapView = findViewById(R.id.Map_mapView); baiduMap = mapView.getMap(); baiduMap.setMyLocationEnabled(true); //设置定位图标是否有箭头 baiduMap.setMyLocationConfiguration(new MyLocationConfiguration( MyLocationConfiguration.LocationMode.FOLLOWING, true,null)); checkUserAllPermissions(); mLocationClient.start(); initLocation(); } /** * 定时更新位置(每隔5s) */ private void initLocation() { LocationClientOption option = new LocationClientOption(); option.setScanSpan(5000); //强制使用GPS option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors); //显示详细地址信息 option.setIsNeedAddress(true); mLocationClient.setLocOption(option); } @Override protected void onDestroy() { mLocationClient.stop(); mapView.onDestroy(); baiduMap.setMyLocationEnabled(false); super.onDestroy(); } @Override protected void onResume() { super.onResume(); mapView.onResume(); } @Override protected void onPause() { super.onPause(); mapView.onPause(); } public class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation bdLocation) { new MyLocationAsyncTask().execute(bdLocation); } } /** * 获取定位信息的异步任务 */ class MyLocationAsyncTask extends AsyncTask{ @Override protected Void doInBackground(BDLocation... bdLocations) { BDLocation bdLocation = bdLocations[0]; if (bdLocation.getLocType() == BDLocation.TypeGpsLocation || bdLocation.getLocType() == BDLocation.TypeNetWorkLocation) { navigateTo(bdLocation); } return null; } } private void navigateTo(BDLocation location) { if (isFirstLocate) { LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(latLng); baiduMap.animateMapStatus(update); update = MapStatusUpdateFactory.zoomTo(17f); baiduMap.animateMapStatus(update); isFirstLocate = false; } MyLocationData.Builder builder = new MyLocationData.Builder(); builder.latitude(location.getLatitude()); builder.longitude(location.getLongitude()); MyLocationData locationData = builder.build(); baiduMap.setMyLocationData(locationData); } /** * 申请用户权限 */ private void checkUserAllPermissions() { rxPermissions .requestEach(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_STATE) .subscribe(new Consumer () { @Override public void accept(Permission permission) throws Exception { if (permission.granted) { grantedPermissionNum ++; } else if (permission.shouldShowRequestPermissionRationale) { } else { Toast.makeText(mContext, "定位服务需要您同意相关权限", Toast.LENGTH_SHORT).show(); } if (grantedPermissionNum == 3) { } } }); } }