Android如何实现地图定位?Android studio+百度地图API+Android6.0系统实现地图显示、地址设置、点击地图定位功能(详细)

文章说明:本文初衷是为了记录毕设学习过程,避免忘记操作流程。该功能是毕业设计的Android软件端的功能之一,本文将从获取百度地图密钥(AK)开始,详细地对地图定位配置和相关代码进行说明,文末将附上实现该功能的代码。后续等答辩完成会把整个Android端代码上传。

6月27日更新,完整的智能家居APP的源码和相关说明已经发出,感兴趣的同学点开链接看看

使用Android studio完成简易智能家居APP的制作(含源码工程包)

目录

1、使用的软硬件说明

1)获取包名

2)获取SHA1(重点)

3、下载相关开发包并将文件配置到Android studio的文件中

1、Android SDK专业解释:

2、Android SDK的获取

 3、下载相关开发包后,进行Android Studio的配置

1、将获取的百度地图移动版开发密钥AK,配置到Android studio中

 2、将下载好的JAR格式百度地图开发包置于libs下,并在build.gradle中增加一条语句,用于展开JAR开发包

3、创建一个jniLibs文件名,在src/java/jniLibs这个路径下,添加开发包的其他文件

4、在activity_main.xml的layout文件中,设置相关按钮(就是普通/卫星地图那些玩意的选择)

5、开启权限(定位权限,网络权限等) 

4、代码(地图定位)


在进入学习前,老(新)规矩,先看效果图:

 


2023/4.8 新增功能及其界面如下:

 okok,看完效果图,那咱们就开始吧!


1、使用的软硬件说明

软件:百度地图API,使用的外部包是百度地图Android SDK基于Android 4.0及以上版本设备的应用程序接口,Android studio开发软件,360手机助手。

硬件:openA57手机一台,数据线一根

        百度地图移动版的开发密钥(AK)是一个API访问授权凭证,用于验证应用程序或网站请求百度地图API时的身份和权限。它是一段由百度地图开发者平台生成的字符串,类似于密码,需要在每次API调用中传递给服务器以获得访问权限。

具体步骤如下:

1、登录或者注册百度地图开放平台,进入链接获取百度地图开发密钥网址链接

2、点击创建应用

3、进入界面后,选择Android SDK,自己创建应用名字

4、这一步涉及到两个关键的信息源,如何获得这两个信息显得十分的关键,这两个信息分别是包名和SHA1,如图所示,其中发布饭SHA1和包名是必填项,具体如何获取,下面我将详细说明。当然也可以通过官方获取文档的教学进行操作获取。

1)获取包名

 这个数据的获取相对简单,如图所示:

2)获取SHA1(重点)

首先说明一下SHA1其实是

SHA1 (Secure Hash Algorithm 1) 是一种加密算法,常用于验证数据的完整性和安全性。在地图开发中,获取SHA1通常是为了使用百度地图服务API进行身份验证和授权。通常需要生成应用程序签名并使用keytool工具来获取SHA1指纹。

那么具体应该如何操作呢?

此处教一个万能的方法,首先打开安装Android studio目录下的jre,此处我安装的路径是C:\Program Files\Android\Android Studio\jre\bin;找到路径后,使用win+R输入cmd命令,进入命令行工具(或者直接右键点击在终端打开)如下图所示:

 然后找到你的 debug.keystore所在的目录,如图所示,我的在c盘用户目录的.android一般都在这个“.android”目录下,这个需要自己寻找哈!完成这一步,恭喜你,你已经近乎完成了!!!

 还记得我们刚刚打开的cmd命令端吗?打开它然后直接输入下面这串字符和刚刚找到的debug.keystore路径,再之后回车即可:

keytool -list -v -keystore 路径(刚刚寻找的debug.keystore的路径)

 需要注意的是,它需要你输入密钥库口令,请输入:android

如图所示,你成功获得了SHA1数据;接下来在创建应用界面输入包名和SHA1的数据即可,让后你就得到了一个应用,具体如下图,应用ak即可得到

3、下载相关开发包并将文件配置到Android studio的文件中

这里呢,就需要我们下载一个Android SDK,这是个什么呢?且看解释!

1、Android SDK专业解释:

Android SDK是指Android软件开发工具包(Software Development Kit),它是一组用于开发Android应用程序的工具和资源集合。Android SDK由Google或其他地图进行提供,可以免费下载和使用。

Android SDK包含了许多开发应用程序所需的组件,例如:

  1. Android操作系统的API(应用程序接口)文档,包括各种库、函数和类,供开发人员调用和使用。
  2. Android模拟器(emulator):可以在计算机上模拟Android设备,并进行应用程序测试和调试。
  3. 调试工具:包括adb(Android调试桥)、Logcat等,可以帮助开发人员调试和诊断应用程序。
  4. 样例代码和示例应用程序:提供给开发人员参考和学习。

使用Android SDK,开发人员可以利用Java语言编写Android应用程序,并通过Eclipse、Android Studio等开发环境对其进行编辑、编译和打包等操作。同时,Android SDK还支持用C/C++语言编写Android应用程序,并利用NDK(Native Development Kit)进行编译等操作。

2、Android SDK的获取

SDK下载 - 百度LBS开放平台

又将如何选择呢?我要完成的功能是地图和定位,故而选择的是①基础定位+②JAR格式包+③标准开发包,如图:

 3、下载相关开发包后,进行Android Studio的配置

这里的配置较为繁琐,仔细点哇!

1、将获取的百度地图移动版开发密钥AK,配置到Android studio中

打开AndroidManifest.xml文件,在文件中进行如下图所示的配置:注意蓝牙框框内的name不允许改变,而那个value就是我们前边费劲心思搞到的ak

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

 2、将下载好的JAR格式百度地图开发包置于libs下,并在build.gradle中增加一条语句,用于展开JAR开发包

语句:implementation files('libs/BaiduLBS_Android.jar'),注意这条语句放在dependencies

什么?你说找不到libs包?找不到不会自己创建啊?嗯? 

3、创建一个jniLibs文件名,在src/java/jniLibs这个路径下,添加开发包的其他文件

你问我为什么要取这么个名字(jniLibs)?我也不知道,真不知道,我去问问ChatGPT。看图,懂了吧!嘿嘿!

