百度地图sdk使用

2017-05-16  本文已影响0人  比wing飛

准备


登陆百度地图开放平台,注册账号,添加应用。添加应用时需要包名和SHA1码,SHA1码需要在项目的工程目录下输入如下指令,用自己的keystore替换debug.keystore
keytool -list -v -keystore debug.keystore
结果如下:

SHA1码.png

配置


  1. 下载相关的资源包百度sdk下载
    (注意多试几次,有些下载的不能用,有错误肯定在这儿!!!!)
  2. 将下载得到的所有文件放到app/libs目录下,并且add dependence。


    添加百度jar包依赖.png

    添加完成后在bulid.gradle中添加sourceSets


    添加sourceSets.png
    完成后会在jniLibs中看到对应的文件
    jniLibs.png
  3. 在manifest中添加权限
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />```
以及
    <meta-data   
        android:name="com.baidu.lbsapi.API_KEY"
        android:value="开发者 key"/>```
  1. 使用前需要在application中的onCreate时添加SDKInitializer.initialize(this);

初始化中心点


     /**
     * 初始化map中心点
     * @param latitude  中心点纬度
     * @param longitude 中心点经度
     */
    private void initMapCenter(double latitude, double longitude) {
        // 初始化搜索模块,注册事件监听
        LatLng cenpt = new LatLng(latitude, longitude);
        //定义地图状态
        MapStatus mMapStatus = new MapStatus.Builder()
                .target(cenpt)
                .zoom(16)
                .build();
        MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
        //改变地图状态
        mBaiduMap.setMapStatus(mMapStatusUpdate);
    }

添加图钉


     /**
     * 添加图钉
     * @param latitude  图钉纬度
     * @param longitude 图钉经度
     */
    private void addOverlay(double markerLatitude, double markerLongitude) {
        LatLng cenpt = new LatLng(markerLatitude, markerLongitude);
        //构建Marker图标
        bd = BitmapDescriptorFactory
                .fromResource(R.drawable.icon_geo_blue);
        //构建MarkerOption,用于在地图上添加Marker
        OverlayOptions option = new MarkerOptions()
                .position(cenpt)
                .icon(bd)
                .zIndex(9);//设置marker所在层级
        //在地图上添加Marker,并显示
        bdMarker = (Marker) (mBaiduMap.addOverlay(option));
    }

泡泡


泡泡指的是地图上的marker点击后显示的内容,一般显示该marker的详细信息

     /**
     * 初始化泡泡窗口
     * @param marker 被点击的marker点
     */
    private void initInfoWindow(final Marker marker) {
        LatLng latLng = marker.getPosition();
        view = View.inflate(this, R.layout.pop_window, null);
        infoWindow = new InfoWindow(view, latLng, -47);
        mBaiduMap.showInfoWindow(infoWindow);
    }

隐藏泡泡
mBaiduMap.hideInfoWindow()


百度定位


  1. 在Mainfest中添加service
        <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service>
  1. LocationService
  /**
 * @author baidu
 */
public class LocationService {
    private LocationClient client = null;
    private LocationClientOption mOption;
    private LocationClientOption diyOption;
    private Object objLock = new Object();

