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

news2024/9/27 7:18:35

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

1.实验内容

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

2.实验过程

2.1 获取SHA1

(1)打开控制台,输入cd .android
然后输入 keytool -list -v -keystore debug.keystore
显示keytool错误
在这里插入图片描述
(2)经过重新构建密钥库(具体内容在后续的问题分析中展示)
输入 keytool -list -v -keystore debug.keystore 获取SHA1
在这里插入图片描述

2.2 创建AK

(1)进入百度地图开发平台:百度地图开发平台,完成个人注册后(比学生认证快多了),进入控制台,点击左栏“应用管理”→“我的应用”,进行创建应用。
(2)选择Android SDK ,然后输入上文获取的SHA1,包名为com.example.baidu
在这里插入图片描述

2.3 下载并导入SDK

(1)首先下载SDK,下载jar包即可。下载链接
在这里插入图片描述
(2)将下载好的jar包等文件复制到Android项目中App目录下的libs文件夹,并右击jar包,点击“Add As Libraby”
在这里插入图片描述

(3)在src/main/目录下新建jniLibs目录,将so文件放入
(4)打开build.gradle.kts(:app)
在其中的android{}中添加如下代码:

 sourceSets {
        getByName("main") {
            jniLibs.srcDirs("libs")
        }

在这里插入图片描述

!!要打开红色方框的文件,而不是黄色方框的文件(虽然名字一样)
在这里插入图片描述

2.4配置相应文件

(1)打开AndroidManifest.xml,写入以下内容,其中的value值是获取的AK值
在这里插入图片描述

<service android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote"/>
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="hrhDXaLYldZCDGq9ezRPLArKiM9hN2mH"/>

在这里插入图片描述

(2)在AndroidManifest.xml中添加所需要的权限

<!--百度定位所需要权限,前面是LOCATE权限组的2个危险权限-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <!--百度定位所需要的普通权限-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <!--因为程序要与百度云服务交互-->
    <uses-permission android:name="android.permission.INTERNET"/>

在这里插入图片描述

2.5 实现地图定位的核心代码

(1)activity_main.xml:
在LinearLayout的框架下设置显示经纬度的按钮。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true" />
    <!--位置文本布局的背景色代码的前2位代码为透明度-->
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#e0000000"
        android:orientation="vertical" >
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="12dp"
            android:layout_marginTop="20dp"
            android:orientation="horizontal" >
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="纬度:"
                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:layout_marginLeft="12dp"
            android:layout_marginTop="10dp"
            android:orientation="horizontal" >
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="经度:"
                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:layout_marginBottom="10dp"
            android:layout_marginLeft="12dp"
            android:layout_marginTop="10dp"
            android:orientation="horizontal" >
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="地址:"
                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>
 
</FrameLayout>

(2)Mainactivity.kt:

package com.example.baidu
 
import android.Manifest
import android.app.Activity
import android.content.pm.PackageManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.CheckBox
import android.widget.RadioButton
import android.widget.RadioGroup
import android.widget.TextView
import android.widget.Toast
import androidx.core.app.ActivityCompat
import com.baidu.location.BDLocation
import com.baidu.location.BDLocationListener
import com.baidu.location.LocationClient
import com.baidu.location.LocationClientOption
import com.baidu.mapapi.CoordType
import com.baidu.mapapi.SDKInitializer
import com.baidu.mapapi.common.BaiduMapSDKException
import com.baidu.mapapi.map.BaiduMap
import com.baidu.mapapi.map.MapStatusUpdateFactory
import com.baidu.mapapi.map.MapView
import com.baidu.mapapi.model.LatLng
 
LocationClient mLocationClient;  //定位客户端
MapView mapView;  //Android Widget地图控件
BaiduMap baiduMap;
boolean isFirstLocate = true;
 
TextView tv_Lat;  //纬度
TextView tv_Lon;  //经度
TextView tv_Add;  //地址
 
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //如果没有定位权限,动态请求用户允许使用该权限
    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) {
    switch (requestCode) {
        case 1:
            if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "没有定位权限!", Toast.LENGTH_LONG).show();
                finish();
            } else {
                requestLocation();
            }
    }
}
private void requestLocation() {
    initLocation();
    mLocationClient.start();
}
private void initLocation() {  //初始化
    mLocationClient = new LocationClient(getApplicationContext());
    mLocationClient.registerLocationListener(new MyLocationListener());
    SDKInitializer.initialize(getApplicationContext());
    setContentView(R.layout.activity_main);
 
    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.setLocationMode(LocationClientOption.LocationMode.Battery_Saving);
    option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);*/
    //设置需要地址信息
    option.setIsNeedAddress(true);
    //保存定位参数
    mLocationClient.setLocOption(option);
}
//内部类,百度位置监听器
private class MyLocationListener  implements BDLocationListener {
    @Override
    public void onReceiveLocation(BDLocation bdLocation) {
        tv_Lat.setText(bdLocation.getLatitude()+"");
        tv_Lon.setText(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=(MapView)findViewById(R.id.bmapView);
    mapView.onResume();
}
@Override
protected void onDestroy() {
    super.onDestroy();
    mLocationClient.stop();
    mapView.onDestroy();
}

2.6 运行成果

我使用了真机,视频1为真机下载app

1


视频2为软件运行效果

2

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

  • 问题1:显示keytool错误,无法获取SHA1
  • 问题1解决方案:

①在终端工具输入或窗口运行窗口输入(窗口键+ R输入CMD):

 keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000

②填写注册信息,注意要求设置密码,密码请记录下来以便后续获取SHA1使用(注册内容可以随意填写)
③验证debug.keystore是否生成

keytool -list -v -keystore debug.keystore

④再次输入keytool -list -v -keystore debug.keystore即可

  • 问题2:在Mainactivity文件中,导入的baidu包报错
  • 问题2解决方案:要在在app文件夹下的build.gradle文件中添加代码后,上方会出现一个蓝条,选择Sync now。(选择另外一个的话就会报错)
    在这里插入图片描述
  • 问题3:打开应用后没有定位显示,只能显示一个地图
  • 问题3:解决方案:在AK申请的过程中,SHA1输入错误。

4.学习感悟、思考等)

本次实验过程并不难,主要就是获取自己主机的SHA1密钥然后在百度地图开放平台中申请AK,最后将jar包导入项目,最后根据老师给的代码进行实现地图定位。过程中遇到的困难几乎在csdn上都可以找得到。但是最后的运行闪退问题困扰我超级久,不知道是哪里出现了问题。无论怎么修改代码都会有问题。最后我根据同学的建议,将虚拟机修改成了真机,就发现不闪退了,这时候我又发现总是出现不了定位,只能打开地图。让我非常沮丧,经过重新的实验,最终我发现是我的SHA1密钥输入错误,导致最后的无法成功申请到百度地图的功能权限。真的是粗心浪费了我大量的时间与精力啊。

参考资料

