安卓应用开发学习:通过腾讯地图SDK实现定位功能
一、引言
这几天有些忙,耽误了写日志,但我的学习始终没有落下,有空我就会研究《 Android App 开发进阶与项目实战》一书中定位导航方面的内容。在我的手机上先后实现了“获取经纬度及地理位置描述信息”和“获取导航卫星信息”功能后,这两天,我又参照这书中的内容,实现了通过腾讯地图的Android定位SDK实现定位的功能,并有所扩展。书文以记之。
二、腾讯位置服务平台创建应用
要使用腾讯地图的位置服务,首先要到腾讯位置服务平台(https://lbs.qq.com/)注册一个用户,登录后进入控制台,在应用管理下创建自己的应用,然后添加Key。具体步骤见以下截图:
1.登录打开控制台
2.找到应用管理->我的应用,点击“创建应用”按钮。
3.输入应用的名称,并选择应用类型,确认后生成应用。
4.回到我的应用页面,点击“添加Key”。
5.输入Key名称、描述,勾选“SDK"和”导航SDK“,并在下方的文本框中输入你在Android Studio中要创建应用的包名。
6.完成,生成的Key在Android Studio中集成腾旭地图时要用到。
三、集成腾讯地图
完成上面的操作后,在Android Studio中要对需要使用腾讯位置服务的应用进行设置才能使用腾讯地图的SDK。
1.打开已创建好的Module下的build.gradle文件,在文的依赖中添加腾讯地图组件。
// 腾讯定位
implementation 'com.tencent.map.geolocation:TencentLocationSdk-openplatform:7.2.8'
// 腾讯地图
implementation 'com.tencent.map:tencent-map-vector-sdk:4.3.9.9'
// 地图组件库
implementation 'com.tencent.map:sdk-utilities:1.0.6'
上述组件的版本并不是最新的,我是照着 《 Android App 开发进阶与项目实战》上输入的,组件的最新版本请到官网查询。
2.在Module的AndroidManifest.xml文件中添加权限配置。
我添加的权限是参考了 《 Android App 开发进阶与项目实战》中的内容,官网给的添加权限(见下方)和我添加的有些不同,但我这边能正常定位,说明有些权限应该是可由可无的。
<!-- 通过GPS得到精确位置 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- 通过网络得到粗略位置 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 访问网络,某些位置信息需要从网络服务器获取 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- 访问WiFi状态,需要WiFi信息用于网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 修改WiFi状态,发起WiFi扫描, 需要WiFi信息用于网络定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!-- 访问网络状态, 检测网络的可用性,需要网络运营商相关信息用于网络定位 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 访问网络的变化, 需要某些信息用于网络定位 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<!-- 蓝牙扫描权限 -->
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<!-- 前台service权限 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<!-- 后台定位权限 -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<!-- A-GPS辅助定位权限,方便GPS快速准确定位 -->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
3. 在AndroidManifest.xml文件的application节点中添加一行属性配置:
android:usesCleartextTraffic="true"
4.最后,在AndroidManifest.xml文件的application节点末尾添加名为TencentMapSDK的元数据,之前在官网平台上生成的Key就填在这里。
以上就是我的设置步骤,全部是参考《 Android App 开发进阶与项目实战》中的内容,与官网的步骤有所区别(官网设置连接),但我的应用实现腾讯地图定位没有遇到问题。
四、功能实现
我是参照《 Android App 开发进阶与项目实战》书中9.3.2 显示地图面板 的内容,创建的Activity可以在腾讯地图上显示手机所在的位置,并能在普通地图和卫星地图之间切换,还可以显示交通情况。另外,可以通过手势操作移动地图和缩放地图。其功能与微信中共享位置功能差不多。
(普通地图模式) (卫星地图+显示交通情况模式)
对书中的源码研究后,我决定再扩展一下,增加SDK自带的指南针图标,自己自定义的放大按钮、缩小按钮、回到手机所在位置按钮,另外还自定义一个显示地图中心图标且显示中心经纬度的功能。最终效果如下:
1. 普通地图模式
这是照搬的书中的源码,点击“普通”单选按钮,将地图类型设置为TencentMap.MAP_TYPE_NORMAL。进入地图后默认也是这个类型。关键代码:
private TencentMap mTencentMap; // 声明一个腾讯地图对象
private MapView mMapView; // 声明一个地图视图对象// onCreate方法中初始化
mMapView = findViewById(R.id.mapView);
mTencentMap = mMapView.getMap(); // 获取腾讯地图对象// 点击“普通地图”单选按钮后,执行以下语句
mTencentMap.setMapType(TencentMap.MAP_TYPE_NORMAL); // 设置普通地图
2.卫星地图模式
通过点击“卫星”单选按钮触发。关键代码:
// 点击“卫星地图”单选按钮后,执行以下语句
mTencentMap.setMapType(TencentMap.MAP_TYPE_SATELLITE); // 设置卫星地图
3. 显示交通情况
通过点击“交通情况”复选按钮触发,关键代码:
// 点击“交通情况”复选按钮触发
mTencentMap.setTrafficEnabled(isChecked); // 是否显示交通拥堵状况
4. 显示/隐藏中心点标记
这是我自己添加的功能,红色十字图标是一个TextView组件,这个组件与腾讯地图组件MapView都放在一个RelativeLayout布局中,MapView充满整个布局,TextView放在RelativeLayout中心位置。在onCreate方法初始化时,将这个TextView组件隐藏,在勾选了复选框后,才显示,另外“中心点”按钮,也与这个TextView联动,在TextView组件显示时“中心点”按钮可用,在TextView组件隐藏时“中心点”按钮不可用。
关键代码:
<RelativeLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1" ><com.tencent.tencentmap.mapsdk.maps.MapViewandroid:id="@+id/mapView"android:layout_width="match_parent"android:layout_height="fill_parent" /><TextViewandroid:id="@+id/tv_centerPoint"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:gravity="center"android:layout_centerInParent="true"android:textSize="48sp"android:textColor="@color/red"android:text="+" /></RelativeLayout>
private Button btn_getCenter; // 获取中心点按钮
private TextView tv_centerPoint; // 中心点标记// 点“中心点”按钮左侧的复选框后,显示
tv_centerPoint.setVisibility(View.VISIBLE); // 显示
btn_getCenter.setEnabled(true); // 可用// 取消“中心点”按钮左侧的复选框后,隐藏
tv_centerPoint.setVisibility(View.INVISIBLE); // 隐藏
btn_getCenter.setEnabled(false); // 不可用
5. 获取中心点位置
在“中心点”按钮左侧的复选框勾选的情况下,点击“中心点”按钮,会显示中心点标识,且获取地图中心点经纬度,并显示在界面中。关键代码如下:
CameraPosition cameraPosition = mTencentMap.getCameraPosition();
mCenterLatLng = cameraPosition.target;
Toast.makeText(this, "中心点坐标:" + mCenterLatLng.latitude + ";" + mCenterLatLng.longitude, Toast.LENGTH_LONG).show();
6. 放大/缩小地图
(点击放大按钮效果) (点击缩小按钮效果)
放大和缩小按钮时参考了其它地图软件上的效果,我自己用带圆角样式的LinearLayout布局包裹了两个TextView组件实现的。这个LinearLayout布局也是放在前面说到的RelativeLayout布局中。LinearLayout布局位于地图组件的右下方向。两个TextView组件设置了OnClick监听器,点击后执行放大和缩小地图操作。关键代码:
<RelativeLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1" ><com.tencent.tencentmap.mapsdk.maps.MapViewandroid:id="@+id/mapView"android:layout_width="match_parent"android:layout_height="fill_parent" /><LinearLayoutandroid:layout_width="55dp"android:layout_height="wrap_content"android:layout_above="@+id/mapView"android:layout_alignEnd="@+id/mapView"android:layout_alignBottom="@+id/mapView"android:layout_marginEnd="20dp"android:layout_marginBottom="110dp"android:background="@drawable/radius_border_15"android:orientation="vertical"><TextViewandroid:id="@+id/tv_enlarge"android:layout_width="50dp"android:layout_height="50dp"android:layout_gravity="center_horizontal"android:layout_marginTop="15dp"android:layout_marginBottom="15dp"android:gravity="center"android:text="+"android:textColor="@color/black"android:textSize="32sp"android:textStyle="bold" /><TextViewandroid:id="@+id/tv_narrow"android:layout_width="50dp"android:layout_height="50dp"android:layout_gravity="center_horizontal"android:layout_marginTop="15dp"android:layout_marginBottom="15dp"android:gravity="center"android:text="-"android:textColor="@color/black"android:textSize="32sp"android:textStyle="bold" /></LinearLayout></RelativeLayout>
// 点击放大按钮后执行
mTencentMap.moveCamera(CameraUpdateFactory.zoomIn()); // 放大一级
// 点击缩小按钮后执行
mTencentMap.moveCamera(CameraUpdateFactory.zoomOut()); // 缩小一级
7. 回到手机定位处
在地图中通过手指拖动地图,使手机定位脱离地图中心点后,通过点击“回到手机处”按钮就可以将地图的中心点重新设置为手机定位处,从而让地图中心点快速回到定位处。
这个图标是我从手机的百度地图上截图后,通过PS处理后得到的,保存为PNG格式后,放在项目的res/drawable-xhdpi文件夹下。在xml文件中这个图标放在ImageButton组件中,这个组件外套了一个带圆角的LinearLayout布局。LinearLayout布局放在RelativeLayout布局中,设置在mapView组件的左下方。
关键代码:
<RelativeLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1" ><com.tencent.tencentmap.mapsdk.maps.MapViewandroid:id="@+id/mapView"android:layout_width="match_parent"android:layout_height="fill_parent" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignStart="@+id/mapView"android:layout_alignBottom="@+id/mapView"android:background="@drawable/radius_border_15"android:layout_marginStart="20dp"android:layout_marginBottom="50dp"android:orientation="horizontal"><ImageButtonandroid:id="@+id/img_btn_myPlace"android:layout_width="54dp"android:layout_height="54dp"android:backgroundTint="@color/white"android:src="@drawable/ic_my_place"tools:ignore="ContentDescription" /></LinearLayout></RelativeLayout>
// 点击“中心点”按钮后,执行
CameraPosition cameraPosition = mTencentMap.getCameraPosition();
mCenterLatLng = cameraPosition.target;
Toast.makeText(this, "中心点坐标:" + mCenterLatLng.latitude + ";" + mCenterLatLng.longitude, Toast.LENGTH_LONG).show();
8.添加指南针
这是腾讯地图自带的组件,只需要在onCreate方法中添加几行代码就可以:
mTencentMap = mMapView.getMap(); // 获取腾讯地图对象// 在上面的语句获取到地图对象后,添加以下两行代码
UiSettings mysetting = mTencentMap.getUiSettings();
mysetting.setCompassEnabled(true); // 开启指南针
五、代码展示
最后上完整的代码,希望对大家有用:
MapBasicActivity.Java文件
import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;import com.tencent.map.geolocation.TencentLocation;
import com.tencent.map.geolocation.TencentLocationListener;
import com.tencent.map.geolocation.TencentLocationManager;
import com.tencent.map.geolocation.TencentLocationRequest;
import com.tencent.tencentmap.mapsdk.maps.CameraUpdate;
import com.tencent.tencentmap.mapsdk.maps.CameraUpdateFactory;
import com.tencent.tencentmap.mapsdk.maps.MapView;
import com.tencent.tencentmap.mapsdk.maps.TencentMap;
import com.tencent.tencentmap.mapsdk.maps.UiSettings;
import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptor;
import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptorFactory;
import com.tencent.tencentmap.mapsdk.maps.model.CameraPosition;
import com.tencent.tencentmap.mapsdk.maps.model.LatLng;
import com.tencent.tencentmap.mapsdk.maps.model.MarkerOptions;public class MapBasicActivity extends AppCompatActivity implements TencentLocationListener, View.OnClickListener {private final static String TAG = "MapBasicActivity";private TencentLocationManager mLocationManager; // 声明一个腾讯定位管理器对象private MapView mMapView; // 声明一个地图视图对象private TencentMap mTencentMap; // 声明一个腾讯地图对象private boolean isFirstLoc = true; // 是否首次定位private Button btn_getCenter; // 获取中心点按钮private TextView tv_centerPoint; // 中心点标记private LatLng mMyLatLng, mCenterLatLng; // 我的位置, 地图中心位置@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_map_basic);initLocation(); // 初始化定位服务initView(); // 初始化视图}// 初始化视图private void initView() {tv_centerPoint = findViewById(R.id.tv_centerPoint);tv_centerPoint.setVisibility(View.INVISIBLE);btn_getCenter = findViewById(R.id.btn_getCenter);btn_getCenter.setEnabled(false);RadioGroup rg_type = findViewById(R.id.rg_type);rg_type.setOnCheckedChangeListener((group, checkedId) -> {if (checkedId == R.id.rb_common) {mTencentMap.setMapType(TencentMap.MAP_TYPE_NORMAL); // 设置普通地图} else if (checkedId == R.id.rb_satellite) {mTencentMap.setMapType(TencentMap.MAP_TYPE_SATELLITE); // 设置卫星地图}});CheckBox ck_traffic = findViewById(R.id.ck_traffic);ck_traffic.setOnCheckedChangeListener((buttonView, isChecked) -> {mTencentMap.setTrafficEnabled(isChecked); // 是否显示交通拥堵状况});CheckBox ck_centerPoint = findViewById(R.id.ck_centerPoint);ck_centerPoint.setOnCheckedChangeListener((buttonView, isChecked) -> {if (isChecked) {tv_centerPoint.setVisibility(View.VISIBLE);btn_getCenter.setEnabled(true);} else {tv_centerPoint.setVisibility(View.INVISIBLE);btn_getCenter.setEnabled(false);}});// 设置按钮监听器findViewById(R.id.tv_enlarge).setOnClickListener(this); // 放大地图findViewById(R.id.tv_narrow).setOnClickListener(this); // 缩小地图findViewById(R.id.img_btn_myPlace).setOnClickListener(this); // 回到我的位置findViewById(R.id.btn_getCenter).setOnClickListener(this); // 获取中心点btn_getCenter.setOnClickListener(this); // 获取中心点}// 初始化定位服务private void initLocation() {mMapView = findViewById(R.id.mapView);mTencentMap = mMapView.getMap(); // 获取腾讯地图对象UiSettings mysetting = mTencentMap.getUiSettings();mysetting.setCompassEnabled(true); // 开启指南针mLocationManager = TencentLocationManager.getInstance(this);// 创建腾讯定位请求对象TencentLocationRequest request = TencentLocationRequest.create();request.setInterval(30000).setAllowGPS(true);request.setRequestLevel(TencentLocationRequest.REQUEST_LEVEL_ADMIN_AREA);mLocationManager.requestLocationUpdates(request, this); // 开始定位监听}@Overridepublic void onLocationChanged(TencentLocation location, int resultCode, String resultDesc) {if (resultCode == TencentLocation.ERROR_OK) { // 定位成功if (location != null && isFirstLoc) { // 首次定位isFirstLoc = false;// 创建一个经纬度对象mMyLatLng = new LatLng(location.getLatitude(), location.getLongitude());CameraUpdate update = CameraUpdateFactory.newLatLngZoom(mMyLatLng, 12);mTencentMap.moveCamera(update); // 把相机视角移动到指定地点// 从指定图片中获取位图描述BitmapDescriptor bitmapDesc = BitmapDescriptorFactory.fromResource(R.drawable.icon_locate);MarkerOptions ooMarker = new MarkerOptions(mMyLatLng).draggable(false) // 不可拖动.visible(true).icon(bitmapDesc).snippet("这是您的当前位置");mTencentMap.addMarker(ooMarker); // 往地图添加标记}} else { // 定位失败Log.d(TAG, "定位失败,错误代码为"+resultCode+",错误描述为"+resultDesc);}}@Overridepublic void onStatusUpdate(String s, int i, String s1) {}// 绑定生命周期@Overrideprotected void onStart() {super.onStart();mMapView.onStart();}@Overrideprotected void onStop() {super.onStop();mMapView.onStop();}@Overridepublic void onPause() {super.onPause();mMapView.onPause();}@Overridepublic void onResume() {super.onResume();mMapView.onResume();}@Overrideprotected void onDestroy() {super.onDestroy();mLocationManager.removeUpdates(this); // 移除定位监听mMapView.onDestroy();}@Overridepublic void onClick(View v) {if (v.getId() == R.id.tv_enlarge) { // 放大地图mTencentMap.moveCamera(CameraUpdateFactory.zoomIn()); // 放大一级} else if (v.getId() == R.id.tv_narrow) { // 缩小地图mTencentMap.moveCamera(CameraUpdateFactory.zoomOut()); // 缩小一级} else if (v.getId() == R.id.img_btn_myPlace) { // 回到我的位置CameraUpdate update = CameraUpdateFactory.newLatLng(mMyLatLng);mTencentMap.moveCamera(update); // 把相机视角移动到指定地点} else if (v.getId() == R.id.btn_getCenter) { // 获取中心点坐标CameraPosition cameraPosition = mTencentMap.getCameraPosition();mCenterLatLng = cameraPosition.target;Toast.makeText(this, "中心点坐标:" + mCenterLatLng.latitude + ";" + mCenterLatLng.longitude, Toast.LENGTH_LONG).show();}}
}
activity_map_basic.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MapBasicActivity"><RadioGroupandroid:id="@+id/rg_type"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><RadioButtonandroid:id="@+id/rb_common"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:checked="true"android:text="普通"android:textColor="@color/black"android:textSize="17sp" /><RadioButtonandroid:id="@+id/rb_satellite"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:checked="false"android:text="卫星"android:textColor="@color/black"android:textSize="17sp" /><CheckBoxandroid:id="@+id/ck_traffic"android:layout_width="wrap_content"android:layout_height="wrap_content"android:checked="false"android:text="交通情况"android:textColor="@color/black"android:textSize="17sp" /><CheckBoxandroid:id="@+id/ck_centerPoint"android:layout_width="35dp"android:layout_height="wrap_content"android:layout_marginStart="10dp"android:checked="false"android:text=""android:textColor="@color/black"android:textSize="17sp" /><Buttonandroid:id="@+id/btn_getCenter"android:layout_width="80dp"android:layout_height="wrap_content"android:text="中心点"/></RadioGroup><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1" ><com.tencent.tencentmap.mapsdk.maps.MapViewandroid:id="@+id/mapView"android:layout_width="match_parent"android:layout_height="fill_parent" /><LinearLayoutandroid:layout_width="55dp"android:layout_height="wrap_content"android:layout_above="@+id/mapView"android:layout_alignEnd="@+id/mapView"android:layout_alignBottom="@+id/mapView"android:layout_marginEnd="20dp"android:layout_marginBottom="110dp"android:background="@drawable/radius_border_15"android:orientation="vertical"><TextViewandroid:id="@+id/tv_enlarge"android:layout_width="50dp"android:layout_height="50dp"android:layout_gravity="center_horizontal"android:layout_marginTop="15dp"android:layout_marginBottom="15dp"android:gravity="center"android:text="+"android:textColor="@color/black"android:textSize="32sp"android:textStyle="bold" /><TextViewandroid:id="@+id/tv_narrow"android:layout_width="50dp"android:layout_height="50dp"android:layout_gravity="center_horizontal"android:layout_marginTop="15dp"android:layout_marginBottom="15dp"android:gravity="center"android:text="-"android:textColor="@color/black"android:textSize="32sp"android:textStyle="bold" /></LinearLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignStart="@+id/mapView"android:layout_alignBottom="@+id/mapView"android:background="@drawable/radius_border_15"android:layout_marginStart="20dp"android:layout_marginBottom="50dp"android:orientation="horizontal"><ImageButtonandroid:id="@+id/img_btn_myPlace"android:layout_width="54dp"android:layout_height="54dp"android:backgroundTint="@color/white"android:src="@drawable/ic_my_place"tools:ignore="ContentDescription" /></LinearLayout><TextViewandroid:id="@+id/tv_centerPoint"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:gravity="center"android:layout_centerInParent="true"android:textSize="48sp"android:textColor="@color/red"android:text="+" /></RelativeLayout></LinearLayout>
相关文章:

安卓应用开发学习:通过腾讯地图SDK实现定位功能
一、引言 这几天有些忙,耽误了写日志,但我的学习始终没有落下,有空我就会研究《 Android App 开发进阶与项目实战》一书中定位导航方面的内容。在我的手机上先后实现了“获取经纬度及地理位置描述信息”和“获取导航卫星信息”功能后&#x…...

iptable精讲
SNAT策略 SNAT策略的典型应用环境 局域网主机共享单个公网IP地址接入Internet SNAT策略的原理 源地址转换,Source Network Address Translantion 修改数据包的源地址 部署SNAT策略 1.准备二台最小化虚拟机修改主机名 主机名:gw 主机名࿱…...

2024 年如何构建 AI 软件
人工智能 (AI) 是当今 IT 行业最热门的话题,受到大型科技公司、大型企业和投资者的青睐。如果有人不参与 AI,他们就出局了。虽然“AI 泡沫”一词尚未公开使用,但街上的每个人都可能听说过 AI 将取代我们的工作(可能不会࿰…...
Python实战,桌面小游戏,剪刀石头布
注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程: Python项目开发实战_桌面小游戏-剪刀石头布_编程案例解析实例详解课程教程.pdf 创建一个基于Python的桌面小游戏“剪刀石头布”是一个很好的编程实践…...

Hadoop权威指南-读书笔记-01-初识Hadoop
Hadoop权威指南-读书笔记 记录一下读这本书的时候觉得有意思或者重要的点~ 第一章—初识Hadoop Tips: 这个引例很有哲理嘻嘻😄,道出了分布式的灵魂。 1.1 数据!数据! 这一小节主要介绍了进入大数据时代,面…...

HttpServletResponse设置headers返回,发现headers中缺少“Content-Length“和“Content-Type“两个参数。
业务中需要将用httpUtils请求返回的headers全部返回,塞到HttpServletResponse中,代码如下: HttpServletResponse response;// 返回headers Arrays.stream(httpResponse.getHeaders()).forEach(header -> response.setHeader(header.getNa…...

GraphPad Prism生物医学数据分析软件下载安装 GraphPad Prism轻松绘制各种图表
Prism软件作为一款功能强大的生物医学数据分析与可视化工具,其绘图功能尤为突出。该软件不仅支持绘制基础的图表类型,如直观明了的柱状图、展示数据分布的散点图,以及描绘变化趋势的曲线图,更能应对复杂的数据呈现需求,…...
7/1 uart
uart4.c #include "uart4.h"//UART4_RX > PB2 //UART4_TX > PG11char rebuf[51] {0}; //rcc/gpio/uart4初始化 void hal_uart4_init() {/********RCC章节初始化*******///1.使能GPIOB组控制器 MP_AHB4ENSETR[1] 1RCC->MP_AHB4ENSETR | (0x1 << 1)…...

zdppy_api+vue3+antd开发前后端分离的预加载卡片实战案例
后端代码 import api import upload import timesave_dir "uploads"async def rand_content(request):key api.req.get_query(request, "key")time.sleep(0.3)return api.resp.success(f"{key} " * 100)app api.Api(routes[api.resp.get(&qu…...

别小看手机导航,这些隐藏功能大部分人可能都不知道
在科技日新月异的今天,手机导航已经成为我们日常生活中不可或缺的一部分。它不仅仅是指引我们前往目的地的工具,更隐藏着许多黑科技功能,极大地丰富了我们的出行体验。 今天,让我们一起探索手机导航中那些鲜为人知却大有用处的隐…...
Lua实现链表(面向对象应用)
Lua实现面向对象 面向对象核心三要素Lua面向对象大致原理面向对象示例继承与多态示例 面向对象核心三要素 1.封装:对一个事物的抽象为一些属性和行为动作的集合,封装将属性和行为动作(操作数据的方法)绑定在一起,并隐藏…...
每隔一个小时gc一次的问题
原文地址https://www.cnblogs.com/jiangxinlingdu/p/7581064.html 设置一下这个 -XX:ExplicitGCInvokesConcurrent 或 -XXExplicitGCInvokesConcurrentAndUnloadsClasses 并且检查一下,并下面的值设置变大 java.rmi.dgc.leaseValue sun.rmi.dgc.client.gcInterv…...

VBA数据库解决方案第十二讲:如何判断数据库中数据表是否存在
《VBA数据库解决方案》教程(版权10090845)是我推出的第二套教程,目前已经是第二版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…...

五、Spring IoCDI ★ ✔
5. Spring IoC&DI 1. IoC & DI ⼊⻔1.1 Spring 是什么?★ (Spring 是包含了众多⼯具⽅法的 IoC 容器)1.1.1 什么是容器?1.1.2 什么是 IoC?★ (IoC: Inversion of Control (控制反转))总…...

计算机网络八股文
计算机网络体系架构? OSI结构:理论上的 7应用层:定义了应用进程间通信和交互的规则,常见协议有HTTP、SFTP、DNS、WebSocket6表示层:数据的表示、安全、压缩。确保一个系统的应用层所发消息能被另一个系统的应用层读取…...

科普文:一文搞懂jvm原理(四)运行时数据区
概叙 科普文:一文搞懂jvm(一)jvm概叙-CSDN博客 科普文:一文搞懂jvm原理(二)类加载器-CSDN博客 科普文:一文搞懂jvm原理(三)执行引擎-CSDN博客 前面我们介绍了jvm,jvm主要包括两个子系统和两个组件: Class loader(类…...

《昇思25天学习打卡营第5天|数据变换 Transforms》
文章目录 前言:今日所学:1. Common Transforms2. Vision Transforms3. Text Transforms 前言: 我们知道在进行神经网络训练的时候,通常要将原始数据进行一系列的数据预处理操作才会进行训练,所以MindSpore提供了不同类…...

详细分析Oracle修改默认的时间格式(四种方式)
目录 前言1. 会话级别2. 系统级别3. 环境配置4. 函数格式化5. 总结 前言 默认的日期和时间格式由参数NLS_DATE_FORMAT控制 如果需要修改默认的时间格式,可以通过修改会话级别或系统级别的参数来实现 1. 会话级别 在当前会话中设置日期格式,这只会影响…...

以 Vue 3 项目为例,你是否经常遇到 import 语句顺序混乱的问题?要想解决它其实很容易!
大家好,我是CodeQi! 在项目开发过程中,我们经常会遇到项目中的 import 语句顺序混乱的问题。 这不仅会影响代码的可读性,还可能使我们代码在提交的时候产生不必要的冲突。 面对这种情况,要想解决它其实很容易。 通过合理的规范和自动化工具,我们可以确保 import 语句…...
mysql数据库ibdata文件被误删后恢复数据的方法
使用mysql数据库的时候不小心误删除了ibdata和ib_logfile文件,但是幸好.ibd文件还在。这种情况下其实数据还在并未丢失,丢失的是表结构。查询表数据时会报错:ERROR 1146 (42S02): Table ‘testdb.test’ doesn’t exist,其实是说表…...

eBPF技术揭秘:DeepFlow如何引领故障排查,提升运维效率
DeepFlow 实战:eBPF 技术如何提升故障排查效率 目录 DeepFlow 实战:eBPF 技术如何提升故障排查效率 微服务架构系统中各个服务、组件及其相互关系的全景 零侵扰分布式追踪(Distributed Tracing)的架构和工作流程 关于零侵扰持…...

C++视觉开发 三.缺陷检测
一.距离变换 1.概念和功能 距离变换是一种图像处理技术,用于计算图像中每个像素到最近的零像素(背景像素)的距离。它常用于图像分割、形态学操作和形状分析等领域。它计算图像中每个像素到最近的零像素(背景像素)的距…...

使用 Amazon Bedrock Converse API 简化大语言模型交互
本文将介绍如何使用 Amazon Bedrock 最新推出的 Converse API,来简化与各种大型语言模型的交互。该 API 提供了一致的接口,可以无缝调用各种大型模型,从而消除了需要自己编写复杂辅助功能函数的重复性工作。文中示例将展示它相比于以前针对每…...
第二十一章 函数(Python)
文章目录 前言一、定义函数二、函数参数三、参数类型四、函数返回值五、函数类型1、无参数,无返回值2、无参数,有返回值3、有参数,无返回值4、有参数,有返回值 六、函数的嵌套七、全局变量和局部变量1、局部变量2、全局变量 前言 …...

使用pyqt5编写一个七彩时钟
使用pyqt5编写一个七彩时钟 效果代码解析定义 RainbowClockWindow 类初始化用户界面显示时间方法 完整代码 在这篇博客中,我们将使用 PyQt5 创建一个简单的七彩数字时钟。 效果 代码解析 定义 RainbowClockWindow 类 class RainbowClockWindow(QMainWindow):def _…...

【Linux】:命令行参数
朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux命令行参数的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入…...

高考假期预习指南,送给迷茫的你
高考结束,离别了熟悉的地方,踏上远方。 你,,迷茫吗? 大学是什么?到了大学我该怎样学习?真像网上说的毕业即失业吗? 大学是一个让你学会一技之长的地方,到了大学找到自…...
独孤思维:负债了,还可以翻身吗
01 其实独孤早年也负债。 负债并不可怕。 可怕的是因为负债而催生的想要快速赚钱的心态。 越是有这种心态,越是不可能赚到钱。 相反,可能会让你陷入恶性循环中。 盲目付费,盲目寄希望于某个项目或者某个人。 当成唯一的救命稻草。 这…...

SwiftUI八与UIKIT交互
代码下载 SwiftUI可以在苹果全平台上无缝兼容现有的UI框架。例如,可以在SwiftUI视图中嵌入UIKit视图或UIKit视图控制器,反过来在UIKit视图或UIKit视图控制器中也可以嵌入SwiftUI视图。 本文展示如何把landmark应用的主页混合使用UIPageViewController和…...

RedHat9 | 内部YUM本地源服务器搭建
服务器参数 标识公司内部YUM服务器主机名yum-server网络信息192.168.37.1/24网络属性静态地址主要操作用户root 一、基础环境信息配置 修改主机名 [rootyum-server ~]# hostnamectl hostname yum-server添加网络信息 [rootyum-server ~]# nmcli connection modify ens160 …...