20212411 2023-2024-2 《移动平台开发与实践》第5次作业

1.实验内容

设计并开发一个地图应用系统。
该实验需提前申请百度API Key,调用接口实现百度地图的定位功能、地图添加覆盖物和显示文本信息。

2.实验过程

实验的详细过程参照百度文档
2.1 在控制台创建应用申请百度API Key
在这里插入图片描述

2.2 将开发包导入到项目中
在这里插入图片描述在这里插入图片描述
2.3 将获取的密钥加入清单文件中
在这里插入图片描述
2.4 在清单文件中申请相应的权限
在这里插入图片描述
2.5 清单文件中注册Activity在这里插入图片描述
2.6 MainActivity

package com.example.baidumaplocation;

// ... 省略其他导入 ...

public class MainActivity extends AppCompatActivity {
    // 定义MapView、LocationClient等成员变量
    private MapView mapView;
    private LocationClient locationClient;
    private BaiduMap baiduMap;
    // ... 省略其他成员变量 ...

    // 定义权限数组
    private final String[] requiredPermissions = {
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.READ_PHONE_STATE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };

    // ActivityResultLauncher用于处理权限请求结果
    private ActivityResultLauncher<String[]> permissionsLauncher;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // 初始化权限请求
        permissionsLauncher = registerForActivityResult(
                new ActivityResultContracts.RequestMultiplePermissions(),
                this::handlePermissionsResult
        );

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化视图
        initViews();

        // 检查Android版本并请求权限
        checkAndroidVersionAndRequestPermissions();

        // 初始化地图点击事件
        initMapClickListener();

        // 初始化地理编码器
        initGeoCoder();
    }

    private void initViews() {
        // 初始化MapView、LocationClient等
        mapView = findViewById(R.id.bmapView);
        // ... 省略其他初始化代码 ...
    }

    private void checkAndroidVersionAndRequestPermissions() {
        // 检查Android版本并根据需要请求权限
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissionsIfNecessary();
        } else {
            initLocationClient();
        }
    }

    private void requestPermissionsIfNecessary() {
        // 检查权限状态并请求所需权限
        boolean allPermissionsGranted = true;
        for (String permission : requiredPermissions) {
            if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
                allPermissionsGranted = false;
                break;
            }
        }
        if (allPermissionsGranted) {
            initLocationClient();
        } else {
            permissionsLauncher.launch(requiredPermissions);
        }
    }

    private void handlePermissionsResult(Map<String, Boolean> permissions) {
        // 处理权限请求结果
        boolean allPermissionsGranted = true;
        for (Boolean granted : permissions.values()) {
            allPermissionsGranted &= granted;
        }
        if (allPermissionsGranted) {
            initLocationClient();
        } else {
            showToast("有权限未通过");
        }
    }

    // ... 省略其他方法 ...

    private void initLocationClient() {
        // 初始化LocationClient
        LocationClient.setAgreePrivacy(true);
        baiduMap.setMyLocationEnabled(true);
        // ... 省略其他初始化代码 ...
    }

    // ... 省略其他方法 ...

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (locationClient != null) {
            locationClient.stop();
        }
        baiduMap.setMyLocationEnabled(false);
        mapView.onDestroy();
    }
}

2.7 初始化类

package com.gong20212411.baidumap

import android.app.Application
import com.baidu.mapapi.CoordType
import com.baidu.mapapi.SDKInitializer

class DemoApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        SDKInitializer.setAgreePrivacy(this, true)
        //在使用SDK各组件之前初始化context信息,传入ApplicationContext
        SDKInitializer.initialize(this)
        //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
        //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
        SDKInitializer.setCoordType(CoordType.BD09LL)
    }
}

2.8 布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

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

    <ImageButton
        android:id="@+id/locationButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_margin="8dp"
        android:background="@drawable/icon_location"
        android:onClick="onResetLocationClick"
        tools:visibility="visible" />
</RelativeLayout>

3运行结果

4.学习中遇到的问题及解决

4.1 运行时出现下面错误:

java.lang.RuntimeException: Unable to create application com.gong20212411.baidumap.DemoApplication: com.baidu.mapapi.common.BaiduMapSDKException: not agree privacyMode, please invoke SDKInitializer.setAgreePrivacy(Context, boolean) function

解决方法:启动类中添加此行代码即可
在这里插入图片描述
4.2 使用keytools生成sha1时用户口令不知
解决方法:经过严密的分析,发现我压根没有注册过此账号,后得知用户的默认口令是android
4.3 项目运行时缺少依赖
解决方法:右键BaiduLBS_Android.jar选择AddAsLibrary后即可添加相应的依赖

5. 学习感悟

通过本次实验,我对地图应用的设计和实现有了更深刻的认识,也体会到了在开发过程中可能遇到的挑战和解决问题的满足感。

实验的第一步是申请百度API Key。这个步骤是整个项目的基础,因为没有API Key,我们无法调用百度地图的接口服务。申请过程让我认识到了API使用规范的重要性,也了解到了不同级别的API Key所对应的权限和服务范围。

接下来,我开始了调用接口实现百度地图定位功能的工作。定位功能的实现对于地图应用来说至关重要,它能够让使用者知道自己当前的位置,或者寻找到特定的地点。在实现过程中,我学习了如何使用百度地图SDK中的定位服务,如何处理定位权限的申请,以及如何优化定位的精度和响应速度。

在地图添加覆盖物的功能实现中,我进一步理解了地图应用的交互设计。覆盖物可以是图标、标记或者线条,它们为地图增添了更多的信息和趣味性。我尝试了多种类型的覆盖物,并学习了如何根据应用的需求定制覆盖物的样式和功能。这个过程中,我学会了如何使用百度地图API来动态添加和修改地图上的元素,也认识到了在设计中考虑美观与实用相结合的重要性。

显示文本信息的功能则让我深入理解了地图应用的信息展示方式。在地图上展示文本信息,可以是地点的名称、描述或者其他相关的数据。我学习了如何根据用户的操作来触发文本信息的显示,如何设计信息窗口的布局,以及如何优化信息的展示效果。这个功能的开发让我认识到了信息传递的清晰性和及时性对于提升用户体验的重要性。

在整个实验过程中,我遇到了不少挑战,比如API的调用限制、地图加载的性能问题、以及用户界面的友好性设计等。解决这些问题的过程锻炼了我的问题解决能力,也加深了我对地图应用开发的理解。每一次调试成功,每一个功能的实现,都给我带来了成就感。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值