  • Android Studio3.0对于百度地图SDK的开发(前置准备)
  • android中关于keytool 错误:java.lang.Exception:密钥库文件不存在: 解决步骤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1705648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python编程】给电脑安装最新的 Python3.12.3

笔者最近更换了新的Win11系统&#xff0c;安装最新的Python版本&#xff08;3.12.3&#xff09;尝尝鲜。据说这个版本存在一些漏洞&#xff0c;笔者将后续更新编程过程中的相关问题&#xff08;如果有&#xff09;。Python3.12.3的安装过程比较简单&#xff0c;在此进行说明。 …

mac下载安装好软件后提示已损坏

mac下载安装好软件后提示已损坏 解决方法&#xff1a; 首先确保系统安全设置已经改为任何来源。 打开任何来源后&#xff0c;到应用程序目录中尝试运行软件&#xff0c;如果仍提示损坏&#xff0c;请在应用图标上&#xff0c;鼠标右键&#xff0c;在弹出菜单中点打开。 如果…

【Pandas】深入解析`pd.read_pickle()`函数

【Pandas】深入解析pd.read_pickle()函数 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&…

WordPress子比主题美化-首页动态的图片展示

WordPress子比主题首页动态的图片展示 WordPress子比主题首页添加动态的图片展示&#xff0c;其他程序也可以用&#xff0c;复制代码到相应位置即可&#xff0c;也可作为指定分类&#xff0c;重点内容等&#xff0c;可以适合各个场景&#xff0c;需要的自取。 图片展示: 教程…

如何搭建个人观测云平台

如何搭建个人观测云平台 安装DataKit什么是DataKit&#xff1f; 仪表板指标管理监控 开通阿里云观测云服务后&#xff0c;在观测云平台页面进行下面的操作。 安装DataKit 什么是DataKit&#xff1f; DataKit 是观测云官方发布的数据采集应用&#xff0c;支持上百种数据的采集…

恢复视频3个攻略:从不同情况下的恢复方法到实践!

随着科技的进步&#xff0c;我们的生活被各种各样的数字内容所包围&#xff0c;其中&#xff0c;视频因其独特的记录性质&#xff0c;承载着许多重要的资料。但不管是自媒体人还是普通人日常生活随手一拍&#xff0c;都会遇到误删视频的情况。为了帮助您找回手机视频&#xff0…

数据挖掘与机器学习——分类算法

目录 机器学习算法最普通分类&#xff1a; 分类算法的定义&#xff1a; 分类算法的应用&#xff1a; 分类器实现分类&#xff1a; 分类器的构建标准&#xff1a; 概率模型&#xff1a; 贝叶斯公式&#xff1a; 朴素贝叶斯算法&#xff08;朴素贝叶斯分类器&#xff09;…

【吊打面试官系列】Java高并发篇 - Java 死锁以及如何避免?

大家好&#xff0c;我是锋哥。今天分享关于 【Java 死锁以及如何避免&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Java 死锁以及如何避免&#xff1f; Java 中的死锁是一种编程情况&#xff0c;其中两个或多个线程被永久阻塞&#xff0c;Java 死锁情况出现至…

正版软件 | Internet Download Manager 下载管理器

前言 IDM 是一个下载加速器&#xff0c;可将下载速度提高多达 8 倍&#xff0c;恢复、组织和安排下载。 30 天免费试用&#xff01;https://www.internetdownloadmanager.cc/ 新版本 Internet Download Manager v 6.40&#xff1a;添加了 Windows 11 兼容性。改进了媒体采集…

Stable Diffusion AI绘画:从提示词到模型出图的全景指南

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

微信公众号关注页获取方式

Demo Location 查找步骤 仔细看下链接验证&#xff0c;排查有特点的参数__biz 分析如何获取__biz 查看某个文章线下零食届「拼多多」席卷&#xff0c;「赵一鸣们」如何高效拓店&#xff1f;&#xff0c;查看源代码 ,查找关键词 替换链接并执行

30V MOS管 60VMOS管 100VMOS管 150VMOS管推荐

MOS管&#xff0c;即金属氧化物半导体场效应管&#xff0c;其工作原理是&#xff1a;在P型半导体与N型半导体之间形成PN结&#xff0c;当加在MOS管栅极上的电压改变时&#xff0c;PN结之间的沟道内载流子的数量会随之改变&#xff0c;沟道电阻也会发生改变&#xff0c;进而改变…

Linux如何设置共享文件夹

打开虚拟机->菜单->虚拟机设置->选项->共享文件夹->总是启用。点击添加按钮->弹出添加向导->点击浏览按钮&#xff0c;从windows中选择一个文件夹&#xff0c;确定即可。

pdf打开方式怎么设置默认?分享这几种设置方法

pdf打开方式怎么设置默认&#xff1f;你是否曾遇到过打开PDF文档时&#xff0c;默认的打开程序并非你所需要的&#xff0c;从而影响了工作效率&#xff1f;别担心&#xff0c;本文将为你详细解读如何设置PDF的默认打开方式&#xff0c;让你的工作更加高效便捷。 首先&#xff0…

2023年全国青少年人工智能创新挑战赛真题

为了大家备考2024年第七届全国青少年人工智能创新挑战赛&#xff0c;今天分享2023年第6届全国青少年人工智能创新挑战赛C信息学专项真题&#xff0c;图形化编程及Python编程基本大同小异&#xff0c;参考6547网的Python及图形化编程题库。 一、单项选择题(共 15 题,每题 2 分,共…

案例研究|MeterSphere助力万物云构建高效自动化测试平台

万物云空间科技服务股份有限公司&#xff08;以下简称为“万物云”&#xff09;&#xff0c;前身为万科物业发展股份有限公司&#xff0c;是国内领先的物管龙头上市公司。作为一家科技引领的全域空间服务商&#xff0c;万物云致力于打造产业级共享服务平台&#xff0c;基于空间…

python+selenium - UI自动框架之封装查找元素

单一的元素定位方法不能满足所有元素的定位&#xff0c;可以根据每个元素的特点来找到合适的方法&#xff0c;可以参考下图的方法&#xff1a; elementFind.py from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_con…

绿色瓶装水“暗战”竞争越发激烈,华润饮料谋上市同时多地扩产能

《港湾商业观察》黄懿 4月23日&#xff0c;纯净水牌“怡宝”母公司华润饮料&#xff08;控股&#xff09;有限公司&#xff08;下称“华润饮料”&#xff09;向港交所主板提交上市申请&#xff0c;联席保荐人为中银国际、中信证券、美银美林、瑞银集团。 在华润饮料递表不久之…

IC设计公司财务系统如何构建芯片行业财务解决方案

在IC设计行业中&#xff0c;构建高效、准确的财务系统对于支持企业运营、实现财务目标至关重要。特别是在芯片行业&#xff0c;随着技术的快速发展和市场竞争的加剧&#xff0c;财务解决方案的构建更是需要紧跟行业趋势&#xff0c;确保公司的财务稳健和持续发展。 首先&#x…

云计算期末复习(2)

MapReduce 包含Google MapReduce基本构架、Hadoop MapReduce基本构架 作业&#xff08;问答题&#xff09; &#xff08;1&#xff09;预习论文The Google File System&#xff0c;总结和分析GFS主要特点。 GFS的主要特点包括&#xff1a; 1. 高可靠性和容错性&#xff1a;G…