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

20212309沈烨 2024-05-24 16:48:32

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

1.实验内容

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

2.实验过程

2.1 申请密钥

2.1.1 注册并登录百度账号,进行开发者认证

在这里只需要进行个人认证,这一项比较耗时,需要提前做

img

2.1.2 获取包名

在app目录下的build.gradle文件中找到applicationId,并确保其值与AndroidManifest.xml中定义的package相同。我的包名为"com.example.task5"

img

2.1.3 获取SHA1

进入C:\Users\Lenovo.android目录下,找到密钥文件debug.keystore

img

将其复制到jdk下的bin目录内(需要管理员权限),在该目录打开cmd,执行命令

keytool -list -v -keystore debug.keystore

输入密码(默认为android)即可得到SHA1

img

img

完成以上步骤后可以将复制到bin目录下的debug.keystore删除。

2.1.4 获取密钥

进入百度地图开放平台-控制台-应用管理-我的应用-创建应用

img

应用名称可以随便填,应用类型填Android SDK,发布版SHA1和开发板SHA1都填上面获得的SHA1,PackageName填上面获得的包名,点击提交即可获得密钥

img

img

2.2 配置开发环境

2.2.1 导入开发库

这里我直接复制的老师发布的样例项目的库文件。将jar文件复制到E:\AndroidStudioProjects\Task5\app\libs,在E:\AndroidStudioProjects\Task5\app\src\main目录下创建jniLibs目录,将包含so文件的几个文件夹复制到jniLibs下

img

2.2.2 配置相关代码

在build.gradle文件的dependencies下增加一行

implementation(files("libs\\BaiduLBS_Android.jar"))

img

2.3 编写代码

2.3.1 配置AndroidManifest.xml

在application内配置开发者密钥

        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="qk35W66tUiUV7LgLlrI07m002MCc07Eb"
            />

在application内添加service声明

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

在manifest内添加权限声明

    <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"/>
    <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <!-- 访问网络,网络定位需要上网-->
    <uses-permission android:name="android.permission.INTERNET"/>
    <!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,POI检索等 -->
    <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" />

img

2.3.2 编写MainActivity.java

package com.example.task5;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.model.LatLng;

public class MainActivity extends AppCompatActivity {

    private LocationClient mLocationClient;  //定位客户端
    private MapView mapView;  //Android Widget地图控件
    private BaiduMap baiduMap;
    private boolean isFirstLocate = true;

    private TextView tv_Lat;  //纬度
    private TextView tv_Lon;  //经度
    private TextView tv_Add;  //地址

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SDKInitializer.initialize(getApplicationContext());  // 初始化百度地图SDK
        setContentView(R.layout.activity_main);

        //如果没有定位权限,动态请求用户允许使用该权限
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
        } else {
            requestLocation();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 1) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                requestLocation();
            } else {
                Toast.makeText(this, "没有定位权限!", Toast.LENGTH_LONG).show();
                finish();
            }
        }
    }

    private void requestLocation() {
        initLocation();
        mLocationClient.start();
    }

    private void initLocation() {  //初始化
        mLocationClient = new LocationClient(getApplicationContext());
        mLocationClient.registerLocationListener(new MyLocationListener());

        mapView = findViewById(R.id.bmapView);
        baiduMap = mapView.getMap();
        tv_Lat = findViewById(R.id.tv_Lat);
        tv_Lon = findViewById(R.id.tv_Lon);
        tv_Add = findViewById(R.id.tv_Add);

        LocationClientOption option = new LocationClientOption();
        //设置扫描时间间隔
        option.setScanSpan(1000);
        //设置定位模式,三选一
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        //设置需要地址信息
        option.setIsNeedAddress(true);
        //保存定位参数
        option.setOpenGps(true);
        option.setCoorType("bd09ll");  // 设置坐标系,默认“gcj02”
        mLocationClient.setLocOption(option);
    }

    //内部类,百度位置监听器
    public class MyLocationListener extends BDAbstractLocationListener {
        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
            tv_Lat.setText(String.valueOf(bdLocation.getLatitude()));
            tv_Lon.setText(String.valueOf(bdLocation.getLongitude()));
            tv_Add.setText(bdLocation.getAddrStr());
            if (bdLocation.getLocType() == BDLocation.TypeGpsLocation || bdLocation.getLocType() == BDLocation.TypeNetWorkLocation) {
                navigateTo(bdLocation);
            }
        }
    }

    private void navigateTo(BDLocation bdLocation) {
        if (isFirstLocate) {
            LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
            MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
            baiduMap.animateMapStatus(update);
            isFirstLocate = false;
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        mapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mapView.onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mLocationClient.stop();
        mapView.onDestroy();
    }
}

2.3.3 编写activity_main.xml

(需要事先创建layout文件夹和activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">

    <!-- 百度地图控件 -->
    <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

    <!-- 位置文本布局 -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#e0000000"
        android:orientation="vertical"
        android:paddingStart="12dp"
        android:paddingTop="20dp"
        android:paddingBottom="10dp"
        app:layout_constraintTop_toTopOf="parent">

        <!-- 纬度 -->
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/latitude_label"
                android:textColor="#ffffff"
                android:textSize="15dp" />
            <TextView
                android:id="@+id/tv_Lat"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text=""
                android:textColor="#ffffff"
                android:textSize="15dp" />
        </LinearLayout>

        <!-- 经度 -->
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_marginTop="10dp">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/longitude_label"
                android:textColor="#ffffff"
                android:textSize="15dp" />
            <TextView
                android:id="@+id/tv_Lon"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text=""
                android:textColor="#ffffff"
                android:textSize="15dp" />
        </LinearLayout>

        <!-- 地址 -->
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="10dp">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/address_label"
                android:textColor="#ffffff"
                android:textSize="15dp" />
            <TextView
                android:id="@+id/tv_Add"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text=""
                android:textColor="#ffffff"
                android:textSize="15dp" />
        </LinearLayout>
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

2.3.4 编写strings.xml

<resources>
    <string name="app_name">Task5</string>
    <string name="latitude_label">纬度:</string>
    <string name="longitude_label">经度:</string>
    <string name="address_label">地址:</string>
</resources>

2.4 试运行

可以正确运行

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

  • 问题1:运行keytool -list -v -keystore debug.keystore后,报错‘keytool‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

img

  • 问题1解决方案:安装的jdk似乎并不完整,且系统环境变量没有配好。重装jdk后,直接在jdk文件夹内运行该代码即可。

  • 问题2:自己从百度下载开发库安装后,代码还是大范围报错

  • 问题2解决方案:直接使用老师发的样例项目内的开发库

4.学习感悟、思考等)

移动平台开发实践实验感想

通过这次移动平台开发实践实验,我对移动应用开发有了更深入的理解和实践经验。
在实验过程中,我学会了如何申请和使用百度API Key。通过调用百度地图的API,我能够实现定位功能、地图添加覆盖物和显示文本信息。这些功能的实现让我对地图服务有了更深的认识,也让我体会到了第三方服务在移动应用开发中的重要性。
这次实验是一个宝贵的实践机会,它不仅提升了我的技术水平,也让我对移动应用开发的全过程有了更加全面的认识。

参考资料

...全文
38 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

102

社区成员

发帖
与我相关
我的任务
社区描述
实验报告
android 高校
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