【创新项目实训】Android移动开发教学app案例之校园地图

一、项目介绍

基于展示用户位置这一Android特性设计的入门教学案例

项目结构如图所示
在这里插入图片描述
mipmap中的图片资源如下(注意名称不能出现中文、大写字母)
在这里插入图片描述

二、开发环境

软件环境: Android Studio 4.1.3 + JDK1.8
API版本:API 16
操作系统:Windows 10

三、功能设计

  1. 显示地图
  2. 在地图上显示当前手机定位
  3. 能够显示校园内标志建筑物的介绍
  4. 在地图上用符号标记出标志建筑物所在点

四、获取百度地图 API Key

基于位置的服务简称LBS,主要的工作原理是利用无线电通讯网络或 GPS 等定位方式来确定出移动设备所在的位置。
本次项目使用的是百度地图在 LBS 方面提供的一些功能。

打开百度地图开放平台 http://lbsyun.baidu.com/ ,选择开发文档 - Android 地图SDK

百度地图 Android SDK是一套基于Android 4.0及以上版本设备的应用程序接口。 您可以使用该套 SDK开发适用于Android系统移动设备的地图应用,通过调用地图SDK接口,您可以轻松访问百度地图服务和数据,构建功能丰富、交互性强的地图类应用程序。

点击获取密钥,需要登录百度账号
进入后需要验证个人信息
在这里插入图片描述

然后到控制台看板 - 应用管理 - 我的应用 - 创建应用
在这里插入图片描述
填写一个应用名称,应用类型选择 Android SDK
发布版SHA1 为发布签名版正式apk时,签名文件中的SHA1
PackageName为你的Project中的包名,此处我的为com.example.mymap
在这里插入图片描述
开发版SHA1:可以从界面右端 gradle - app - Tasks - android - 双击signingReport
可以在控制台得到gradle自动生成的用于debug的SHA1

在这里插入图片描述

然后就能在我的应用中获得API Key
在这里插入图片描述
下面下载百度地图的Android SDK
找到产品下载
在这里插入图片描述
点击自定义下载
在这里插入图片描述
根据需要选择功能,如果后续需要编写更丰富的功能可以选择包含较多服务的SDK
在这里插入图片描述
配置 选择AAR包、标准开发包
在这里插入图片描述
关于AAR文件和JAR文件的区别

jar文件:
只包含class文件和清单文件,不包含资源文件,比如图片等所有的 res下的资源文件
aar文件:
class以及res下的所有的资源文件全部包含

五、Android Studio工程配置百度地图

创建一个新的Project,命名为MyMap
默认选择创建一个Empty Activity
将下载的BaiduLBS_AndroidSDK_Lib.aar,拷贝到MyMap - app - libs 目录下
然后打开Gradle Scriptus - build.gradle配置文件,在android{}中增加

repositories {
        flatDir {
            dirs 'libs'
        }
    }

在dependencies{}中增加

implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation(name: 'BaiduLBS_AndroidSDK_Lib', ext: 'aar')

配置完成后点击Build - Rebuild Project重新编译一次项目

六、显示地图

首先配置AndroidManifest.xml文件
打开manifests - AndroidManifest.xml
在application中配置开发密钥(AK)

<application>  
    <meta-data  
        android:name="com.baidu.lbsapi.API_KEY"  
        android:value="开发者 key" />  
</application>

在application的外部添加权限声明
Android 6.0后还需要在java代码中动态声明

<!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,POI检索等 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 获取网络状态,根据网络状态切换进行数据请求网络转换 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
<!-- 读取外置存储。如果开发者使用了so动态加载功能并且把so文件放在了外置存储区域,则需要申请该权限,否则不需要 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 写外置存储。如果开发者使用了离线地图,并且数据写在外置存储区域,则需要申请该权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

编写布局文件 activity_main.xml
切换至 Code工具,添加百度地图容器,设置id为themapView,按照默认的设置占满屏幕,点击Infer Constraints快速创建约束

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

然后是MainActivity的编写
先实现显示地图,只需要以下代码

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
   
    private MapView mMapView = null;
 
    //消息传递
    private Intent mIntent = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        //初始化地图必须放在布局初始化之前
        //地图初始化方法中任选一种
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
         //获取地图控件
        mMapView = findViewById(R.id.themapView);
    }

    //实现地图生命周期管理
    @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();
    }

}

