第十六章

2020-12-23  本文已影响0人  贤兵

一、百度地图

0.获取debug.keystore中的证书指纹

Mac中,debug.keystore位于:/Users/wangxianbing/.android/debug.keystore
Window中,debug.keystore位于:C:\Users\Administrator.android\debug.keystore
获取keystore中的指纹:
keytool -v -list -keystore /Users/wangxianbing/.android/debug.keystore


图片.png

参考:
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-project/ak

1、注册

1.百度地图首页

http://lbsyun.baidu.com/

2.点击立即注册

图片.png

3.打开新页面

http://lbsyun.baidu.com/apiconsole/key/create

图片.png
需要同意服务条款

4.打开我的应用页面

图片.png

5.创建应用

图片.png

6.填入sha1和packagename后点击提交,创建完成

图片.png
注意,sha1是上文中提到的方法获得
注意访问应用(AK)

参考:
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-project/ak
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-project/androidstudio

2、下载sdk

1.进入http://lbsyun.baidu.com/,点击Android地图SDK

图片.png

2.点击自定义下载

图片.png

3.出了默认选中的基础地图,检索功能,LBS云检索,计算工具之外,加上全量定位

图片.png

4.点击下载开发包

参考:
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-project/androidstudio

3、集成sdk,显示基本地图

1.新建工程

注意包名(application id)需要和上文平台里配置的一致

2.把下载的jar和so拷贝到新建工程中

3.gradle配置sourceSets

sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}

4.gradle的dependencies中增加

implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation files("libs/BaiduLBS_Android.jar")

5.manifest中新增:

<uses-permission android:name="android.permission.ACCESS_COARSE_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.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />

6.manifest中的application中增加

<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="0rcm6GVBb60pHwxDTQGwY8r3BoLmZFpj" />
注意替换value的值

7.新建application的子类,并在manifest中配置

8.在新建的application中初始化

// 在使用 SDK 各组间之前初始化 context 信息,传入 ApplicationContext
// 默认本地个性化地图初始化方法
SDKInitializer.initialize(this);

//自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
//包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
SDKInitializer.setCoordType(CoordType.BD09LL);

9.新建Activity,并在manifest中配置

10.新activity的layout中,增加

<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" />

11.新建Activity的onCreate中新增

mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();

参考:
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-map/showmap

4、切换地图显示

    MapView mMapView;
    BaiduMap mBaiduMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map_type);
        //获取地图控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();
        findViewById(R.id.normal).setOnClickListener(v -> {
            mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
        });

        findViewById(R.id.satellite).setOnClickListener(v -> {
            mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
        });

        findViewById(R.id.none).setOnClickListener(v -> {
            mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);
        });
    }

参考:
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-map/maptype

5、显示定位(我的当前位置)

    MapView mMapView;
    BaiduMap mBaiduMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_loation);
        //获取地图控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();
        mBaiduMap.setMyLocationEnabled(true);

        findViewById(R.id.button).setOnClickListener(v -> {
            init();
        });
    }

    LocationClient mLocationClient;

    private void init() {
        //定位初始化
        mLocationClient = new LocationClient(this);

        //通过LocationClientOption设置LocationClient相关参数
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true); // 打开gps
        option.setCoorType("bd09ll"); // 设置坐标类型
        option.setScanSpan(1000);

        //设置locationClientOption
        mLocationClient.setLocOption(option);

        //注册LocationListener监听器
        MyLocationListener myLocationListener = new MyLocationListener();
        mLocationClient.registerLocationListener(myLocationListener);
        //开启地图定位图层
        mLocationClient.start();
    }

    public class MyLocationListener extends BDAbstractLocationListener {
        boolean isFirstLoc = true;
        private LatLng mLatLng;
        @Override
        public void onReceiveLocation(BDLocation location) {
            //mapView 销毁后不在处理新接收的位置
            if (location == null || mMapView == null) {
                return;
            }
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                    // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(location.getDirection()).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            mBaiduMap.setMyLocationData(locData);

            if (isFirstLoc) {
                isFirstLoc = false;
                mLatLng = new LatLng(location.getLatitude(), location.getLongitude());
                MapStatus.Builder builder = new MapStatus.Builder();
                builder.target(mLatLng).zoom(18.0f);
                mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
            }
        }
    }

参考:
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-map/location

