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

20212305杨贯宇 2024-06-30 01:59:27

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

1.实验内容

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

2.实验过程

2.1.创建项目

img

选择Java语言

2.2.申请密钥

控制台创建应用,需要发布版的sha1,因此需要在as里创建签名文件,并用keytool来获取sha1
1.创建release版本的签名文件:
先去Build菜单下生成一个正式的.jks签名文件。Build>Generate signed APK

img

2.进行release版本的签名验证:file>project structure>signing
此时在builde.gradle文件中就多了对正式签名文件的配置引用:注意要在buildTypes中添加对正式签名配置的引用。
3.获取sha1:
keytool -list -v -keystore你的签名文件

2.3.配置开发环境

按照实验指导书上的步骤放包
第一步:在工程app/libs目录下放入baidumapapi_vX_X_X.jar包,在src/main/目录下新建jniLibs目录,工程会自动加载src目录下的so动态库,放入libBaiduMapSDK_vX_X_X_X.so如下图所示,注意jar和so的前3位版本号必须一致,并且保证使用一次下载的文件夹中的两个文件,不能不同功能组件的jar或so交叉使用。
第二步:工程配置还需要把jar包集成到自己的工程中,如图上图所示,放入libs目录下。对于每个jar文件,右键-选择Add As Library,导入到工程中。对应在build.gradle生成工程所依赖的jar文件说明。

img

2.4.编写代码

MainActivy.java

package com.example.map;

import android.Manifest;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
 
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
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.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.model.LatLng;
 
public class MainActivity extends AppCompatActivity {
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();
}

Activity_main.xml

<?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>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.mylocation">
 
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
 
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.example.baidu"
android:enabled="true"
android:process=":remote"/>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="6lmYlAJwcQUNz2gGwem8VXpq0T7lDGxG"/>
</application>
<!--百度定位所需要权限,前面是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"/>
 
</manifest>

3.运行结果

img

4.学习感悟、思考

在本次实验中,我重点实现了百度地图的定位服务、地图覆盖物的添加以及文本信息的展示功能。此次实验经历使我在实际操作中进一步加深了对Android开发技术和百度地图SDK应用的理解。
我深入学习了Android系统中的动态权限管理机制,并确保应用在运行时能够恰当地获取用户授权的权限。随后,我成功集成了百度地图SDK,通过配置LocationClient和LocationClientOption类,实现了精准的定位功能,并在地图上直观地展示了定位结果及相关信息。
我熟练掌握了Android动态权限的请求与处理技巧,这不仅保障了应用的安全性和良好的用户体验,还让我对百度地图SDK的集成和基本功能调用有了更深入的了解,涵盖了定位服务和地图展示等核心功能。
这次实验让我深刻体会到,细致的权限管理以及正确的SDK配置对于构建一个功能完备的应用至关重要。通过实践,我不仅巩固了Android开发技能,还学会了如何高效地利用第三方SDK,以快速实现复杂的应用功能。整个开发过程既充实又充满挑战,让我收获满满。

...全文
301 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
内容概要:本文围绕“基于改进型SVPWM调制的钳位型单相三电平NPC逆变器中点电位平衡”展开仿真研究,系统探讨了如何通过改进的空间矢量脉宽调制(SVPWM)策略有效抑制单相三电平中性点钳位(NPC)逆变器中存在的中点电位漂移问题。研究依托Simulink仿真平台构建系统模型,详细分析了不同调制策略对中点电压波动的影响机制,验证了所提出控制方法在提升输出波形质量、增强系统稳定性方面的有效性。同时,文档附带了多项相关科研主题资源,涵盖多电平逆变器控制、虚拟同步发电机(VSG)、微电网能量管理、信号处理、路径规划、机器学习与深度学习等多个前沿方向,展现了较强的综合性与科研实用价值。; 适合人群:电气工程、自动化、新能源科学与工程、电力电子与电力传动等领域的硕士、博士研究生,以及从事电力系统控制、可再生能源并网技术研究的科研人员与工程技术人员。; 使用场景及目标:① 深入理解三电平NPC逆变器的工作原理及中点电位不平衡的成因与危害;② 掌握改进型SVPWM调制策略的设计思想及其在中点电位控制中的实现路径;③ 利用Simulink搭建电力电子系统仿真模型,开展控制算法的验证与优化;④ 拓展至三相多电平逆变器、VSG构网型控制、微电网协同优化等高级课题的研究与复现。; 阅读建议:建议读者结合Simulink仿真环境进行实操演练,重点关注调制策略中开关状态选择与作用时间分配对中点电荷累积的影响机制。初学者应先夯实传统SVPWM理论基础,再逐步过渡到改进策略的学习;进阶研究者可尝试将该方法推广至多目标协同控制或引入智能优化算法进一步提升动态响应性能。

102

社区成员

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

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