Android如何集成百度、高德、腾讯地图

百度
  1:首先,到百度地图API网址去注册;百度地图API,获取Appkey的过程。
  
进入控制台cmd:
进入控制台cmd

定位到.android:
定位到.android

输入命令获取SHA1:
输入命令获取SHA1
上图所用的是debug.keystore签名文件,一般开发测试过程中则用该文件,密钥库口令是android。如果我们想要使用自己的签名文件,看下图。
使用自己的签名文件

2:下载你所需要的开发包,并在AndroidManifest.xml文件中添加必要的代码,如下图:

根据自己需求下载不同的.jar包和.so包
根据自己需求下载不同的.jar包和.so包

添加到lib下面,我这里以定位包为例:
添加到lib下面,这里以定位包为例

AndroidManifest.xml文件:
AndroidManifest.xml文件

3:代码编写,我直接把代码贴上来。

BaseApplication 中进行初始化,这个一定要添加,非常重要,否则地图出不来。

public class BaseApplication extends Application{

    @Override
    public void onCreate() {
        super.onCreate();
        SDKInitializer.initialize(getApplicationContext());
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
    }
}

定位类:

import android.os.Bundle;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
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.map.MyLocationConfiguration.LocationMode;
import com.baidu.mapapi.model.LatLng;
import com.function.BaseActivity;
import com.function.R;

public class BaiduLocationActivity extends BaseActivity{

    private MapView mapView;
    private BaiduMap baiduMap;
    private BaiduLocationListener mListener = new BaiduLocationListener();
    private LocationClient locClient;
    private LocationClientOption locClientOpt;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.baidu_location_activity);
        mapView = (MapView)findViewById(R.id.baidu_map);
        init();
    }

    private void init(){
        baiduMap = mapView.getMap();
        baiduMap.setMyLocationEnabled(true);
        MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(16.0f);
        baiduMap.setMapStatus(msu);
        BitmapDescriptor bitmapDesc = BitmapDescriptorFactory.fromResource(R.drawable.location_marker);
        baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(LocationMode.NORMAL, true, bitmapDesc));

        locClient = new LocationClient(this);
        locClient.registerLocationListener(mListener);
        locClientOpt = new LocationClientOption();
        locClientOpt.setOpenGps(true);// 打开gps
        locClientOpt.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;
        locClientOpt.setScanSpan(1000);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
//      locClientOpt.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
//      locClientOpt.setNeedDeviceDirect(false);//可选,设置是否需要设备方向结果
//      locClientOpt.setLocationNotify(false);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
//      locClientOpt.setIgnoreKillProcess(true);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死   
//      locClientOpt.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
        locClient.setLocOption(locClientOpt);
        locClient.start();
    }

    @Override
    protected void onResume() {
        mapView.onResume();
        super.onResume();
    }

    @Override
    protected void onPause() {
        mapView.onPause();
        super.onPause();
    }

    @Override
    protected void onDestroy() {
        mapView = null;
        super.onDestroy();
    }

    private class BaiduLocationListener implements BDLocationListener{

        @Override
        public void onReceiveLocation(BDLocation location) {
            // map view 销毁后不在处理新接收的位置
            if (location == null || mapView == null){
                return;
            }

            MyLocationData locData = new MyLocationData.Builder()
                  .accuracy(location.getRadius())
                  .direction(100).latitude(location.getLatitude())
                  .longitude(location.getLongitude()).build();
            baiduMap.setMyLocationData(locData);
            LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());
            MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
            baiduMap.animateMapStatus(u);
        }
    }

}

运行结果:
运行结果

高德
1:同样是到高德的地图API进行注册、获取AppKey,高德地图API
获取key的方法是一样的,高德这里可以同时使用debug和发布情况下的两个SHA1,如下图:
申请高德key

2:下载.jar包和.so包,并添加到lib下:
高德的jar包和so包

3:AndroidManifest.xml文件:
AndroidManifest.xml文件

4:代码编写:

import android.graphics.Color;
import android.os.Bundle;
import android.view.Window;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationClientOption.AMapLocationMode;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.maps2d.AMap;
import com.amap.api.maps2d.CameraUpdateFactory;
import com.amap.api.maps2d.LocationSource;
import com.amap.api.maps2d.MapView;
import com.amap.api.maps2d.model.BitmapDescriptorFactory;
import com.amap.api.maps2d.model.MyLocationStyle;
import com.function.BaseActivity;
import com.function.R;
import com.function.utils.Log4Lsy;

public class AmapLocationActivity extends BaseActivity implements AMapLocationListener,LocationSource{

