优定义网

Android简单实现百度地图显示及定位

蔡一妍 发表于 2018-6-11 22:02:28 | 显示全部楼层 |阅读模式

1、下载百度地图的SDK

下载地址:http://lbsyun.baidu.com/index.ph ... dk-android-download

2、申请key值

注册百度账号——>登录百度地图官网——>控制台—–>创建应用

获取key(也就是AK)的具体方法的官网地址 :http://lbsyun.baidu.com/apiconsole/key

3、通过解压得到.jar文件并放到libs文件中,手动添加到依赖库中(右键Add—-)

4、在src/main下建立一个叫做jniLibs的文件夹,并把解压后内的文件夹靠进去,如下图:

1.png

代码实现

在工程的“ AndroidManifest.xml ”文件添加key和Service

  1. //配置应用的AppKey,唯一的,需申请
  2.         <meta-data
  3.             android:name="com.baidu.lbsapi.API_KEY"
  4.             android:value="你的 key" />
  5.         //service组件,固定配置
  6.         <service
  7.             android:name="com.baidu.location.f"
  8.             android:enabled="true"
  9.             android:process=":remote"></service>
复制代码

添加权限(6.0权限另说)

  1. //获取设备网络状态,禁用后无法获取网络状态
  2.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  3.     //网络权限,当禁用后,无法进行检索等相关业务
  4.     <uses-permission android:name="android.permission.INTERNET" />
  5.     //读取设备硬件信息,统计数据
  6.     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  7.     //读取系统信息,包含系统版本等信息,用作统计
  8.     <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
  9.     //获取设备的网络状态,鉴权所需网络代理
  10.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  11.     //允许sd卡写权限,需写入地图数据,禁用后无法显示地图
  12.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  13.     //允许sd卡读权限,需读取地图数据,禁用后无法显示地图
  14.     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  15.     //获取统计数据
  16.     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
  17.     //鉴权所需该权限获取进程列表
  18.     <uses-permission android:name="android.permission.GET_TASKS" />
  19.     //使用步行AR导航,配置Camera权限
  20.     <uses-permission android:name="android.permission.CAMERA" />
  21.     //网络定位
  22.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  23.     //GPS定位
  24.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  25.     <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
  26.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
复制代码

activity.xml布局文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:tools="http://schemas.android.com/tools"
  4.     android:layout_width="match_parent"
  5.     android:layout_height="match_parent"
  6.     tools:context="com.example.baidu_demo1.MainActivity">
  7.     <com.baidu.mapapi.map.MapView
  8.         android:id="@+id/bmapView"
  9.         android:layout_width="match_parent"
  10.         android:layout_height="match_parent"
  11.         android:layout_above="@+id/ll"
  12.         android:clickable="true"></com.baidu.mapapi.map.MapView>
  13.     <LinearLayout
  14.         android:id="@+id/ll"
  15.         android:layout_width="match_parent"
  16.         android:layout_height="wrap_content"
  17.         android:layout_alignParentBottom="true"
  18.         android:orientation="horizontal">
  19.         <Button
  20.             android:id="@+id/bt"
  21.             android:layout_width="0dp"
  22.             android:layout_height="wrap_content"
  23.             android:layout_weight="1"
  24.             android:text="复位" />
  25.         <Button
  26.             android:id="@+id/button"
  27.             android:layout_width="0dp"
  28.             android:layout_height="wrap_content"
  29.             android:layout_weight="1"
  30.             android:text="卫星" />
  31.         <Button
  32.             android:id="@+id/buttons"
  33.             android:layout_width="0dp"
  34.             android:layout_height="wrap_content"
  35.             android:layout_weight="1"
  36.             android:text="普通" />
  37.     </LinearLayout>
  38. </RelativeLayout>
复制代码