4、在activity_main.xml的layout文件中,设置相关按钮(就是普通/卫星地图那些玩意的选择)

 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"tools:context=".MainActivity"><ImageButtonandroid:visibility="gone"android:id="@+id/ib_location"android:layout_margin="8dp"android:onClick="resetLocation"android:layout_width="40dp"android:layout_height="40dp"tools:ignore="OnClick" /><LinearLayoutandroid:layout_width="wrap_content"android:orientation="horizontal"android:layout_height="wrap_content"><RadioGroupandroid:id="@+id/id_rp_mapType"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"android:checkedButton="@id/id_normal"><RadioButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/id_normal"android:text="普通地图"></RadioButton><RadioButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/id_satel"android:text="卫星地图"></RadioButton></RadioGroup><CheckBoxandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/id_lukuan"android:checked="false"android:text="路况图"></CheckBox><CheckBoxandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/id_reli"android:checked="false"android:text="热力图"></CheckBox></LinearLayout><com.baidu.mapapi.map.MapViewandroid:id="@+id/bmapView"android:layout_width="match_parent"android:layout_height="match_parent"android:visibility="visible"android:clickable="true" /></LinearLayout>

5、开启权限(定位权限,网络权限等) 

具体开启权限的代码如下(注意这里的开启的权限,一部分与地图定位的无关,这是因为开发的功能不仅仅局限于地图定位,懂?):

<?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.lbstest" ><!-- 以下权限与application标签是平级的 --><!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,POI检索等 --><uses-permission android:name="android.permission.INTERNET" /> <!-- 获取网络状态,根据网络状态切换进行数据请求网络转换 --><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!-- 读取外置存储。如果开发者使用了so动态加载功能并且把so文件放在了外置存储区域,则需要申请该权限,否则不需要 --><!-- 这个权限用于进行网络定位 --><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" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 写外置存储。如果开发者使用了离线地图,并且数据写在外置存储区域,则需要申请该权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permissionandroid:name="android.permission.WRITE_SETTINGS"tools:ignore="ProtectedPermissions" /> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 --><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 访问网络,网络定位需要上网 --><uses-permission android:name="android.permission.INTERNET" /> <!-- 管理蓝牙需要 --><uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- 搜索蓝牙需要,因为蓝牙可以被用来定位,所以需要定位权限 --><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><applicationandroid:name=".MapApp"android:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="智能家居"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.LBSTest"tools:targetApi="31" ><activityandroid:name=".OneNetActivity"android:exported="true"></activity><activityandroid:name=".BlueToothActivity"android:exported="true" ><meta-dataandroid:name="android.app.lib_name"android:value="true" /><intent-filter><action android:name="android.bluetooth.device.action.ACL_CONNECTED" /><action android:name="android.bluetooth.device.action.ACL_DISCONNECT_REQUESTED" /><action android:name="android.bluetooth.device.action.ACL_DISCONNECTED" /></intent-filter></activity><activityandroid:name=".MainActivity"android:exported="true"tools:ignore="MissingClass" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="eoN58SnkMIiyLXe3un6q8qwYurGssVpg" /><serviceandroid:name="com.baidu.location.f"android:enabled="true"android:process=":remote" ></service></application></manifest>

        okok,通过上述五步,地图定位的配置工作已经告一段落了,接下来就是枯燥的代码环节,我将贴粗关键代码,仅供学习!说明:代码实际是借鉴一位大佬的,具体是谁,忘记了,我只是进行了一些简单的修改,而且改的很烂,反正你也打不到我,别在评论区骂我就行!

4、代码(地图定位)

关于该功能实现的layout文件和权限配置这两个,我已经把代码贴出来了,往上找!

1、AndroidManifest.xml文件

首先需要声明,有些代码是不需要的,如下图的几个红色的框框,表示的是将要运行的Java活动程序,而该功能只需要执行MapApp、MainActivity两个Java活动程序。

我已经将不会用到的代码删除,具体如下:

<?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.lbstest" ><!-- 以下权限与application标签是平级的 --><!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,POI检索等 --><uses-permission android:name="android.permission.INTERNET" /> <!-- 获取网络状态,根据网络状态切换进行数据请求网络转换 --><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!-- 读取外置存储。如果开发者使用了so动态加载功能并且把so文件放在了外置存储区域,则需要申请该权限,否则不需要 --><!-- 这个权限用于进行网络定位 --><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" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 写外置存储。如果开发者使用了离线地图,并且数据写在外置存储区域,则需要申请该权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permissionandroid:name="android.permission.WRITE_SETTINGS"tools:ignore="ProtectedPermissions" /> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 --><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 访问网络,网络定位需要上网 --><uses-permission android:name="android.permission.INTERNET" /> <!-- 管理蓝牙需要 --><applicationandroid:name=".MapApp"android:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="智能家居"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.LBSTest"tools:targetApi="31" ><activityandroid:name=".MainActivity"android:exported="true"tools:ignore="MissingClass" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="xxxxxxxxxxxxxxxxxxxxxxxxxxxx" /><serviceandroid:name="com.baidu.location.f"android:enabled="true"android:process=":remote" ></service></application></manifest>

2、在进活动运行前,还需要运行一个,MapApp.java文件

用于动态申请啥的...

