Android开发之百度地图的使用
2017-08-14 14:07
134 查看
首先需要在百度:http://developer.baidu.com/user/reg申请一个API Key在创建应用时发布版SHA1可在Android Studio的右侧工具类的Gradle——项目名——:app——Task
——android,双击该目录下的signingReport中查看,开发版SHA1可与发布版一样。然后再下载开发包选择基础地图和定位功能,解压开发包,把根目录下的
BaiduBS_Android.jar复制到app目录下的libs目录中,再在src/main目录下新建一个jniLibs文件夹,将开发包其余文件夹都复制到该文件夹下,再点击一下Sync按钮。
在布局文件中创建一个TextView控件显示位置信息,在AndroidManifest中添加一些permission和注册服务,在MainActivity中要动态注册一些敏感权限,注册位置监听器。
具体代码如下:
AndroidManifest.xml:<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="mole.test">
<uses-permission android:name="android.permission.ACCESS_COASE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="2NEQvOIE1wW4bKbsvApzyzlexGLGGXv3"/>
<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>
</application>
</manifest>
ManActivity.class:
MainActivity.class: ......
private void requestLocation(){
initLocation();
locationClient.start(); //触发监听器
}
private void initLocation(){
LocationClientOption option=new LocationClientOption();
option.setScanSpan(5000);
option.setIsNeedAddress(true);
locationClient.setLocOption(option);
}
@Override
protected void onDestroy(){
super.onDestroy();
locationClient.stop();
}
.....
//监听器类
public class MyLocationListener implements BDLocationListener {
@Override
public void onConnectHotSpotMessage(String s, int i) {
}
@Override
public void onReceiveLocation(BDLocation location){
StringBuilder currentPosition=new StringBuilder();
currentPosition.append("纬度:").append(location.getLatitude()).append("\n");
currentPosition.append("经线:").append(location.getLongitude()).append("\n");
currentPosition.append("国家:").append(location.getCountry()).append("\n");
currentPosition.append("省份:").append(location.getProvince()).append("\n");
currentPosition.
4000
append("城市:").append(location.getCity()).append("\n");
currentPosition.append("区县:").append(location.getDistrict()).append("\n");
currentPosition.append("街道:").append(location.getStreet()).append("\n");
currentPosition.append("定位方式:");
if(location.getLocType()==BDLocation.TypeGpsLocation){
currentPosition.append("GPS");
}else if(location.getLocType()==BDLocation.TypeNetWorkLocation){
currentPosition.append("网络");
}
positionText.setText(currentPosition);
}
}
......
加载百度地图:
先初始化,再新建MapView对象绑定地图api控件,最后重写3个方法。
移动到本机所在地:
新建BaiduMap示例,联系MapView对象,编写一个获取本机纬度经度和设置缩放级别以BDLocation对象为参数的方法,再在监听类中调用该方法。代码如下:
MainActivity.class:import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
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.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 java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private LocationClient locationClient;
private TextView positionText;
private MapView mapView; //加载百度地图,默认位置为北京市
private BaiduMap baiduMap; //用于在百度地图定位到本机所处位置
private boolean isFirstLocate=true;
@Override
protected void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
locationClient=new LocationClient(getApplicationContext());
locationClient.registerLocationListener(new MyLocationListener()); //注册位置监听器
SDKInitializer.initialize(getApplicationContext()); //加载百度地图,初始化,必须在绑定布局前初始化
setContentView(R.layout.activity_main);
positionText=(TextView)findViewById(R.id.position_text_view);
mapView=(MapView)findViewById(R.id.bmapView); //加载百度地图,绑定地图控件
baiduMap=mapView.getMap(); //获取地图管理器以操作地图
activity_main.layout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/position_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"/>
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"/>
</LinearLayout>
在地图上显示我:
MainActivity.class:protected void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
。。。。
baiduMap.setMyLocationEnabled(true);
}
——android,双击该目录下的signingReport中查看,开发版SHA1可与发布版一样。然后再下载开发包选择基础地图和定位功能,解压开发包,把根目录下的
BaiduBS_Android.jar复制到app目录下的libs目录中,再在src/main目录下新建一个jniLibs文件夹,将开发包其余文件夹都复制到该文件夹下,再点击一下Sync按钮。
在布局文件中创建一个TextView控件显示位置信息,在AndroidManifest中添加一些permission和注册服务,在MainActivity中要动态注册一些敏感权限,注册位置监听器。
具体代码如下:
AndroidManifest.xml:<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="mole.test">
<uses-permission android:name="android.permission.ACCESS_COASE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="2NEQvOIE1wW4bKbsvApzyzlexGLGGXv3"/>
<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>
</application>
</manifest>
ManActivity.class:
import android.Manifest; import android.content.pm.PackageManager; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.widget.TextView; import android.widget.Toast; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private LocationClient locationClient; private TextView positionText; @Override protected void onCreate(Bundle saveInstanceState){ super.onCreate(saveInstanceState); setContentView(R.layout.activity_main); positionText=(TextView)findViewById(R.id.position_text_view); locationClient=new LocationClient(getApplicationContext()); locationClient.registerLocationListener(new MyLocationListener()); //注册位置监听器 List<String> permissionList=new ArrayList<>(); //存放需要动态申请运行时权限的权限 if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){ permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION); } if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.READ_PHONE_STATE)!=PackageManager.PERMISSION_GRANTED){ permissionList.add(Manifest.permission.READ_PHONE_STATE); } if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){ permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } if(!permissionList.isEmpty()){ //不为空则说明需要申请权限 String[] permissions=permissionList.toArray(new String[permissionList.size()]); ActivityCompat.requestPermissions(MainActivity.this,permissions,1); }else{ requestLocation(); } } private void requestLocation(){ locationClient.start(); //触发监听器 } @Override public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults){ switch(requestCode){ case 1: if(permissions.length>0){ for(int result:grantResults){ if(result!=PackageManager.PERMISSION_GRANTED){ Toast.makeText(MainActivity.this,"需要权限!",Toast.LENGTH_SHORT).show(); finish(); return; } } requestLocation(); }else{ Toast.makeText(MainActivity.this,"未知错误!",Toast.LENGTH_SHORT).show(); finish(); } } } //监听器类 public class MyLocationListener implements BDLocationListener { @Override public void onConnectHotSpotMessage(String s, int i) { } @Override public void onReceiveLocation(BDLocation location){ StringBuilder currentPosition=new StringBuilder(); currentPosition.append("纬度:").append(location.getLatitude()).append("\n"); currentPosition.append("经线:").append(location.getLongitude()).append("\n"); currentPosition.append("定位方式:"); if(location.getLocType()==BDLocation.TypeGpsLocation){ currentPosition.append("GPS"); }else if(location.getLocType()==BDLocation.TypeNetWorkLocation){ currentPosition.append("网络"); } positionText.setText(currentPosition); } } }显示自己看得懂的位置,代码如下:
MainActivity.class: ......
private void requestLocation(){
initLocation();
locationClient.start(); //触发监听器
}
private void initLocation(){
LocationClientOption option=new LocationClientOption();
option.setScanSpan(5000);
option.setIsNeedAddress(true);
locationClient.setLocOption(option);
}
@Override
protected void onDestroy(){
super.onDestroy();
locationClient.stop();
}
.....
//监听器类
public class MyLocationListener implements BDLocationListener {
@Override
public void onConnectHotSpotMessage(String s, int i) {
}
@Override
public void onReceiveLocation(BDLocation location){
StringBuilder currentPosition=new StringBuilder();
currentPosition.append("纬度:").append(location.getLatitude()).append("\n");
currentPosition.append("经线:").append(location.getLongitude()).append("\n");
currentPosition.append("国家:").append(location.getCountry()).append("\n");
currentPosition.append("省份:").append(location.getProvince()).append("\n");
currentPosition.
4000
append("城市:").append(location.getCity()).append("\n");
currentPosition.append("区县:").append(location.getDistrict()).append("\n");
currentPosition.append("街道:").append(location.getStreet()).append("\n");
currentPosition.append("定位方式:");
if(location.getLocType()==BDLocation.TypeGpsLocation){
currentPosition.append("GPS");
}else if(location.getLocType()==BDLocation.TypeNetWorkLocation){
currentPosition.append("网络");
}
positionText.setText(currentPosition);
}
}
......
加载百度地图:
先初始化,再新建MapView对象绑定地图api控件,最后重写3个方法。
移动到本机所在地:
新建BaiduMap示例,联系MapView对象,编写一个获取本机纬度经度和设置缩放级别以BDLocation对象为参数的方法,再在监听类中调用该方法。代码如下:
MainActivity.class:import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
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.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 java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private LocationClient locationClient;
private TextView positionText;
private MapView mapView; //加载百度地图,默认位置为北京市
private BaiduMap baiduMap; //用于在百度地图定位到本机所处位置
private boolean isFirstLocate=true;
@Override
protected void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
locationClient=new LocationClient(getApplicationContext());
locationClient.registerLocationListener(new MyLocationListener()); //注册位置监听器
SDKInitializer.initialize(getApplicationContext()); //加载百度地图,初始化,必须在绑定布局前初始化
setContentView(R.layout.activity_main);
positionText=(TextView)findViewById(R.id.position_text_view);
mapView=(MapView)findViewById(R.id.bmapView); //加载百度地图,绑定地图控件
baiduMap=mapView.getMap(); //获取地图管理器以操作地图
List<String> permissionList=new ArrayList<>(); //存放需要动态申请运行时权限的权限 if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){ permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION); } if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.READ_PHONE_STATE)!=PackageManager.PERMISSION_GRANTED){ permissionList.add(Manifest.permission.READ_PHONE_STATE); } if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){ permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } if(!permissionList.isEmpty()){ //不为空则说明需要申请权限 String[] permissions=permissionList.toArray(new String[permissionList.size()]); ActivityCompat.requestPermissions(MainActivity.this,permissions,1); }else{ requestLocation(); } } //在地图上定位本机所在地 private void navigateTo(BDLocation location){ if(isFirstLocate){ LatLng ll=new LatLng(location.getLatitude(),location.getLongitude()); //获取所在地的纬度和经度 MapStatusUpdate update= MapStatusUpdateFactory.newLatLng(ll); baiduMap.animateMapStatus(update); update=MapStatusUpdateFactory.zoomTo(16f); //设定地图的缩放级别 baiduMap.animateMapStatus(update); isFirstLocate=false; }
} //加载百度地图 @Override protected void onResume(){ super.onResume(); mapView.onResume(); } @Override protected void onPause(){ super.onPause(); mapView.onPause(); } private void requestLocation(){ initLocation(); locationClient.start(); //触发监听器 } private void initLocation(){ LocationClientOption option=new LocationClientOption(); option.setScanSpan(5000); option.setIsNeedAddress(true); locationClient.setLocOption(option); } @Override protected void onDestroy(){ super.onDestroy(); locationClient.stop(); mapView.onDestroy(); } @Override public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults){ switch(requestCode){ case 1: if(permissions.length>0){ for(int result:grantResults){ if(result!=PackageManager.PERMISSION_GRANTED){ Toast.makeText(MainActivity.this,"需要权限!",Toast.LENGTH_SHORT).show(); finish(); return; } } requestLocation(); }else{ Toast.makeText(MainActivity.this,"未知错误!",Toast.LENGTH_SHORT).show(); finish(); } } } //监听器类 public class MyLocationListener implements BDLocationListener { @Override public void onConnectHotSpotMessage(String s, int i) { } @Override public void onReceiveLocation(BDLocation location){ if(location.getLocType()==BDLocation.TypeGpsLocation||location.getLocType()==BDLocation.TypeNetWorkLocation){ //传入location参数调用navigateTo方法,在地图上定位本机所在地 navigateTo(location); } StringBuilder currentPosition=new StringBuilder(); currentPosition.append("纬度:").append(location.getLatitude()).append("\n"); currentPosition.append("经线:").append(location.getLongitude()).append("\n"); currentPosition.append("国家:").append(location.getCountry()).append("\n"); currentPosition.append("省份:").append(location.getProvince()).append("\n"); currentPosition.append("城市:").append(location.getCity()).append("\n"); currentPosition.append("区县:").append(location.getDistrict()).append("\n"); currentPosition.append("街道:").append(location.getStreet()).append("\n"); currentPosition.append("定位方式:"); if(location.getLocType()==BDLocation.TypeGpsLocation){ currentPosition.append("GPS"); }else if(location.getLocType()==BDLocation.TypeNetWorkLocation){ currentPosition.append("网络"); } positionText.setText(currentPosition); } } }
activity_main.layout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/position_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"/>
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"/>
</LinearLayout>
在地图上显示我:
MainActivity.class:protected void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
。。。。
baiduMap.setMyLocationEnabled(true);
}
private void navigateTo(BDLocation location){ if(isFirstLocate){ LatLng ll=new LatLng(location.getLatitude(),location.getLongitude()); //获取所在地的纬度和经度 MapStatusUpdate update= MapStatusUpdateFactory.newLatLng(ll); baiduMap.animateMapStatus(update); update=MapStatusUpdateFactory.zoomTo(16f); //设定地图的缩放级别 baiduMap.animateMapStatus(update); isFirstLocate=false; } MyLocationData.Builder locationBuilder=new MyLocationData.Builder(); locationBuilder.latitude(location.getLatitude()); locationBuilder.longitude(location.getLongitude()); MyLocationData locationData=locationBuilder.build(); baiduMap.setMyLocationData(locationData); }
protected void onDestroy(){ super.onDestroy(); baiduMap.setMyLocationEnabled(false); locationClient.stop(); mapView.onDestroy(); }
相关文章推荐
- Android 百度地图开发教程(一) 地图使用入门及地图表面覆盖物使用
- Android 百度地图开发(二)--- 定位功能之MyLocationOverlay,PopupOverlay的使用
- 使用百度地图开发一个导航定位demo-android学习之旅(77)
- android开发之学会使用百度地图
- Android基于位置的服务开发,百度地图的使用
- Android 百度地图开发(二)--- 定位功能之MyLocationOverlay,PopupOverlay的使用
- Android 百度地图开发(二)--- 定位功能之MyLocationOverlay,PopupOverlay的使用
- Android 百度地图开发(二)--- 定位功能之MyLocationOverlay,PopupOverlay的使用
- android 开发之 百度地图的使用
- 使用百度地图开发一个导航定位demo-android学习之旅(77)
- Android使用百度地图开发时,出现定位无反应。log里出现162错误代码
- Android 百度地图开发(二)--- 定位功能之MyLocationOverlay,PopupOverlay的使用
- Android开发之百度地图的简单使用
- [置顶] Android 百度地图开发--- 导航功能输入起始地址实现导航,地址解析与反解析的使用
- Android 百度地图开发(二)--- 定位功能之MyLocationOverlay,PopupOverlay的使用
- Android 百度地图开发(二)--- 定位功能之MyLocationOverlay,PopupOverlay的使用
- Android 百度地图开发(二)--- 定位功能之MyLocationOverlay,PopupOverlay的使用
- Android 百度地图开发(二)--- 定位功能之MyLocationOverlay,PopupOverlay的使用
- android开发中使用百度地图定位功能遇到的问题!
- android studio 开发android项目使用百度地图时候出错