6、 地理编码及逆地理编码

public class GeoCodeActivity extends AppCompatActivity {
    GeoCoder mCoder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_geo_code);

        findViewById(R.id.geo_code).setOnClickListener(v -> {
            mCoder.geocode(new GeoCodeOption()
                    .city("北京")
                    .address("北京上地十街10号"));
        });
        findViewById(R.id.reverse_geo_code).setOnClickListener(v -> {
            LatLng point = new LatLng(39.266847, 117.11638);
            mCoder.reverseGeoCode(new ReverseGeoCodeOption()
                    .location(point)
                    // 设置是否返回新数据 默认值0不返回,1返回
                    .newVersion(1)
                    // POI召回半径,允许设置区间为0-1000米,超过1000米按1000米召回。默认值为1000
                    .radius(500));
        });
        init();
    }
    private void init() {
        mCoder = GeoCoder.newInstance();
        mCoder.setOnGetGeoCodeResultListener(listener);
    }
    OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {
        @Override
        public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
            if (null != geoCodeResult && null != geoCodeResult.getLocation()) {
                if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
                    //没有检索到结果
                    return;
                } else {
                    double latitude = geoCodeResult.getLocation().latitude;
                    double longitude = geoCodeResult.getLocation().longitude;
                    Toast.makeText(GeoCodeActivity.this, "latitude: " + latitude + " longitude: " + longitude, Toast.LENGTH_SHORT).show();
                }
            }
        }

        @Override
        public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
            if (reverseGeoCodeResult == null || reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
                //没有找到检索结果
                return;
            } else {
                //详细地址
                String address = reverseGeoCodeResult.getAddress();
                //行政区号
                int adCode = reverseGeoCodeResult.getCityCode();

                Toast.makeText(GeoCodeActivity.this, reverseGeoCodeResult.toString(), Toast.LENGTH_SHORT).show();
            }
        }
    };

}

参考:
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/search/geo

7、 电子围栏

public class FenceActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fence);
        init();

        findViewById(R.id.button).setOnClickListener(v-> {
            addFence();
        });
    }

    private void addFence() {
        //创建一个中心点坐标
        DPoint centerPoint = new DPoint(39.266847,117.11638);
        //设置中心点纬度
        centerPoint.setLatitude(39.266847);
        //设置中心点经度
        centerPoint.setLongitude(117.11638);

        //设置中心点坐标系类型
        //public static final String BD09LL 百度经纬度坐标
        //public static final String BD09MC  百度墨卡托米制坐标
        //public static final String GCJ02 国测局坐标系
        //public static final String WGS84 GPS获取的坐标

        mGeoFenceClient.addGeoFence (centerPoint,GeoFenceClient.BD09LL,1000,"0001");
    }
    GeoFenceClient mGeoFenceClient;
    private void init() {
        //实例化地理围栏客户端
        mGeoFenceClient = new GeoFenceClient(getApplicationContext());

        //设置希望侦测的围栏触发行为,默认只侦测用户进入围栏的行为
        //public static final int GEOFENCE_IN 进入地理围栏
        //public static final int GEOFENCE_OUT 退出地理围栏
        //public static final int GEOFENCE_STAYED 在地理围栏内停留
        //public static final int GEOFENCE_IN_OUT 进入、退出地理围栏
        //public static final int GEOFENCE_IN_STAYED 进入地理围栏、在地理围栏内停留
        //public static final int GEOFENCE_OUT_STAYED 退出地理围栏、在地理围栏内停留
        //public static final int GEOFENCE_IN_OUT_STAYED 进入、退出、停留
        mGeoFenceClient.setActivateAction(GeoFenceClient.GEOFENCE_IN_OUT_STAYED);

        /**
         * setTriggerCount(int in, int out, int stay)
         * 设置进入围栏、离开围栏、在围栏内停留三种侦听行为的触发次数
         * @param in 进入围栏的触发次数,类型为int,必须是>=0
         * @param out 离开围栏的触发次数,类型为int,必须是>=0
         * @param stay 在围栏内停留的触发次数,类型为int,必须是>=0
         */
        mGeoFenceClient.setTriggerCount(3, 3, 2);

        /**
         * setStayTime(int interval)
         * 当设置了在围栏内停留的侦听行为,可以通过这个方法设置停留时长,单位秒,默认停留时长为10分钟
         * @param interval,单位秒
         */
        mGeoFenceClient.setStayTime(180);

        //创建回调监听
        GeoFenceListener fenceListenter = new GeoFenceListener() {

            @Override
            public void onGeoFenceCreateFinished(List<GeoFence> list, int i, String s) {
                if(i == GeoFence.ADDGEOFENCE_SUCCESS){//判断围栏是否创建成功
                    Toast.makeText(FenceActivity.this, "添加围栏成功!!", Toast.LENGTH_SHORT).show();
                    //geoFenceList是已经添加的围栏列表,可据此查看创建的围栏
                } else {
                    Toast.makeText(FenceActivity.this, "添加围栏失败!!", Toast.LENGTH_SHORT).show();
                }
            }

        };
        mGeoFenceClient.setGeoFenceListener(fenceListenter);//设置回调监听

        //创建并设置PendingIntent
        mGeoFenceClient.createPendingIntent(GEOFENCE_BROADCAST_ACTION);

        IntentFilter filter = new IntentFilter(
                ConnectivityManager.CONNECTIVITY_ACTION);
        filter.addAction(GEOFENCE_BROADCAST_ACTION);
        registerReceiver(mGeoFenceReceiver, filter);
    }

    private BroadcastReceiver mGeoFenceReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(GEOFENCE_BROADCAST_ACTION)) {
                //获取Bundle
                Bundle bundle = intent.getExtras();
                //获取围栏行为:
                int status = bundle.getInt(GeoFence.BUNDLE_KEY_FENCESTATUS);
                //获取自定义的围栏标识:
                String customId = bundle.getString(GeoFence.BUNDLE_KEY_CUSTOMID);
                //获取围栏ID:
                String fenceId = bundle.getString(GeoFence.BUNDLE_KEY_FENCEID);
                //获取当前有触发的围栏对象:
                GeoFence fence = bundle.getParcelable(GeoFence.BUNDLE_KEY_FENCE);
                Toast.makeText(FenceActivity.this, ""+fence.toString(), Toast.LENGTH_SHORT).show();
            }
        }
    };

    //定义接收的action字符串
    public static final String GEOFENCE_BROADCAST_ACTION = "com.location.apis.geofencedemo.broadcast";
}