    private AMap aMap;
    private MapView mapView;
    private OnLocationChangedListener mListener;
    private AMapLocationClient mlocationClient;
    private AMapLocationClientOption mLocationOption;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.amap_location_activity);
        mapView = (MapView) findViewById(R.id.amap_map);
        mapView.onCreate(savedInstanceState);// 此方法必须重写
        init();
    }

    private void init(){
        if (aMap == null) {
            aMap = mapView.getMap();
            setMapProperty();
        }
    }

    private void setMapProperty(){
        // 自定义系统定位小蓝点
        MyLocationStyle myLocationStyle = new MyLocationStyle();
        myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.drawable.location_marker));// 设置小蓝点的图标
        myLocationStyle.strokeColor(Color.BLACK);// 设置圆形的边框颜色
        myLocationStyle.radiusFillColor(Color.argb(100, 0, 0, 180));// 设置圆形的填充颜色
        myLocationStyle.strokeWidth(1.0f);// 设置圆形的边框粗细
        aMap.setMyLocationStyle(myLocationStyle);
        aMap.setLocationSource(this);// 设置定位监听
        aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示
        aMap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
        aMap.moveCamera(CameraUpdateFactory.zoomTo(13));//设置地图缩放级别
    }

    @Override
    protected void onResume() {
        super.onResume();
        mapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mapView.onPause();
        deactivate();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }

    /**
     * 定位成功后回调函数
     */
    @Override
    public void onLocationChanged(AMapLocation amapLocation) {
        if (mListener != null && amapLocation != null) {
            if (amapLocation != null&&amapLocation.getErrorCode() == 0) {
                mListener.onLocationChanged(amapLocation);// 显示系统小蓝点
            } else {
                String errText = "定位失败," + amapLocation.getErrorCode()+ ": " + amapLocation.getErrorInfo();
                Log4Lsy.e("AmapErr",errText);
            }
        }
    }

    /**
     * 激活定位
     */
    @Override
    public void activate(OnLocationChangedListener listener) {
        mListener = listener;
        if (mlocationClient == null) {
            mlocationClient = new AMapLocationClient(this);
            mLocationOption = new AMapLocationClientOption();
            //设置定位监听
            mlocationClient.setLocationListener(this);
            //设置为高精度定位模式
            mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
            //设置定位参数
            mlocationClient.setLocationOption(mLocationOption);
            // 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
            // 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求
            // 在定位结束后,在合适的生命周期调用onDestroy()方法
            // 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
            mlocationClient.startLocation();
        }
    }

    /**
     * 停止定位
     */
    @Override
    public void deactivate() {
        mListener = null;
        if (mlocationClient != null) {
            mlocationClient.stopLocation();
            mlocationClient.onDestroy();
        }
        mlocationClient = null;
    }

}

运行结果:
运行结果

腾讯
1:同样是到地图API网址去注册并获取AppKey的过程,跟上面都一样,腾讯地图API
腾讯SDK

2:下载.jar包和.so包:
腾讯的jar包和so包

3:AndroidManifest.xml文件:
AndroidManifest.xml文件

4:代码编写:

import android.graphics.Color;
import android.location.Location;
import android.os.Bundle;
import android.view.Window;

import com.function.BaseActivity;
import com.function.R;
import com.tencent.map.geolocation.TencentLocation;
import com.tencent.map.geolocation.TencentLocationListener;
import com.tencent.map.geolocation.TencentLocationManager;
import com.tencent.map.geolocation.TencentLocationRequest;
import com.tencent.tencentmap.mapsdk.maps.LocationSource;
import com.tencent.tencentmap.mapsdk.maps.MapView;
import com.tencent.tencentmap.mapsdk.maps.TencentMap;
import com.tencent.tencentmap.mapsdk.maps.model.CircleOptions;

public class TencentLocationActivity extends BaseActivity implements LocationSource,TencentLocationListener{

    private TencentLocationRequest locationRequest;
    private TencentLocationManager locationManager;

    private MapView mapView;
    private TencentMap tencentMap;

    private OnLocationChangedListener mChangedListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tencent_location_activity);
        mapView = (MapView)findViewById(R.id.tencent_map);
        init();
    }

    private void init(){

        tencentMap = mapView.getMap();
        CircleOptions circleOption = new CircleOptions();
        circleOption.strokeColor(Color.BLACK);
        circleOption.strokeWidth(1.0f);
        circleOption.fillColor(Color.argb(100, 0, 0, 180));
        circleOption.radius(5);
        tencentMap.addCircle(circleOption);

        locationRequest = TencentLocationRequest.create();
        locationRequest.setInterval(1000);
        locationRequest.setRequestLevel(TencentLocationRequest.REQUEST_LEVEL_NAME);
        locationRequest.setAllowCache(true);
        locationManager = TencentLocationManager.getInstance(this);

        tencentMap.setLocationSource(this);
        tencentMap.setMyLocationEnabled(true);
    }

    @Override
    protected void onResume() {
        super.onResume();
        locationManager.requestLocationUpdates(locationRequest, this);
        mapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        locationManager.removeUpdates(this);
        mapView.onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView = null;
        locationManager = null;
    }

    @Override
    public void activate(OnLocationChangedListener arg0) {
        mChangedListener = arg0;
        int err = locationManager.requestLocationUpdates(locationRequest, this);
        switch (err){
        case 1:
            setTitle("设备缺少使用腾讯定位服务需要的基本条件");
            break;
        case 2:
            setTitle("manifest 中配置的 key 不正确");
            break;
        case 3:
            setTitle("自动加载libtencentloc.so失败");
            break;
        }
    }

    @Override
    public void deactivate() {
        //结束定位
        locationManager.removeUpdates(this);
        mChangedListener = null;
        locationRequest = null;
        locationManager = null;
    }

    @Override
    public void onLocationChanged(TencentLocation arg0, int arg1, String arg2) {

        if (arg1 == TencentLocation.ERROR_OK && mChangedListener != null) {
            Location location = new Location(arg0.getProvider());
            location.setLatitude(arg0.getLatitude());
            location.setLongitude(arg0.getLongitude());
            location.setAccuracy(arg0.getAccuracy());
            mChangedListener.onLocationChanged(location); 
        }
    }

    @Override
    public void onStatusUpdate(String arg0, int arg1, String arg2) {

    }

}

三种地图的使用方法大致相同,多仔细认真看一下参考手册和官方提供的Demo,就应该很容易开发出你想要的功能了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值