Mainactivity.java代码实现

  1. import android.os.Bundle;
  2. import android.support.v7.app.AppCompatActivity;
  3. import android.view.View;
  4. import android.widget.Button;
  5. import android.widget.Toast;
  6. import com.baidu.location.BDLocation;
  7. import com.baidu.location.BDLocationListener;
  8. import com.baidu.location.LocationClient;
  9. import com.baidu.location.LocationClientOption;
  10. import com.baidu.mapapi.SDKInitializer;
  11. import com.baidu.mapapi.map.BaiduMap;
  12. import com.baidu.mapapi.map.MapStatus;
  13. import com.baidu.mapapi.map.MapStatusUpdate;
  14. import com.baidu.mapapi.map.MapStatusUpdateFactory;
  15. import com.baidu.mapapi.map.MapView;
  16. import com.baidu.mapapi.map.MyLocationData;
  17. import com.baidu.mapapi.model.LatLng;
  18. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  19.     private MapView mMapView;
  20.     private BaiduMap mBaiduMap;
  21.     public LocationClient mLocationClient;
  22.     public BDLocationListener myListener = new MyLocationListener();
  23.     private Button bt;
  24.     private Button button;
  25.     private Button buttons;
  26.     private LatLng latLng;
  27.     private boolean isFirstLoc = true; // 是否首次定位
  28.     @Override
  29.     protected void onCreate(Bundle savedInstanceState) {
  30.         super.onCreate(savedInstanceState);
  31.         //在使用SDK各组件之前初始化context信息,传入ApplicationContext
  32.         //注意该方法要再setContentView方法之前实现
  33.         SDKInitializer.initialize(getApplicationContext());
  34.         setContentView(R.layout.activity_main);
  35.         initView();
  36.         initMap();
  37.     }
  38.     private void initMap() {
  39.         //获取地图控件引用
  40.         mBaiduMap = mMapView.getMap();
  41.         //普通地图
  42.         mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
  43.         mBaiduMap.setMyLocationEnabled(true);
  44.         //默认显示普通地图
  45.         mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
  46.         //开启交通图
  47.         //mBaiduMap.setTrafficEnabled(true);
  48.         //开启热力图
  49.         //mBaiduMap.setBaiduHeatMapEnabled(true);
  50.         // 开启定位图层
  51.         mBaiduMap.setMyLocationEnabled(true);
  52.         mLocationClient = new LocationClient(getApplicationContext());     //声明LocationClient类
  53.         //配置定位SDK参数
  54.         initLocation();
  55.         mLocationClient.registerLocationListener(myListener);    //注册监听函数
  56.         //开启定位
  57.         mLocationClient.start();
  58.         //图片点击事件,回到定位点
  59.         mLocationClient.requestLocation();
  60.     }
  61.     //配置定位SDK参数
  62.     private void initLocation() {
  63.         LocationClientOption option = new LocationClientOption();
  64.         option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy
  65.         );//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
  66.         option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系
  67.         int span = 1000;
  68.         option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
  69.         option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
  70.         option.setOpenGps(true);//可选,默认false,设置是否使用gps
  71.         option.setLocationNotify(true);//可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
  72.         option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation
  73.         // .getLocationDescribe里得到,结果类似于“在北京天安门附近”
  74.         option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
  75.         option.setIgnoreKillProcess(false);
  76.         option.setOpenGps(true); // 打开gps
  77.         //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
  78.         option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
  79.         option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
  80.         mLocationClient.setLocOption(option);
  81.     }
  82.     //实现BDLocationListener接口,BDLocationListener为结果监听接口,异步获取定位结果
  83.     public class MyLocationListener implements BDLocationListener {
  84.         @Override
  85.         public void onReceiveLocation(BDLocation location) {
  86.             latLng = new LatLng(location.getLatitude(), location.getLongitude());
  87.             // 构造定位数据
  88.             MyLocationData locData = new MyLocationData.Builder()
  89.                     .accuracy(location.getRadius())
  90.                     // 此处设置开发者获取到的方向信息,顺时针0-360
  91.                     .direction(100).latitude(location.getLatitude())
  92.                     .longitude(location.getLongitude()).build();
  93.             // 设置定位数据
  94.             mBaiduMap.setMyLocationData(locData);
  95.             // 当不需要定位图层时关闭定位图层
  96.             //mBaiduMap.setMyLocationEnabled(false);
  97.             if (isFirstLoc) {
  98.                 isFirstLoc = false;
  99.                 LatLng ll = new LatLng(location.getLatitude(),
  100.                         location.getLongitude());
  101.                 MapStatus.Builder builder = new MapStatus.Builder();
  102.                 builder.target(ll).zoom(18.0f);
  103.                 mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
  104.                 if (location.getLocType() == BDLocation.TypeGpsLocation) {
  105.                     // GPS定位结果
  106.                     Toast.makeText(MainActivity.this, location.getAddrStr(), Toast.LENGTH_SHORT).show();
  107.                 } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
  108.                     // 网络定位结果
  109.                     Toast.makeText(MainActivity.this, location.getAddrStr(), Toast.LENGTH_SHORT).show();
  110.                 } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {
  111.                     // 离线定位结果
  112.                     Toast.makeText(MainActivity.this, location.getAddrStr(), Toast.LENGTH_SHORT).show();
  113.                 } else if (location.getLocType() == BDLocation.TypeServerError) {
  114.                     Toast.makeText(MainActivity.this, "服务器错误,请检查", Toast.LENGTH_SHORT).show();
  115.                 } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
  116.                     Toast.makeText(MainActivity.this, "网络错误,请检查", Toast.LENGTH_SHORT).show();
  117.                 } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
  118.                     Toast.makeText(MainActivity.this, "手机模式错误,请检查是否飞行", Toast.LENGTH_SHORT).show();
  119.                 }
  120.             }
  121.         }
  122.     }
  123.     private void initView() {
  124.         mMapView = (MapView) findViewById(R.id.bmapView);
  125.         bt = (Button) findViewById(R.id.bt);
  126.         bt.setOnClickListener(this);
  127.         button = (Button) findViewById(R.id.button);
  128.         button.setOnClickListener(this);
  129.         buttons = (Button) findViewById(R.id.buttons);
  130.         buttons.setOnClickListener(this);
  131.     }
  132.     @Override
  133.     protected void onDestroy() {
  134.         super.onDestroy();
  135.         //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
  136.         mMapView.onDestroy();
  137.     }
  138.     @Override
  139.     protected void onResume() {
  140.         super.onResume();
  141.         //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
  142.         mMapView.onResume();
  143.     }
  144.     @Override
  145.     protected void onPause() {
  146.         super.onPause();
  147.         //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
  148.         mMapView.onPause();
  149.     }
  150.     @Override
  151.     public void onClick(View v) {
  152.         switch (v.getId()) {
  153.             case R.id.bt:
  154.                 //把定位点再次显现出来
  155.                 MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLng(latLng);
  156.                 mBaiduMap.animateMapStatus(mapStatusUpdate);
  157.                 break;
  158.             case R.id.button:
  159.                 //卫星地图
  160.                 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
  161.                 break;
  162.             case R.id.buttons:
  163.                 //普通地图
  164.                 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
  165.                 break;
  166.         }
  167.     }
  168. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精华推荐
  • 一个人开始废掉的3种迹象

    一个人开始废掉的3种迹象

  • 从零到60秒的惬意冰镇啤酒

    从零到60秒的惬意冰镇啤酒

  • 马云、马化腾、王石都弃之不用的人,有一个共同点

    马云、马化腾、王石都弃之不用的人,有一个

  • 哥特式高迪凳子

    哥特式高迪凳子

  • 千亿小米,雷军逆袭

    千亿小米,雷军逆袭

  • 她一战赚了几十亿,她说:世界上最好的生意有三种

    她一战赚了几十亿,她说:世界上最好的生意有

  • 雷军:合伙人比制度更重要!

    雷军:合伙人比制度更重要!

  • 一个美美的令人喜欢的自行车铃

    一个美美的令人喜欢的自行车铃

QQ客服热线
QQ:1090281100 周一至周日:09:00 - 21:00
WeChat:dianlingkeji
Email:kaixin1069@vip.qq.com

优定义logo

勿要吝啬你无形资产,请为创新续源,知识、点子、灵感、经验、需求等均是创新源泉,你不经意的一句话将是另一个人的灵感。明天的明天,还有明天,我们应该把握今天,每一个今天,都有一个新的事物在出现,今天的漠视明天的落后,不浪费每一个学习的时刻,学习助力非凡。

技术支持 Discuz! X3.4 - 3.5 beta © 2001-2018 Comsenz Inc.

小黑屋|手机版|优定义 ( 粤ICP备16085288号-2 )|申请友链|网站地图

粤公网安备 44011102001144 号 GMT+8, 2018-11-16 22:37 , Processed in 0.095976 second(s), 29 queries .

快速回复 返回顶部 返回列表