参考:
http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/addition-func/loc-geofence

8、路径规划

将BaiduMapsApiASDemo中的assets资源以及overlayutil中的代码拷贝过来

public class DrivingRouteActivity extends AppCompatActivity {
    MapView mMapView;
    BaiduMap mBaiduMap;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_driving_route);
        //获取地图控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();

        findViewById(R.id.button).setOnClickListener(v -> {
            PlanNode stNode = PlanNode.withCityNameAndPlaceName("北京", "西二旗地铁站");
            PlanNode enNode = PlanNode.withCityNameAndPlaceName("北京", "百度科技园");
            mSearch.drivingSearch((new DrivingRoutePlanOption())
                    .from(stNode)
                    .to(enNode));
        });

        init();
    }
    RoutePlanSearch mSearch;
    private void init() {
        mSearch = RoutePlanSearch.newInstance();
        mSearch.setOnGetRoutePlanResultListener(listener);
    }

    OnGetRoutePlanResultListener listener = new OnGetRoutePlanResultListener() {
        @Override
        public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {

        }

        @Override
        public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {

        }

        @Override
        public void onGetMassTransitRouteResult(MassTransitRouteResult massTransitRouteResult) {

        }

        @Override
        public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
            //创建DrivingRouteOverlay实例
            DrivingRouteOverlay overlay = new DrivingRouteOverlay(mBaiduMap);
            if (drivingRouteResult.getRouteLines().size() > 0) {
                //获取路径规划数据,(以返回的第一条路线为例)
                //为DrivingRouteOverlay实例设置数据
                overlay.setData(drivingRouteResult.getRouteLines().get(0));
                //在地图上绘制DrivingRouteOverlay
                overlay.addToMap();
            }
        }

        @Override
        public void onGetIndoorRouteResult(IndoorRouteResult indoorRouteResult) {

        }

        @Override
        public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {

        }
    };

    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        mMapView.onResume();
    }
    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
        mMapView.onPause();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
        mMapView.onDestroy();
    }
}

参考:
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/route/drive

二、七牛

上一篇下一篇

猜你喜欢

热点阅读