百度地图

首先这是个第三方,基础的东西就不说了;

直接进入正题:

首先复制jar包和so文件;把so文件在gradle中配置:

 sourceSets {
        main {
            jniLibs.srcDir 'libs'
        }
在清单文件中注册service:

  <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote">
        </service>
还需要进行key值得配置:

 <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="自己的key值" />
权限:

    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <!-- 这个权限用于进行网络定位 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 这个权限用于访问GPS定位 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_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.WAKE_LOCK" /> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!-- SD卡读取权限,用户写入离线定位数据 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
基本的环境配置已经完成;

自己的布局:

activity_location:

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

    </com.baidu.mapapi.map.MapView>

    <Button
        android:onClick="CheckLBS"
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="19dp"
        android:text="检索" />

    <Button
        android:onClick="dao"
        android:text="导航"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/button"
        android:layout_toEndOf="@+id/button"
        android:id="@+id/daohang" />

activity_main:

 <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true" />
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:orientation="horizontal"
    android:layout_alignParentBottom="true"
    android:layout_alignParentStart="true">
    <Button
        android:onClick="Fangda"
        android:layout_weight="1"
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="放大"
        android:layout_alignParentBottom="true"
        android:layout_alignParentStart="true" />

    <Button
        android:onClick="Suoxiao"
        android:layout_weight="1"
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="缩小"
        />

    <Button
        android:onClick="Xuanzhuan"
        android:layout_weight="1"
        android:id="@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="旋转" />
    <Button
    android:onClick="Yidong"
    android:layout_weight="1"
    android:id="@+id/button5"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="移动" />
    <Button
        android:onClick="Fuyang"
        android:layout_weight="1"
        android:id="@+id/button6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="俯仰" />
    <Button
        android:layout_weight="1"
        android:id="@+id/dinwei"
        android:onClick="dinwei"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="定位"
        />
</LinearLayout>
布局很简单,基本都是按钮;

下面是代码:

首先App初始化:

public class MyAPP extends Application {
    @Override
    public void onCreate() {
        //注册一个key验证是否正确的广播所者,我们在开发APP时,经常有一些验证,比如网络等,具体流程如下
        //创建一个BroadcastReceiver的内部类,
        BroadcastReceiver receiver = new BroadcastReceiver() {
            //复写其必须有的方法onReceive,第一个参数上下文,第二个参数是传过来的intent.
            public void onReceive(Context context, Intent intent) {
                //参数intent.getAction得到发送过来的Intent里的action动作
                String action = intent.getAction();
                //创建一个null的字符串.
                String msg = "";
                //进行检查,if判断字符串是否相同,action.equals(),直接用SDKInitializer.SDK_BROADTCAST_ACTION_ST...就可以了
                if (action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_OK)) {
                    msg = "Key验证成功!";
                }
                //判断SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR :验证失败
                else if (action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {
                    msg = "Key验证失败!";
                }
                //判断SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR :网络错误
                else if (action.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {
                    msg = "网络错误";
                }
                //弹吐司,内容就是字符串.
                Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
            }
        };
        //代码进行广播的注册配置,也可以在清单配置文件里进行配置
        IntentFilter filter = new IntentFilter();
        //添加过滤条件,IntentFilter对象.addAction();内容就是SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_....
        filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_OK);
        filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);
        filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
        //进行广播注册,1.要注册广播类对象 2配置文件IntentFilter对象.
        registerReceiver(receiver, filter);
        //初始化百度地图SDK
        SDKInitializer.initialize(getApplicationContext());
    }
}
MainActivity:

