美文网首页
第十六章

第十六章

作者: 贤兵 | 来源:发表于2020-12-23 00:31 被阅读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

    二、七牛

    相关文章

      网友评论

          本文标题:第十六章

          本文链接:https://www.haomeiwen.com/subject/igfenktx.html