七、显示定位

在显示地图的基础上,展示用户当前所在位置的定位点
配置AndroidManifest.xml

<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

在Application标签中声明定位的service组件

<service android:name="com.baidu.location.f"
    android:enabled="true"
    android:process=":remote"/>

构造地图数据

//重写onReceieveLocation方法获取定位数据,并传给mapview
    public class MyLocationListener extends BDAbstractLocationListener {
   
        @Override
        public void onReceiveLocation(BDLocation location) {
   
            //mapView 销毁后不在处理新接收的位置
            if (location == null || mMapView == null){
   
                return;
            }

            // 如果是第一次定位
            LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
            if (isFirstLocate) {
   
                isFirstLocate = false;
                //给地图设置状态
                MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
                mBaiduMap.animateMapStatus(update);
                update = MapStatusUpdateFactory.zoomTo(18f);//层级选择
                mBaiduMap.animateMapStatus(update);
            }

            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                    // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(location.getDirection()).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            mBaiduMap.setMyLocationData(locData);
        }
    }

动态申请定位所需权限的函数如下

 //申请权限
    public void showContacts(){
   
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
                != PackageManager.PERMISSION_GRANTED
                || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED
                || ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
                != PackageManager.PERMISSION_GRANTED) {
   
            //Toast.makeText(getApplicationContext(),"没有权限,请手动开启定位权限",Toast.LENGTH_SHORT).show();
            // 申请一个(或多个)权限,并提供用于回调返回的获取码(用户定义)
            ActivityCompat.requestPermissions(MainActivity.this,new String[]{
   Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_STATE}, BAIDU_READ_PHONE_STATE);
        }else{
   
            init();
        }
    }

    //Android6.0申请权限的回调方法
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
   
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
   
            // requestCode即所声明的权限获取码,在checkSelfPermission时传入
            case BAIDU_READ_PHONE_STATE:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
   
                    // 获取到权限,作相应处理(调用定位SDK应当确保相关权限均被授权,否则可能引起定位失败)
                    init();
                } else {
   
                    // 没有获取到权限,做特殊处理
                    Toast.makeText(getApplicationContext(), "获取位置权限失败,请手动开启", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                break;
        }
    }

之后在原先的获取地图之后,加上开启定位图层的代码,以及对定位图层的设置

//获取地图控件
 mMapView = findViewById(R.id.themapView);
//得到地图
 mBaiduMap = mMapView.getMap();
//开启定位图层
 mBaiduMap.setMyLocationEnabled(true);

 //定位初始化
mLocationClient = new LocationClient(this);

 //通过LocationClientOption设置LocationClient相关参数
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(5000);//五秒返回一次位置
// 可选,设置地址信息
option.setIsNeedAddress(true);
//可选,设置是否需要地址描述
option.setIsNeedLocationDescribe(true);

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

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

如果要更改为跟随FOLLOWING模式,在后面添加以下代码

locationMode = MyLocationConfiguration.LocationMode.FOLLOWING;
 // 定位模式、是否开启方向、设置自定义定位图标、精度圈填充颜色以及精度圈边框颜色5个属性(此处只设置了前三个)。
MyLocationConfiguration mLocationConfiguration = new MyLocationConfiguration(locationMode,true,null);
// 使自定义的配置生效
mBaiduMap.setMyLocationConfiguration(mLocationConfiguration);

显示定位的MainActivity.java 完整代码如下

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
   
    private MapView mMapView = null;
    private BaiduMap mBaiduMap = null;//定位图层
    private LocationClient mLocationClient = null;
    // 当前定位模式
    private MyLocationConfiguration.LocationMode locationMode;
    //是否是第一次定位
    private boolean isFirstLocate = true;
    //当前定位模式
    private MyLocationConfiguration.LocationMode mLocationMode;
    private static final int BAIDU_READ_PHONE_STATE =100;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        //初始化地图必须放在布局初始化之前
        //地图初始化方法中任选一种
        SDKInitializer.initialize(getApplicationContext());

        setContentView(R.layout.activity_main);

        //获取定位权限后初始化
        
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值