行业知识
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包含了许多开发应用程序所需的组件,例如:
- Android操作系统的API(应用程序接口)文档,包括各种库、函数和类,供开发人员调用和使用。
- Android模拟器(emulator):可以在计算机上模拟Android设备,并进行应用程序测试和调试。
- 调试工具:包括adb(Android调试桥)、Logcat等,可以帮助开发人员调试和诊断应用程序。
- 样例代码和示例应用程序:提供给开发人员参考和学习。
使用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
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文件中,设置相关按钮(就是普通/卫星地图那些玩意的选择)
代码如下:
5、开启权限(定位权限,网络权限等)
具体开启权限的代码如下(注意这里的开启的权限,一部分与地图定位的无关,这是因为开发的功能不仅仅局限于地图定位,懂?):
okok,通过上述五步,地图定位的配置工作已经告一段落了,接下来就是枯燥的代码环节,我将贴粗关键代码,仅供学习!说明:代码实际是借鉴一位大佬的,具体是谁,忘记了,我只是进行了一些简单的修改,而且改的很烂,反正你也打不到我,别在评论区骂我就行!
4、代码(地图定位)
关于该功能实现的layout文件和权限配置这两个,我已经把代码贴出来了,往上找!
1、AndroidManifest.xml文件
首先需要声明,有些代码是不需要的,如下图的几个红色的框框,表示的是将要运行的Java活动程序,而该功能只需要执行MapApp、MainActivity两个Java活动程序。
我已经将不会用到的代码删除,具体如下:
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 { @Override public void onCreate() { super.onCreate(); //动态申请 SDKInitializer.setAgreePrivacy(this,true); //在使用SDK各组件之前初始化context信息,传入ApplicationContext SDKInitializer.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"}) @Override protected 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();//地图点击 } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.bluetooth_map_onenet, menu); return true; } /** * 绑定Options Menu的事件 */ @Override public 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() {//地图类型选择 @Override public 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() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { mMapView.getMap().setTrafficEnabled(b);//调用路况图 } }); rebtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public 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);// 删除百度地图Logo mBaiduMap = mMapView.getMap(); mBaiduMap.setOnMarkerClickListener(new com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener() {//地图的点击事件 @Override public 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() { @Override public void onMapPoiClick(com.baidu.mapapi.map.MapPoi mapPoi) { } //此方法就是点击地图监听 @Override public 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,用于在地图上添加Marker com.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 =(Longitude-0.01) && markerLatitude
下一篇:稳定的服务器英语怎么写?