    /***
     * @param locationContext
     */
    public LocationService(Context locationContext) {
        synchronized (objLock) {
            if (client == null) {
                client = new LocationClient(locationContext);
                client.setLocOption(getDefaultLocationClientOption());
            }
        }
    }
    /**
     * 注册监听
     * @param listener
     * @return
     */
    public boolean registerListener(BDLocationListener listener) {
        boolean isSuccess = false;
        if (listener != null) {
            client.registerLocationListener(listener);
            isSuccess = true;
        }
        return isSuccess;
    }
    /**
     * 反注册监听
     * @param listener
     */
    public void unregisterListener(BDLocationListener listener) {
        if (listener != null) {
            client.unRegisterLocationListener(listener);
        }
    }
    /***
     * @param option
     * @return isSuccessSetOption
     */
    public boolean setLocationOption(LocationClientOption option) {
        boolean isSuccess = false;
        if (option != null) {
            if (client.isStarted()) {
                client.stop();
            }
            diyOption = option;
            client.setLocOption(option);
            isSuccess = true;
        }
        return isSuccess;
    }
    public LocationClientOption getOption() {
        return diyOption;
    }
    /***
     * @return DefaultLocationClientOption
     */
    public LocationClientOption getDefaultLocationClientOption() {
        if (mOption == null) {
            mOption = new LocationClientOption();
            mOption.setLocationMode(LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
            mOption.setOpenGps(true); // 是否打开GPS
            mOption.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;
            mOption.setScanSpan(1000);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
            mOption.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
            mOption.setIsNeedLocationDescribe(true);//可选,设置是否需要地址描述
            mOption.setNeedDeviceDirect(true);//可选,设置是否需要设备方向结果
            mOption.setLocationNotify(false);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
            mOption.setIgnoreKillProcess(true);
            //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
            mOption.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation
            // .getLocationDescribe里得到,结果类似于“在北京天安门附近”
            mOption.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation
            // .getPoiList里得到
            mOption.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集

            mOption.setIsNeedAltitude(false);//可选,默认false,设置定位时是否需要海拔信息,默认不需要,除基础定位版本都可用
        }
        return mOption;
    }
    /**
     * 服务开始
     */
    public void start() {
        synchronized (objLock) {
            if (client != null && !client.isStarted()) {
                client.start();
            }
        }
    }
    /**
     * 服务停止
     */
    public void stop() {
        synchronized (objLock) {
            if (client != null && client.isStarted()) {
                client.stop();
            }
        }
    }
}
  1. locationservice实例化
       //获取locationservice实例
        locationService = ((MicroBandApp) getApplication()).locationService;
        locationService.setLocationOption(locationService.getDefaultLocationClientOption());
        //注册监听
        locationService.registerListener(this);
        // 开始定位
        locationService.start();
  1. 监听
    mBaiduMap.setMyLocationEnabled(true);
    在回调中获取当前的经纬度和地址

@Override
public void onReceiveLocation(BDLocation bdLocation) {
// 只是完成了定位
if (bdLocation == null || binding.bmapView == null) {
return;
}
Log.d(TAG, "onReceiveLocation: " + bdLocation.getLatitude() + "::" + bdLocation
.getLongitude());
}

5. 停止定位
    locationService.unregisterListener(this); //注销掉监听
    locationService.stop(); //停止定位服务
***
#导航--从当前位置开始
***
1. 调用百度地图进行导航

/**
* 调用百度地图导航
* @param endLat
* @param endLon
*/
public void loadBaiduMap(double endLat,double endLon) {
if (isInstallByread("com.baidu.BaiduMap")) {
Intent intent = null;
try {
intent = Intent.getIntent("baidumap://map/direction?origin=我的位置"+
"&destination=" +endLat+","+endLon+
"&mode=transit&sy=3&index=0&target=1");
} catch (URISyntaxException e) {
Log.e("intent", e.getMessage());
}
this.context.startActivity(intent); //启动调用
} else {
Toast.makeText(context, "请安装百度地图", Toast.LENGTH_SHORT).show();
}
}

2.  调用高德地图进行导航

/**
* 调用高德地图导航
* @param endLat
* @param endLon
*/
public void loadGaodeMap(double endLat,double endLon) {
if (isInstallByread("com.autonavi.minimap")) {
Intent intent = null;
try {
intent = Intent.getIntent("androidamap://route?sourceApplication=amap" +
"&dlat="+endLat+
"&dlon="+endLon+
"&dname=西溪新座&dev=0&t=1");
} catch (URISyntaxException e) {
Log.e("intent", e.getMessage());
}
this.context.startActivity(intent); //启动调用
} else {
Toast.makeText(context, "请安装高德地图", Toast.LENGTH_SHORT).show();
}
}

3. 参数
如果需要从非当前位置开始导航,可查询具体的参数设置
[百度URI API
](http://lbsyun.baidu.com/index.php?title=uri/api/android)

***
#定位服务
***
Android6.0以上定位服务的开启不仅需要在manifest中定义,用户还可以进行手动的开启或关闭

public class LocationPermissionUtil {
private static AlertDialog mAlertDialog;
private static final int PERMISSION_REQUEST_CODE = 0;//系统权限管理页面的参数

/**
 * Location service if enable
 *
 * @return location is enable if return true, otherwise disable.
 */
public static final boolean isLocationEnable(Context context) {
    LocationManager locationManager = (LocationManager) context.getSystemService(Context
            .LOCATION_SERVICE);
    boolean networkProvider = locationManager.isProviderEnabled(LocationManager
            .NETWORK_PROVIDER);
    boolean gpsProvider = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if (gpsProvider) {
        return true;
    }
    return false;
}

/**
 * 检查是否授予位置权限
 *
 * @return 权限检查通过返回true,不通过返回false
 */
public static boolean checkLocationPermission(Activity activity) {
    // For Android < Android M, self permissions are always granted.
    boolean result = true;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (getTargetSdkVersion(activity) >= Build.VERSION_CODES.M) {
            // targetSdkVersion >= Android M
            result = checkPermissions(activity, Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.ACCESS_FINE_LOCATION);
        } else {
            // targetSdkVersion < Android M
            result = selfPermissionGranted(activity, Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.ACCESS_FINE_LOCATION);
        }
    }
    return result;
}

/**
 * 目标sdk版本
 */
private static int getTargetSdkVersion(Context context) {
    try {
        final PackageInfo info = context.getPackageManager().getPackageInfo(
                context.getPackageName(), 0);
        return info.applicationInfo.targetSdkVersion;
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    return 0;
}

/**
 * 进入服务设置界面
 * @param context
 */
public static void startSetting(final Context context) {
    mAlertDialog = new AlertDialog.Builder(context)
            .setTitle("定位服务未开启")
            .setMessage("请在系统设置中开启定位服务")
            .setNegativeButton("设置", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Intent locationIntent = new Intent(Settings
                            .ACTION_LOCATION_SOURCE_SETTINGS);
                    context.startActivity(locationIntent);
                }
            })
            .setPositiveButton("好的", null)
            .setCancelable(false)
            .show();
}


/**
 * targetSdkVersion < Android M
 * 检查系统权限是否被授权
 *
 * @return 权限检查通过返回true,不通过返回false
 */
public static boolean selfPermissionGranted(Context context, String... permissions) {
    List<String> lackPermissions = new ArrayList<>();
    for (String permission : permissions) {
        // targetSdkVersion < Android M, we have to use PermissionChecker
        if (PermissionChecker.checkSelfPermission(context, permission) != PackageManager
                .PERMISSION_GRANTED) {
            lackPermissions.add(permission);
        }
    }
    if (!lackPermissions.isEmpty()) {
        return false;
    }
    return true;
}

/**
 * 检查系统权限是否被授权,如果没有授权,则执行请求授权的操作
 *
 * @return 权限检查通过返回true,不通过返回false
 */
public static boolean checkPermissions(Activity activity, String... permissions) {
    List<String> lackPermissions = new ArrayList<>();
    for (String permission : permissions) {
        if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager
                .PERMISSION_GRANTED) {
            lackPermissions.add(permission);
        }
    }
    if (!lackPermissions.isEmpty()) {
        requestPermissions(activity, lackPermissions.toArray(new String[lackPermissions.size()
                ]));
        return false;
    } else {
        return true;
    }
}

/**
 * 请求系统权限,兼容低版本
 */
public static void requestPermissions(Activity activity, String... permissions) {
    ActivityCompat.requestPermissions(activity, permissions, PERMISSION_REQUEST_CODE);
}

}

***
#链接
***
[百度api](http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v4_3_1/index.html?qq-pf-to=pcqq.c2c)
上一篇 下一篇

猜你喜欢

热点阅读