public class MainActivity extends AppCompatActivity {
    private MapView mMapView;
    /**
     * 清华大学
     */
    protected LatLng qhPos = new LatLng(40.009424, 116.332556);
    /**
     * 北京坐标
     */
    protected LatLng bjPos = new LatLng(39.997743, 116.316176);
    /**
     * 天安门坐标
     */
    protected LatLng tamPos = new LatLng(39.915112, 116.403963);
    private BaiduMap baiduMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //这里我没有调用SDKInitializer.initialize(getApplicationContext());因为在自定义的application的oncreate里已经定义了.
        setContentView(R.layout.activity_main);
        //控件初始化
        initView();
        //获取对MapVIew的控制类BaiduMap
        baiduMap = mMapView.getMap();
        //1.0,使用MapVIew对象,控制是否显示MapVIew上面的按钮
        //设置不显示比例尺控件    该方法的参数是boolen,false是不显示缩放控件
        mMapView.showScaleControl(false);
        // 设置不显示缩放控件    该方法的参数是boolen,false是不显示比例尺控件
        mMapView.showZoomControls(false);
        // 2.  获取获取最小(3)、最大缩放级别(20)
        float minZoomLevel = baiduMap.getMinZoomLevel();
        float maxZoomLevel = baiduMap.getMaxZoomLevel();
        System.out.println("minZoomLevel = " + minZoomLevel + ", maxZoomLevel = " + maxZoomLevel);
        // 3.  设置地图中心点为清华大学
        MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLng(qhPos);
        baiduMap.setMapStatus(mapStatusUpdate);
        // 4.  设置地图缩放为15
        mapStatusUpdate = MapStatusUpdateFactory.zoomTo(15);
        baiduMap.setMapStatus(mapStatusUpdate);
    }


    private void initView() {
        mMapView = (MapView) findViewById(R.id.bmapView);
    }

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

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

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

    public void dinwei(View view) {
        startActivity(new Intent(MainActivity.this, LocationActivity.class));
    }

    public void Fangda(View view) {
        //放大,使用MapStatusUpdateFactory工厂调用zoomIn,得到MapStatusUpdate
        MapStatusUpdate zoomIn = MapStatusUpdateFactory.zoomIn();
        //在用map对象.setMapStatus,把MapStatusUpdate对象传入.
        baiduMap.setMapStatus(zoomIn);
    }

    public void Suoxiao(View view) {
        //缩小,使用MapStatusUpdateFactory工厂调用zoomOut方法,得到MapStatusUpdate
        MapStatusUpdate zoomOut = MapStatusUpdateFactory.zoomOut();
        //在用map对象.setMapStatus,把MapStatusUpdate对象传入.
        baiduMap.setMapStatus(zoomOut);
    }

    public void Xuanzhuan(View view) {
//旋转(0 ~ 360),每次在原来的基础上再旋转30度
// 获取当前地图的状态,map对象.getMapStatus,直接获取到MapStatus
        MapStatus mapStatus = baiduMap.getMapStatus();
//然后MapStatus.rotate就可以拿到原来的旋转度数.
        float rotate = mapStatus.rotate;
//通过new MapStatus.Builder得到MapStatus.Builder对象
        MapStatus.Builder builder = new MapStatus.Builder();
//用MapStatus.Builder对象.rotate(原来旋转的度数+30);
        builder.rotate(rotate + 30);
//用MapStatus.Builder对象.build,得到MapStatus对象
        MapStatus build = builder.build();
//用使用MapStatusUpdateFactory工厂调用newMapStatus,把MapStatus对象传入.得到MapStatusUpdate
        MapStatusUpdate newMapStatus = MapStatusUpdateFactory.newMapStatus(build);
//map对象.setMapStatus,传入MapStatusUpdate对象
        baiduMap.setMapStatus(newMapStatus);
    }

    public void Fuyang(View view) {
//俯仰(0 ~ -45),每次在原来的基础上再俯仰-5度
//获取当前地图的状态,map对象.getMapStatus,直接获取到MapStatus
        MapStatus mapStatus1 = baiduMap.getMapStatus();
//然后MapStatus.overlook就可以拿到原来的俯仰度数.
        float overlook = mapStatus1.overlook;
//通过new MapStatus.Builder得到MapStatus.Builder对象
        MapStatus.Builder builder1 = new MapStatus.Builder();
//用MapStatus.Builder对象.overlook(原来俯仰的度数-5);
        builder1.overlook(overlook - 5);
//用MapStatus.Builder对象.build,得到MapStatus对象
        MapStatus build1 = builder1.build();
//用使用MapStatusUpdateFactory工厂调用newMapStatus,把MapStatus对象传入.得到MapStatusUpdate
        MapStatusUpdate newMapStatusOverlook = MapStatusUpdateFactory.newMapStatus(build1);
map对象.setMapStatus,传入MapStatusUpdate对象
        baiduMap.setMapStatus(newMapStatusOverlook);
    }

    public void Yidong(View view) {
        LatLng ll=new LatLng(39.996942,116.203098);
        //移动,用使用MapStatusUpdateFactory工厂调用newLatLng(LatLng参数);
        MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLng(ll);
        //map对象.animateMapStatus,第一个参数是mapStatusUpdate对象,第二个参数是动画执行多少秒.
        baiduMap.animateMapStatus(mapStatusUpdate,20000);
    }
}


LocationActivity:

/**
 * 实现手机定位的三种方式:
 * 1.GPS定位
 * 2.WIFI定位
 * 3.基站定位
 * 注意:定位要在清单文件加上service服务
 */
