Android开发之百度地图的使用

首先需要在百度: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.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();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值