package com.example.lbstest;import android.app.Application;import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;
public class MapApp extends Application {@Overridepublic void onCreate() {super.onCreate();//动态申请SDKInitializer.setAgreePrivacy(this,true);//在使用SDK各组件之前初始化context信息,传入ApplicationContextSDKInitializer.initialize(this);//自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.//包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。SDKInitializer.setCoordType(CoordType.BD09LL);}
}

3、下面就是核心代码,MainActivity.java文件

package com.example.lbstest;import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageButton;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;
import com.baidu.mapapi.map.MapView;public class MainActivity extends AppCompatActivity{//MainActivity类继承于AppCompatActivity类/*以下MAP中用到到参数* */private MapView mMapView;private RadioGroup mapType;private RadioButton nombtn;private RadioButton sabtn;private CheckBox lubtn;private CheckBox rebtn;private com.baidu.location.LocationClient mLocClient;private com.baidu.mapapi.map.BaiduMap mBaiduMap;private com.baidu.mapapi.map.BitmapDescriptor bitmap;//标点的图标private double markerLatitude = 0;//标点纬度private double markerLongitude = 0;//标点经度private ImageButton ibLocation;//重置定位按钮private com.baidu.mapapi.map.Marker marker;//标点也可以说是覆盖物public  int MAP_flag =0;//用于点击按钮后是否在家附近public static final String TAG="RightFragment";@SuppressLint({"MissingInflatedId", "ResourceType"})@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获取地图控件引用mMapView = (MapView) findViewById(R.id.bmapView);mapType = findViewById(R.id.id_rp_mapType);nombtn = findViewById(R.id.id_normal);sabtn = findViewById(R.id.id_satel);lubtn= findViewById(R.id.id_lukuan);rebtn=findViewById(R.id.id_reli);initEvent();initView();//视图初始化initLocation();//定位初始化mapOnClick();//地图点击}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.bluetooth_map_onenet, menu);return true;}/*** 绑定Options Menu的事件*/@Overridepublic boolean onOptionsItemSelected(MenuItem item) {int itemid = item.getItemId();// 获取当前点击菜单的资源ID/* 新建一个Intent对象 */Intent intent = new Intent();switch (itemid){case R.id.action_bluetooth_button:/* 指定intent要启动的类 */intent.setClass(MainActivity.this, BlueToothActivity.class);/* 启动一个新的Activity */startActivity(intent);/* 关闭当前的Activity */MainActivity.this.finish();break;case R.id.action_baidu_map:Toast.makeText(this, "你正在此界面", Toast.LENGTH_LONG).show();case R.id.action_onenet_button:/* 指定intent要启动的类 */intent.setClass(MainActivity.this, OneNetActivity.class);/* 启动一个新的Activity */startActivity(intent);/* 关闭当前的Activity */MainActivity.this.finish();break;}return  super.onOptionsItemSelected(item);}/*** 事件处理初始化*/private void initEvent(){mapType.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {//地图类型选择@Overridepublic void onCheckedChanged(RadioGroup radioGroup, int i) {if (i==nombtn.getId()){mMapView.getMap().setMapType(com.baidu.mapapi.map.BaiduMap.MAP_TYPE_NORMAL);//普通地图}else if (i==sabtn.getId()){mMapView.getMap().setMapType(com.baidu.mapapi.map.BaiduMap.MAP_TYPE_SATELLITE);//卫星地图//}}});lubtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton compoundButton, boolean b) {mMapView.getMap().setTrafficEnabled(b);//调用路况图}});rebtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton compoundButton, boolean b) {mMapView.getMap().setBaiduHeatMapEnabled(b);//调用热力图}});}private void initView() {// 地图初始化mMapView = (MapView) findViewById(R.id.bmapView);//回到当前定位ibLocation = (ImageButton) findViewById(R.id.ib_location);mMapView.showScaleControl(false);  // 设置比例尺是否可见(true 可见/false不可见)//mMapView.showZoomControls(false);  // 设置缩放控件是否可见(true 可见/false不可见)mMapView.removeViewAt(1);// 删除百度地图LogomBaiduMap = mMapView.getMap();mBaiduMap.setOnMarkerClickListener(new com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener() {//地图的点击事件@Overridepublic boolean onMarkerClick(com.baidu.mapapi.map.Marker marker) {final String info = (String) marker.getExtraInfo().get("info");Toast.makeText(MainActivity.this, info, Toast.LENGTH_SHORT).show();return true;}});}/*** 定位初始化*/public void initLocation() {//添加隐私合规政策com.baidu.location.LocationClient.setAgreePrivacy(true);// 开启定位图层mBaiduMap.setMyLocationEnabled(true);// 定位初始化if (mLocClient == null) {try {mLocClient = new com.baidu.location.LocationClient(this);} catch (Exception e) {e.printStackTrace();}}if (mLocClient != null) {MyLocationListener myListener = new MyLocationListener();mLocClient.registerLocationListener(myListener);com.baidu.location.LocationClientOption option = new com.baidu.location.LocationClientOption();option.setLocationMode(com.baidu.location.LocationClientOption.LocationMode.Hight_Accuracy);// 设置高精度定位option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系,bd09ll  百度经纬度坐标option.setScanSpan(0);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集mLocClient.setLocOption(option);mLocClient.start();//开始定位}}/*** 点切换到其他标点位置时,重置定位显示,点击之后回到自动定位** @param view*/public void resetLocation(View view) {markerLatitude = 0;initLocation();marker.remove();//清除标点}/*** 地图点击事件处理*/public void mapOnClick() {// 设置marker图标bitmap = com.baidu.mapapi.map.BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);mBaiduMap.setOnMapClickListener(new com.baidu.mapapi.map.BaiduMap.OnMapClickListener() {@Overridepublic void onMapPoiClick(com.baidu.mapapi.map.MapPoi mapPoi) {}//此方法就是点击地图监听@Overridepublic void onMapClick(com.baidu.mapapi.model.LatLng latLng) {//获取经纬度markerLatitude = latLng.latitude;markerLongitude = latLng.longitude;//先清除图层mBaiduMap.clear();// 定义Maker坐标点com.baidu.mapapi.model.LatLng point = new com.baidu.mapapi.model.LatLng(markerLatitude, markerLongitude);// 构建MarkerOption,用于在地图上添加Markercom.baidu.mapapi.map.MarkerOptions options = new com.baidu.mapapi.map.MarkerOptions().position(point).icon(bitmap);// 在地图上添加Marker,并显示//mBaiduMap.addOverlay(options);marker = (com.baidu.mapapi.map.Marker) mBaiduMap.addOverlay(options);Bundle bundle = new Bundle();bundle.putSerializable("info", "纬度:" + markerLatitude + "   经度:" + markerLongitude);marker.setExtraInfo(bundle);//将bundle值传入marker中,给baiduMap设置监听时可以得到它/***这个是弹窗的提醒,当定位到家附近时,将提醒转跳远端控制OneNetActivity* */if (markerLatitude >= 23.72 && markerLongitude >=113.08 && markerLatitude <= 23.73 && markerLongitude <=113.09) {AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).setTitle("转跳远端控制").setMessage("此时已经定位至家的附近,是否转跳远端控制").setIcon(R.mipmap.ic_launcher).setPositiveButton("确定", new DialogInterface.OnClickListener() {//添加"Yes"按钮@Overridepublic void onClick(DialogInterface dialogInterface, int i) {Intent intent_DW = new Intent();//转跳活动/* 指定intent要启动的类 */intent_DW.setClass(MainActivity.this, OneNetActivity.class);/* 启动一个新的Activity */startActivity(intent_DW);/* 关闭当前的Activity */MainActivity.this.finish();}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {//添加取消@Overridepublic void onClick(DialogInterface dialogInterface, int i) {Toast.makeText(MainActivity.this, "好的,收到主人", Toast.LENGTH_SHORT).show();}}).create();alertDialog.show();}System.out.println("纬度"+markerLatitude);System.out.println("经度"+markerLongitude);System.out.println("标记位"+MAP_flag);//点击地图之后重新定位initLocation();}});}/*** 定位SDK监听函数*/public class MyLocationListener extends com.baidu.location.BDAbstractLocationListener {@Overridepublic void onReceiveLocation(com.baidu.location.BDLocation location){Toast.makeText(MainActivity.this, location.getAddrStr(), Toast.LENGTH_SHORT).show();// MapView 销毁后不在处理新接收的位置if (mMapView == null) {return;}double resultLatitude;double resultLongitude;if (markerLatitude == 0) {//自动定位resultLatitude = location.getLatitude();resultLongitude = location.getLongitude();ibLocation.setVisibility(View.GONE);} else {//标点定位resultLatitude = markerLatitude;resultLongitude = markerLongitude;ibLocation.setVisibility(View.VISIBLE);}com.baidu.mapapi.map.MyLocationData locData = new com.baidu.mapapi.map.MyLocationData.Builder().accuracy(location.getRadius())// 设置定位数据的精度信息,单位:米.direction(location.getDirection()) // 此处设置开发者获取到的方向信息,顺时针0-360.latitude(resultLatitude).longitude(resultLongitude).build();mBaiduMap.setMyLocationData(locData);// 设置定位数据, 只有先允许定位图层后设置数据才会生效com.baidu.mapapi.model.LatLng latLng = new com.baidu.mapapi.model.LatLng(resultLatitude, resultLongitude);com.baidu.mapapi.map.MapStatus.Builder builder = new com.baidu.mapapi.map.MapStatus.Builder();builder.target(latLng).zoom(20.0f);mBaiduMap.animateMapStatus(com.baidu.mapapi.map.MapStatusUpdateFactory.newMapStatus(builder.build()));}}@Overrideprotected void onResume() {super.onResume();//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理mMapView.onResume();}@Overrideprotected void onPause() {super.onPause();//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理mMapView.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();// 退出时销毁定位mLocClient.stop();// 关闭定位图层mBaiduMap.setMyLocationEnabled(false);// 在activity执行onDestroy时必须调用mMapView.onDestroy()mMapView.onDestroy();}}

行了,打完收工!

回头答完辩,把工程代码贴出来,再会! 




23年4月8日修改,对代码进行补充,添加设置地址功能

使用三道不那么华丽的水平线,以下是更新后的代码,为了使代码的可用性和把玩性更高,我将一开始写死在代码里的经纬度数据进行了修正用以保证我项目的完整性。

项目需求:当在地图界面点击设置按钮后,界面有三个输入的EditText,分别是输入家庭地址、输入经度、输入纬度,需要注意的是只要提供家庭地址,就会自动生成经纬度,相反,只要提供经纬度,就会自动定位出家庭地址,并显示到文本框。除此之外还提供三个按钮,其一是清空当前输入数据,注意清空的数据是EditText中的数据;其二是获取当前位置,直接设置为家庭地址,需要注意的是,此时只是显示在EditText中,真正的参数并不赋值;最后一个按钮功能是设置完成,返回地图界面,需要注意的是,返回的同时,需要把经纬度两个参数进行赋值。

修改后的MainActivity代码:

package com.example.lbstest;import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageButton;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;import com.baidu.mapapi.map.MapView;import java.text.DecimalFormat;public class MainActivity extends AppCompatActivity{//MainActivity类继承于AppCompatActivity类/*以下MAP中用到到参数* */private MapView mMapView;private RadioGroup mapType;private RadioButton nombtn;//普通地图private RadioButton sabtn;//卫星地图private CheckBox lubtn;//路况图选择private CheckBox rebtn;//热力图选择private Button setButton_Home;//设置家庭地址按钮private com.baidu.location.LocationClient mLocClient;private com.baidu.mapapi.map.BaiduMap mBaiduMap;private com.baidu.mapapi.map.BitmapDescriptor bitmap;//标点的图标private double markerLatitude = 0;//标点纬度private double markerLongitude = 0;//标点经度private ImageButton ibLocation;//重置定位按钮private com.baidu.mapapi.map.Marker marker;//标点也可以说是覆盖物//标记位public  int SetHomeLocation_Flg = 0;//代码是否设置成功/***  参数说明:对家庭地址的经纬度进行设置,初始为广东省清远市清城区清辉北路,*  我要通过设置按钮传递到SetHomeLocationActivity活动里,因为它是默认的地址*/private double latitude = 23.72;private double longitude = 113.08;//经纬度初始是清远的地址调用对应的destroy()方法释放资源/*** 设置全局变量的经纬度*/public double Longitude;public double Latitude;public static final String TAG="RightFragment";@SuppressLint({"MissingInflatedId", "ResourceType"})@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/*** 作者:唐瑛琪* 日期:2023年4月7日* 邮箱:tyq0805@gmail.com* 参数(判断)说明:通过设置的地址按钮,触发SetHomeLocationActivity活动,* 并把在此活动中设置的经纬度传回MainActivity活动,* 并在点击定位出调用,注意,如果使用默认的地址,也需要进行设置。* 接受MainActivity活动的数据,并将传入的double数据只取小数点两位数据。我的需求就是,不太准确的经纬度*/SetHomeLocation_Flg = getIntent().getIntExtra("Set_home_flg",0);if(SetHomeLocation_Flg == 1) {Longitude = getIntent().getDoubleExtra("Longitude", 0);Latitude = getIntent().getDoubleExtra("Latitude", 0);/*以下测试数据*/
//            System.out.println("经度"+Longitude);
//            System.out.println("纬度"+Latitude);//将double类型的经纬度保留小数点后两位,我不需要过于精确的数据DecimalFormat df = new DecimalFormat("#.00");String LongitudeFormatted = df.format(Longitude);String LatitudeFormatted = df.format(Latitude);Longitude = Double.parseDouble(LongitudeFormatted);//将只剩下两个小数点的经纬度重新转化为double类型的数据Latitude = Double.parseDouble(LatitudeFormatted);SetHomeLocation_Flg = 0;//设置完成,标记位清零/*以下测试数据*/
//            Toast.makeText(this, "地址设置成功", Toast.LENGTH_LONG).show();
//            System.out.println("保留两位小数的经度"+Longitude);
//            System.out.println("保留两位小数的纬度"+Latitude);}else if( SetHomeLocation_Flg==0 ){//两处赋值,一处是初始值,一处是SetHomeLocationActivity活动返回值/*** 作者:唐瑛琪* 日期:2023年4月8日改* 邮箱:tyq0805@gmail.com* bug修复:如果直接返回地图不进行设置,则没有任何数据返回,以至于导致转跳远端控制弹窗不能用。* 这样若不小心触发设置按钮,直接返回的的话,将没有经纬度数据,这里直接赋值为默认地址,以确保数据可用性*/Longitude = longitude;Latitude = latitude;//使用默认的清远地址Toast.makeText(this, "恢复默认家庭地址设置", Toast.LENGTH_LONG).show();}//获取地图控件引用mMapView = (MapView) findViewById(R.id.bmapView);mapType = findViewById(R.id.id_rp_mapType);nombtn = findViewById(R.id.id_normal);sabtn = findViewById(R.id.id_satel);lubtn = findViewById(R.id.id_lukuan);rebtn =findViewById(R.id.id_reli);setButton_Home = findViewById(R.id.id_set_home_location);//设置家庭地址的按钮initEvent();initView();//视图初始化initLocation();//定位初始化mapOnClick();//地图点击}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.bluetooth_map_onenet, menu);return true;}/*** 作者:唐瑛琪* 邮箱:tyq0805@gmail.com* 绑定Options Menu的事件* 功能:用于配合菜单按钮的转跳功能,即重启一个新的活动*/@Overridepublic boolean onOptionsItemSelected(MenuItem item) {int itemid = item.getItemId();// 获取当前点击菜单的资源ID/* 新建一个Intent对象 */Intent intent = new Intent();switch (itemid){case R.id.action_bluetooth_button:/* 指定intent要启动的类 */intent.setClass(MainActivity.this, BlueToothActivity.class);/* 启动一个新的Activity */startActivity(intent);/* 关闭当前的Activity */MainActivity.this.finish();break;case R.id.action_baidu_map:Toast.makeText(this, "你正在此界面", Toast.LENGTH_LONG).show();case R.id.action_onenet_button:/* 指定intent要启动的类 */intent.setClass(MainActivity.this, OneNetActivity.class);/* 启动一个新的Activity */startActivity(intent);/* 关闭当前的Activity */MainActivity.this.finish();break;}return  super.onOptionsItemSelected(item);}/*** 事件处理初始化*/private void initEvent(){mapType.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {//地图类型选择@Overridepublic void onCheckedChanged(RadioGroup radioGroup, int i) {if (i==nombtn.getId()){mMapView.getMap().setMapType(com.baidu.mapapi.map.BaiduMap.MAP_TYPE_NORMAL);//普通地图}else if (i==sabtn.getId()){mMapView.getMap().setMapType(com.baidu.mapapi.map.BaiduMap.MAP_TYPE_SATELLITE);//卫星地图}}});lubtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton compoundButton, boolean b) {mMapView.getMap().setTrafficEnabled(b);//调用路况图}});rebtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton compoundButton, boolean b) {mMapView.getMap().setBaiduHeatMapEnabled(b);//调用热力图}});setButton_Home.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this, SetHomeLocationActivity.class);// 获取EditText中的经度和纬度intent.putExtra("longitude", longitude);intent.putExtra("latitude", latitude);startActivity(intent);}});}private void initView() {// 地图初始化mMapView = (MapView) findViewById(R.id.bmapView);//回到当前定位ibLocation = (ImageButton) findViewById(R.id.ib_location);mMapView.showScaleControl(false);  // 设置比例尺是否可见(true 可见/false不可见)//mMapView.showZoomControls(false);  // 设置缩放控件是否可见(true 可见/false不可见)mMapView.removeViewAt(1);// 删除百度地图LogomBaiduMap = mMapView.getMap();mBaiduMap.setOnMarkerClickListener(new com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener() {//地图的点击事件@Overridepublic boolean onMarkerClick(com.baidu.mapapi.map.Marker marker) {final String info = (String) marker.getExtraInfo().get("info");Toast.makeText(MainActivity.this, info, Toast.LENGTH_SHORT).show();return true;}});}/*** 定位初始化*/public void initLocation() {//添加隐私合规政策com.baidu.location.LocationClient.setAgreePrivacy(true);// 开启定位图层mBaiduMap.setMyLocationEnabled(true);// 定位初始化if (mLocClient == null) {try {mLocClient = new com.baidu.location.LocationClient(this);} catch (Exception e) {e.printStackTrace();}}if (mLocClient != null) {MyLocationListener myListener = new MyLocationListener();mLocClient.registerLocationListener(myListener);com.baidu.location.LocationClientOption option = new com.baidu.location.LocationClientOption();option.setLocationMode(com.baidu.location.LocationClientOption.LocationMode.Hight_Accuracy);// 设置高精度定位option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系,bd09ll  百度经纬度坐标option.setScanSpan(0);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集mLocClient.setLocOption(option);mLocClient.start();//开始定位}}/*** 点切换到其他标点位置时,重置定位显示,点击之后回到自动定位** @param view*/public void resetLocation(View view) {markerLatitude = 0;initLocation();marker.remove();//清除标点}/*** 地图点击事件处理*/public void mapOnClick() {// 设置marker图标bitmap = com.baidu.mapapi.map.BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);mBaiduMap.setOnMapClickListener(new com.baidu.mapapi.map.BaiduMap.OnMapClickListener() {@Overridepublic void onMapPoiClick(com.baidu.mapapi.map.MapPoi mapPoi) {}//此方法就是点击地图监听@Overridepublic void onMapClick(com.baidu.mapapi.model.LatLng latLng) {//获取经纬度markerLatitude = latLng.latitude;markerLongitude = latLng.longitude;//先清除图层mBaiduMap.clear();// 定义Maker坐标点com.baidu.mapapi.model.LatLng point = new com.baidu.mapapi.model.LatLng(markerLatitude, markerLongitude);// 构建MarkerOption,用于在地图上添加Markercom.baidu.mapapi.map.MarkerOptions options = new com.baidu.mapapi.map.MarkerOptions().position(point).icon(bitmap);// 在地图上添加Marker,并显示//mBaiduMap.addOverlay(options);marker = (com.baidu.mapapi.map.Marker) mBaiduMap.addOverlay(options);Bundle bundle = new Bundle();bundle.putSerializable("info", "纬度:" + markerLatitude + "   经度:" + markerLongitude);marker.setExtraInfo(bundle);//将bundle值传入marker中,给baiduMap设置监听时可以得到它/*** 作者:唐瑛琪* 邮箱:tyq0805@gmail.com* 这个是弹窗的提醒,当定位到家附近时,将提醒转跳远端控制OneNetActivity。* 所谓在家附件,就是大概经纬度地址,我的解决方案是设定一个区间,精度在0.1之间,可以大致确定一个区块。* 当然,若读者能够有其他更好的解决方法,可以邮箱私信一起探讨* */if (markerLatitude >= (Latitude-0.01) && markerLongitude >=(Longitude-0.01) && markerLatitude <= (Latitude+0.01) && markerLongitude <=(Longitude+0.01)) {AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).setTitle("转跳远端控制").setMessage("此时已经定位至家的附近,是否转跳远端控制").setIcon(R.mipmap.ic_launcher).setPositiveButton("确定", new DialogInterface.OnClickListener() {//添加"Yes"按钮@Overridepublic void onClick(DialogInterface dialogInterface, int i) {Intent intent_DW = new Intent();//转跳活动/* 指定intent要启动的类 */intent_DW.setClass(MainActivity.this, OneNetActivity.class);/* 启动一个新的Activity */startActivity(intent_DW);/* 关闭当前的Activity */MainActivity.this.finish();}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {//添加取消@Overridepublic void onClick(DialogInterface dialogInterface, int i) {Toast.makeText(MainActivity.this, "好的,收到主人", Toast.LENGTH_SHORT).show();}}).create();alertDialog.show();}//点击地图之后重新定位initLocation();}});}/*** 定位SDK监听函数*/public class MyLocationListener extends com.baidu.location.BDAbstractLocationListener {@Overridepublic void onReceiveLocation(com.baidu.location.BDLocation location){Toast.makeText(MainActivity.this, location.getAddrStr(), Toast.LENGTH_SHORT).show();// MapView 销毁后不在处理新接收的位置if (mMapView == null) {return;}double resultLatitude;double resultLongitude;if (markerLatitude == 0) {//自动定位resultLatitude = location.getLatitude();resultLongitude = location.getLongitude();ibLocation.setVisibility(View.GONE);} else {//标点定位resultLatitude = markerLatitude;resultLongitude = markerLongitude;ibLocation.setVisibility(View.VISIBLE);}com.baidu.mapapi.map.MyLocationData locData = new com.baidu.mapapi.map.MyLocationData.Builder().accuracy(location.getRadius())// 设置定位数据的精度信息,单位:米.direction(location.getDirection()) // 此处设置开发者获取到的方向信息,顺时针0-360.latitude(resultLatitude).longitude(resultLongitude).build();mBaiduMap.setMyLocationData(locData);// 设置定位数据, 只有先允许定位图层后设置数据才会生效com.baidu.mapapi.model.LatLng latLng = new com.baidu.mapapi.model.LatLng(resultLatitude, resultLongitude);com.baidu.mapapi.map.MapStatus.Builder builder = new com.baidu.mapapi.map.MapStatus.Builder();builder.target(latLng).zoom(20.0f);mBaiduMap.animateMapStatus(com.baidu.mapapi.map.MapStatusUpdateFactory.newMapStatus(builder.build()));}}@Overrideprotected void onResume() {super.onResume();//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理mMapView.onResume();}@Overrideprotected void onPause() {super.onPause();//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理mMapView.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();// 退出时销毁定位mLocClient.stop();// 关闭定位图层mBaiduMap.setMyLocationEnabled(false);// 在activity执行onDestroy时必须调用mMapView.onDestroy()mMapView.onDestroy();}}

新增加的设置地址活动——SetHomeLocationActivity代码:

package com.example.lbstest;import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;public class SetHomeLocationActivity extends AppCompatActivity {private EditText etAddress;private EditText etLongitude;private EditText etLatitude;private Button btnClear;//清空当前框内全部数据private Button btnBtnUpData;//点击自动根据地址或经纬度补全信息private Button btnGetLocation;//获取当前地址,并显示在输入框内private Button btnSetHome;//设置完成,返回地图界面private Button btnBtnGoBack;//直接返回地图界面private double mLongitude = 0;private double mLatitude = 0;/*** 该标记位功能说明:默认按下设置完成返回地图按钮后发送回MainActivity活动中* 用于确保设置成功,同时若直接返回,则说明没有进行设置,将0发送回去进行判断*/private int Set_flg = 1;//设置地址是否成功标记位private int Set_false_flg = 0;//并未设置地址,保留原有地址返回地图定位界面private com.baidu.location.LocationClient mLocClient;@SuppressLint("MissingInflatedId")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.set_home_location);etAddress = findViewById(R.id.et_address);//地址etLongitude = findViewById(R.id.et_latitude);//经度etLatitude = findViewById(R.id.et_longitude);//纬度/*** 设置传入的默认的清远地址*/Toast.makeText(this, "此时是默认地址,如需重新设置,可清空数据", Toast.LENGTH_LONG).show();mLongitude = getIntent().getDoubleExtra("longitude", 0.0);mLatitude = getIntent().getDoubleExtra("latitude", 0.0);etLatitude.setText(String.valueOf(mLatitude));etLongitude.setText(String.valueOf(mLongitude));/*** 作者:唐瑛琪* 邮箱:tyq0805@gmail.com* 以下是点击按钮事件的监控操作* 功能:清空、补全、获取、设置并返回、直接返回*/btnClear = findViewById(R.id.btn_set_home_location_clear);btnBtnUpData = findViewById(R.id.btn_set_home_location_upData);btnGetLocation = findViewById(R.id.btn_set_home_location_confirm);btnSetHome = findViewById(R.id.btn_set_home_ok_goBack_diTu);btnBtnGoBack = findViewById(R.id.btn_goBack);btnClear.setOnClickListener(new View.OnClickListener() {//点击按钮清空已输入的数据信息@Overridepublic void onClick(View v) {etAddress.setText("");etLongitude.setText("");etLatitude.setText("");}});btnBtnUpData.setOnClickListener(new View.OnClickListener() {//通过按钮将地址或经纬度补全@Overridepublic void onClick(View v) {String address = etAddress.getText().toString().trim();String latitude = etLatitude.getText().toString().trim();String longitude = etLongitude.getText().toString().trim();if (!TextUtils.isEmpty(address)) {// 使用Geocode API查询经纬度信息// 创建地理编码检索实例com.baidu.mapapi.search.geocode.GeoCoder geoCoder = com.baidu.mapapi.search.geocode.GeoCoder.newInstance();// 设置地理编码检索监听者geoCoder.setOnGetGeoCodeResultListener(new com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener() {@Overridepublic void onGetGeoCodeResult(com.baidu.mapapi.search.geocode.GeoCodeResult result) {if (result == null || result.getLocation() == null)Toast.makeText(SetHomeLocationActivity.this, "未能找到对应的经纬度信息", Toast.LENGTH_SHORT).show();else {etLatitude.setText(String.valueOf(result.getLocation().latitude));etLongitude.setText(String.valueOf(result.getLocation().longitude));}}@Overridepublic void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {// 不需要实现该方法}});// 发起地理编码检索请求geoCoder.geocode(new com.baidu.mapapi.search.geocode.GeoCodeOption().city("").address(address));} else if (!TextUtils.isEmpty(latitude) && !TextUtils.isEmpty(longitude)) {// 使用Reverse Geocode API查询地址信息// 创建反地理编码检索实例com.baidu.mapapi.search.geocode.GeoCoder geoCoder = com.baidu.mapapi.search.geocode.GeoCoder.newInstance();// 设置反地理编码检索监听者geoCoder.setOnGetGeoCodeResultListener(new com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener() {@Overridepublic void onGetGeoCodeResult(com.baidu.mapapi.search.geocode.GeoCodeResult result) {// 不需要实现该方法}@Overridepublic void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {if (result == null || result.getAddress() == null) {Toast.makeText(SetHomeLocationActivity.this, "未能找到对应的地址信息", Toast.LENGTH_SHORT).show();} else {etAddress.setText(result.getAddress());}}});// 发起反地理编码检索请求com.baidu.mapapi.model.LatLng latLng = new com.baidu.mapapi.model.LatLng(Double.parseDouble(latitude), Double.parseDouble(longitude));geoCoder.reverseGeoCode(new com.baidu.mapapi.search.geocode.ReverseGeoCodeOption().location(latLng));}}});btnGetLocation.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 创建百度地图LocationClient实例try {mLocClient = new com.baidu.location.LocationClient(SetHomeLocationActivity.this);} catch (Exception e) {e.printStackTrace();}// 配置定位参数com.baidu.location.LocationClientOption option = new com.baidu.location.LocationClientOption();option.setCoorType("bd09ll");option.setIsNeedAddress(true);mLocClient.setLocOption(option);// 设置定位监听器mLocClient.registerLocationListener(new com.baidu.location.BDAbstractLocationListener() {@Overridepublic void onReceiveLocation(com.baidu.location.BDLocation location) {// 获取详细地址信息String address = location.getAddrStr();etAddress.setText(address);// 获取纬度和经度double latitude = location.getLatitude();double longitude = location.getLongitude();etLatitude.setText(String.valueOf(latitude));etLongitude.setText(String.valueOf(longitude));// 停止定位mLocClient.stop();}});// 启动定位mLocClient.start();}});btnSetHome.setOnClickListener(new View.OnClickListener() {//返回有用信息到MainActivity活动中,即返回经纬度数据@Overridepublic void onClick(View v) {if (checkInput()) {// 设置家庭地址信息并返回地图界面mLongitude = Double.parseDouble(etLongitude.getText().toString());mLatitude = Double.parseDouble(etLatitude.getText().toString());Intent intent = new Intent(SetHomeLocationActivity.this, MainActivity.class);intent.putExtra("Longitude", mLongitude);intent.putExtra("Latitude", mLatitude);intent.putExtra("Set_home_flg",Set_flg);//告诉MainActivity活动已经设置成功startActivity(intent);} else {Toast.makeText(SetHomeLocationActivity.this, "请至少输入家庭地址、经度和纬度中的一项、并补全信息", Toast.LENGTH_SHORT).show();}}});btnBtnGoBack.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(SetHomeLocationActivity.this, MainActivity.class);intent.putExtra("Set_home_flg",Set_false_flg);//告诉MainActivity活动并未设置startActivity(intent);}});}// 检查输入数据是否为空private boolean checkInput() {if (TextUtils.isEmpty(etAddress.getText().toString().trim())&& (TextUtils.isEmpty(etLongitude.getText().toString().trim())||TextUtils.isEmpty(etLatitude.getText().toString().trim()))) {//经纬度要两个都有才能进行设置,属于一个数据return false;}else if((TextUtils.isEmpty(etLatitude.getText().toString().trim()) && TextUtils.isEmpty(etLongitude.getText().toString().trim()))||TextUtils.isEmpty(etLatitude.getText().toString().trim())|| TextUtils.isEmpty(etLongitude.getText().toString().trim())){//经纬度都为空,其中一个为空String address = etAddress.getText().toString().trim();if (!TextUtils.isEmpty(address)) {// 使用Geocode API查询经纬度信息// 创建地理编码检索实例com.baidu.mapapi.search.geocode.GeoCoder geoCoder = com.baidu.mapapi.search.geocode.GeoCoder.newInstance();// 设置地理编码检索监听者geoCoder.setOnGetGeoCodeResultListener(new com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener() {@Overridepublic void onGetGeoCodeResult(com.baidu.mapapi.search.geocode.GeoCodeResult result) {if (result == null || result.getLocation() == null)Toast.makeText(SetHomeLocationActivity.this, "未能找到对应的经纬度信息", Toast.LENGTH_SHORT).show();else {etLatitude.setText(String.valueOf(result.getLocation().latitude));etLongitude.setText(String.valueOf(result.getLocation().longitude));}}@Overridepublic void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {// 不需要实现该方法}});// 发起地理编码检索请求geoCoder.geocode(new com.baidu.mapapi.search.geocode.GeoCodeOption().city("").address(address));}return false;}return true;}@Overrideprotected void onResume() {super.onResume();//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理}@Overrideprotected void onPause() {super.onPause();//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理}@Overrideprotected void onDestroy() {super.onDestroy();// 退出时销毁定位mLocClient.stop();}
}

 然后是新增加活动的layout文件,具体代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/dialog_set_home_location"android:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:id="@+id/tv_set_home_location_title"android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="16dp"android:text="手动输入地址(经纬度)或自动获取当前位置"android:textSize="18sp"android:textStyle="bold" /><EditTextandroid:id="@+id/et_address"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="输入家庭地址名称"android:padding="16dp"android:layout_below="@+id/tv_set_home_location_title"/><EditTextandroid:id="@+id/et_latitude"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="输入家庭地址经度"android:padding="16dp"android:layout_below="@+id/et_address"/><EditTextandroid:id="@+id/et_longitude"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="输入家庭地址纬度"android:padding="16dp"android:layout_below="@+id/et_latitude"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/et_longitude"android:orientation="vertical"><Buttonandroid:id="@+id/btn_set_home_location_clear"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="清空当前输入数据" /><Buttonandroid:id="@+id/btn_set_home_location_upData"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="根据输入地址或经纬度自动补全余下信息" /><Buttonandroid:id="@+id/btn_set_home_location_confirm"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="获取当前位置,并设置为家庭地址" /><Buttonandroid:id="@+id/btn_set_home_ok_goBack_diTu"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="设置完成,返回地图界面" /><Buttonandroid:id="@+id/btn_goBack"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="直接返回地图界面" /></LinearLayout>
</RelativeLayout>

okok,以上就是新增加的功能,具体功能也不介绍了,具体功能实现在代码中以经有很多注释。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

坚鹏:《7家银行科技高管就ChatGPT等AI问题进行一场脑暴》读后感

最近看了一篇报道——《7家银行科技高管&#xff0c;就ChatGPT等AI问题进行了一场脑暴》&#xff0c;收获特别大。作为一名银行数字化转型导师&#xff0c;从银行数字化转型的角度谈谈我的几点感想&#xff1a; 1、ChatGPT未来肯定有可能在银行得到大量地应用。网商银行等银行…

走了!再无百年阿里~

因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享 点击关注#互联网架构师公众号&#xff0c;领取架构师全套资料 都在这里 0、2T架构师学习资料干货分 上一篇&#xff1a;ChatGPT研究框架&#xff08;80页PPT&#xff0c;附下载&#xff09;…

AI已到,普通人的机会在哪里?

“普通人赚到钱很难 但是被骗到钱很容易”。 每当火起来一个行业&#xff08;或者仅是一个概念&#xff09;&#xff0c;都会有人来问&#xff1a; 现在去做点什么&#xff0c;能够踩上风口&#xff1f; 普通人的赚钱机会在哪&#xff1f; 怎么做能够暴富&#xff1f; 让我们先…

ChatGPT火遍全球,程序员的饭碗保不住了?北漂程序员说说心里话

ChatGPT火遍全球&#xff0c;程序员的饭碗保不住了吗&#xff1f;说ChatGPT一夜火遍全球一点也不夸张&#xff0c;本来这玩意是互联网圈里的东西&#xff0c;现在发现好像网上每个人都在聊这个&#xff0c;连续很多天都霸占着热点榜&#xff0c;在股市里只要跟ChatGPT有一星星关…

GPT算法讲解(chatGPT前世)

11期:GPT系列算法与实现&#xff08;chatGPT前世今生之前世&#xff09; ***** 文章正常结构分三部分 ***** ***** 日常感悟***** ***** 股市瞎聊***** ***** 技术分享**** (文末加餐&#xff1a;深度学习的基础系列课程来啦&#xff0c;一步一步走进人工智能&#xff0c;欢迎…

对话ChatGpt…它建议我考研选择财经新闻?

最近不少打工人开始担心ChatGPT会导致自己失业。 甚至有人总结了未来因ChatGPT而失业的十大职业&#xff1a;1. 技术工种&#xff08;程序员、软件工程师、数据分析师&#xff09;2. 媒体工作者&#xff08;广告、内容创作者、记者&#xff09;3. 法律行业工作者&#xff08;律…

机器学习丨AI产品经理应该懂哪些技术(附实战代码)

前言 本期目的&#xff1a;回顾之前敲代码的日常&#xff0c;利用生活场景帮助小白认识机器学习及学习过程中算法原理和评价指标。 适用读者&#xff1a;AI/数据产品经理。 阅读重点&#xff1a;品&#xff0c;细品&#xff0c;结合班级故事再品。 最近看了很多关于机器学习…

【学习笔记】机器学习基础--逻辑回归

系列文章目录 【第一章原理】【学习笔记】机器学习基础--线性回归_一无是处le的博客-CSDN博客 【第一章代码解释】 【线性回归】原生numpy实现波士顿房价预测_一无是处le的博客-CSDN博客 目录 系列文章目录 前言 一、【引入逻辑回归】 二、逻辑回归的介绍 定义与公式 三…

AutoCV第七课:ML基础

目录 ML基础注意事项2023/5/29更新前言1. 复习sqrt函数2. 线性回归预测房价2.1 问题分析2.2 代码实现2.3 总结 3. 逻辑回归分类3.1 问题1分析3.2 问题1代码实现3.3 问题2分析3.4 问题2代码实现3.5 拓展-导数推导3.6 总结 个人总结 ML基础 注意事项 2023/5/29更新 新增逻辑回…

机器学习之回归模型预测性能评估指标(RMSE、MSE、MAE、MAPE、SMAPE、R^2 Score、R^2 )

博主推荐访问chatGPT、急速访问Github必备魔法&#xff1a;SockBoom 或者网址&#xff1a;https://sockboom.shop/auth/register?affid212828 一、机器学习简介 机器学习就是通过大量的数据进行训练&#xff0c;然后得出输入数据的模型特征&#xff1b;再次输入相关的数据…

PyTorch常用的损失函数(ChatGPT)

L1Loss nn.L1Loss 也称为平均绝对误差&#xff08;Mean Absolute Error&#xff0c;MAE&#xff09;。它计算预测值与真实值之间的差异&#xff08;即误差&#xff09;&#xff0c;然后取绝对值并求和&#xff0c;最后除以样本数量得到平均误差。具体来说&#xff0c;对于一批…

ChatGPT vs Google:谁是答案之王?微软揭示未来搜索的样子

已经习惯了网购的你&#xff0c;有没有想过一旦电子商务行业遭受重创&#xff0c;会对我们的日常生活造成什么影响呢&#xff1f; 我们已经习惯了在生活中碰到什么不懂的事情就 Google 一下或者百度一下&#xff0c;甚至许多人的职业都跟 Google 密切相关&#xff0c;比如自媒…

替代MySQL半同步复制,Meta技术团队推出MySQL Raft共识引擎

作者&#xff1a;Anirban Rahut、Abhinav Sharma、Yichen Shen、Ahsanul Haque 原文链接&#xff1a;https://engineering.fb.com/2023/05/16/data-infrastructure/mysql-raft-meta/ 译者&#xff1a;ChatGPT 责编&#xff1a;张红月 MySQL Raft是MySQL数据库中一种基于Raft协议…

AI for Science 的上半场:人工智能如何重新定义科学研究新范式?

AI发展七十余年&#xff0c;每一技术性突破都将给人类未来开辟新一种可能性。而它与科学研究的深度融合&#xff0c;则会裂变出无数或无穷种可能性。 万众瞩目下&#xff0c;今年10月&#xff0c;有着诺贝尔奖“嫡传”之称的诺贝尔化学奖终于揭晓&#xff0c;授予了对“链接化学…

AI for Science的上半场来了!

AI发展七十余年&#xff0c;每一技术性突破都将给人类未来开辟新一种可能性。而它与科学研究的深度融合&#xff0c;则会裂变出无数或无穷种可能性。 万众瞩目下&#xff0c;今年10月&#xff0c;有着诺贝尔奖“嫡传”之称的诺贝尔化学奖终于揭晓&#xff0c;授予了对“链接化学…

ChatGPT: 智能对话时代的未来展望与应用实践

ChatGPT: 智能对话时代的未来展望与应用实践 简介 ChatGPT 是一种基于深度学习和自然语言处理技术的人工智能对话模型。它可以通过生成自然语言文本的方式&#xff0c;与用户进行交互式的对话。作为一种先进的对话生成模型&#xff0c;ChatGPT 在近年来快速发展的人工智能领域中…

德州扑克AI实现 TexasHoldem Poker

参考了一下这篇文献&#xff0c;http://cowboyprogramming.com/2007/01/04/programming-poker-ai/ 自己用go实现了一个德州扑克AI&#xff0c;效果还可以。 正常和它玩耍的时候&#xff0c;互动性还不错。但是也有一点点问题&#xff0c;比如玩家乱来&#xff0c;把把都ALL IN(…

PokerNet-poker recognition: 扑克识别 (6)

文章目录 准备最终结果未来改进 准备 机器: Titan XP 12GB, 64GB RAM, 机器非常强&#xff0c;可靠。 下次有机会购买RTX 2080 Ti 试试 最终结果 错误率可以达到万分之一&#xff0c;非常可考 未来改进 精简模型多模型融合&#xff0c;提升准确度

计算6+德州扑克各个牌型的概率

为了回答该知乎问题(https://www.zhihu.com/question/57408133/answer/152920354)而写就的程序。 6+德州扑克的规则,就是在传统52张牌德州扑克的基础上,去掉了2到5,只留下6到A共计36张牌;另外最小的顺子就成了A6789。此外,牌型大小变成了:同花>葫芦>三条>顺子…

德州扑克术语大全(上篇)

作为一个小白或者新手你还在苦恼别人说的术语完全不明白是什么意思&#xff0c;别人谈论牌谱&#xff0c;你完全在状况外&#xff1f;比人问你一手牌&#xff0c;你总是一脸茫然……这些情况真的好尴尬呀&#xff0c;没有关系&#xff0c;读过本文&#xff0c;让你轻松驾驭牌谱…