public class LocationActivity extends AppCompatActivity implements CloudListener {

    private MapView mapView;
    private BaiduMap mbaiduMap;
    private boolean isFirstLoc = true;
    private LocationClient mLocClient;
    public MyLocationListenner myListener = new MyLocationListenner();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_location);
        initBaiduMap();
        CloudManager.getInstance().init(this);
    }

    private void initBaiduMap() {
        //创建对象
        mapView = (MapView) findViewById(R.id.bmapView);
        mbaiduMap = mapView.getMap();
        //开启定位图层
        mbaiduMap.setMyLocationEnabled(true);
        // 创建定位所用到的类
        mLocClient = new LocationClient(this);
        //注册定位的监听器
        mLocClient.registerLocationListener(myListener);
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true); // 打开gps
        option.setCoorType("bd09ll"); // 设置坐标类型,使用的地图加密算法
        option.setScanSpan(1000);//可选设置定位间隔时间,注意间隔需要大于等于1000ms
        mLocClient.setLocOption(option);//地图界面显示到定位位置
        mLocClient.start();//开启定位
    }

    /**
     * 点击进行步行导航
     * @param v
     */
    public void dao(View v){
        LatLng pt1 = new LatLng(40.009424, 116.332556);
        LatLng pt2 = new LatLng(39.915112, 116.403963);

        // 构建 导航参数
        NaviParaOption para = new NaviParaOption()
                .startPoint(pt1).endPoint(pt2)
                .startName("天安门").endName("百度大厦");

        try {
            BaiduMapNavigation.openBaiduMapWalkNavi(para, this);
        } catch (BaiduMapAppNotSupportNaviException e) {
            e.printStackTrace();

        }

    }



    @Override
    public void onGetSearchResult(CloudSearchResult result, int i) {

        //处理从服务器得到的结果前,先判断结果对象是否存在,结果里面的表对象是否存在,结果里面的表是否有内容
        if (result != null && result.poiList != null && result.poiList.size() > 0) {
            //画画前,先把黑板擦干净,所以在地图上面定位表示前,先把地图清空
            mbaiduMap.clear();
            //创建定位标识的图片对象,使用Bitmap工厂从资料里面获取图片资源,建立对象.
            BitmapDescriptor bd = BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding);
            //建立定位点对象
            LatLngBounds.Builder builder = new LatLngBounds.Builder();
            //建立点对象
            LatLng ll;
            //使用高级for循环,把从服务器得到的json结果位置拿出来,在添加图片,成为标识显示在地图上
            for (CloudPoiInfo info : result.poiList) {
                //从表中拿出维度和经度,设置给点对象
                ll = new LatLng(info.latitude, info.longitude);
                //添加坐标图片的对象给MarkerOptions,传图片BitmapDescriptor参数,和点LatLng参数
                OverlayOptions oo = new MarkerOptions().icon(bd).position(ll);
                mbaiduMap.addOverlay(oo);
                builder.include(ll);
            }
        }
    }

    /**
     * 点击美食,执行云检索功能
     * 实际:拼接字符串,发送get请求,只不过百度地图封装了逻辑
     *
     * @param v
     */
    public void CheckLBS(View v) {
        //创建百度地图特有的容器NearbySearchInfo,用来放请求我们虎鲸平台的数据
        NearbySearchInfo info = new NearbySearchInfo();
        //服务器的AK值,注意必须是字符串
        info.ak = "wFmyh5Uggy6LR7RcW6MyhzvQeKaj5iBT";
        //百度地图自定义数据库的KEY值,int型
        info.geoTableId = 160758;
        //设置搜索的最大半径,int型
        info.radius = 30000;
        //确定搜索中心的坐标,字符串,注意这里就是经度在前,维度在后
        info.location = "116.403152,39.925932";
        //把设置好的数据装入容器中
        CloudManager.getInstance().nearbySearch(info);
    }

    @Override
    public void onGetDetailSearchResult(DetailSearchResult detailSearchResult, int i) {

    }

    @Override
    public void onGetCloudRgcResult(CloudRgcResult cloudRgcResult, int i) {

    }

    public class MyLocationListenner implements BDLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {
            // map view 销毁后不在处理新接收的位置
            if (location == null || mapView == null) {
                return;
            }
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                    // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(100).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            mbaiduMap.setMyLocationData(locData);

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

    @Override
    protected void onDestroy() {
        // 退出时销毁定位
        mLocClient.stop();
        // 关闭定位图层
        mbaiduMap.setMyLocationEnabled(false);
        mapView.onDestroy();
        mapView = null;
        super.onDestroy();
    }

}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值