您的位置:首页 > 移动开发 > Android开发

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:
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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