Android定位实现
目录
一、实验目的
二、实验步骤
1.在百度地图开放平台上创建应用
2.下载百度定位SDK
3.配置开发环境
4.代码部分
三、实验结果
四、实验小结
一、实验目的
在android studio上利用百度提供的定位SDK实现定位,显示信息包括经纬度以及具体地址。
二、实验步骤
1.在百度地图开放平台上创建应用
其中SHA1码和PackageName请前往百度地图官网查看教程,里面讲的很详细
创建完后得到一个AK密钥,为后面开发做准备
2.下载百度定位SDK
注意下载JAR包而不是AAR包
3.配置开发环境
解压后将libs中的jar和so放置到工程中相应的位置
配置build.gradle文件,注意设置sourceSets。
然后右键libs目录下的jar包,选择add as librarys添加为库
至此,build.gradle文件就配置完成。
添加AK
Android定位SDK自v4.0版本起,需要进行AK鉴权。开发者在使用SDK前,需完成AK申请,并在AndroidManifest.xml文件中,正确填写AK。以下代码中AK替换成前面获取到的AK码
在Application标签中增加如下代码:
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="AK" >
</meta-data>
添加定位权限
使用定位SDK,需在AndroidManifest.xml文件中Application标签中声明service组件,每个App拥有自己单独的定位service,代码如下:
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service>
除添加service组件外,使用定位SDK还需添加如下权限:
<!-- 这个权限用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission><!-- 这个权限用于访问GPS定位--><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission><!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission><!-- 获取运营商信息,用于支持提供运营商信息相关的接口--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission><!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission><!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><!-- 访问网络,网络定位需要上网--><uses-permission android:name="android.permission.INTERNET"></uses-permission>
以上就是环境配置的全部内容
4.代码部分
布局文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><!--百度地图控件--><com.baidu.mapapi.map.MapViewandroid:id="@+id/bmapView"android:layout_width="fill_parent"android:layout_height="fill_parent"android:clickable="true" /><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:background="#e0000000"android:orientation="vertical" ><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="12dp"android:layout_marginTop="20dp"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="纬度:"android:textColor="#ffffff"android:textSize="15dp" /><TextViewandroid:id="@+id/tv_Lat"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text=""android:textColor="#ffffff"android:textSize="15dp" /></LinearLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="12dp"android:layout_marginTop="20dp"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="经度:"android:textColor="#ffffff"android:textSize="15dp" /><TextViewandroid:id="@+id/tv_Lon"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text=""android:textColor="#ffffff"android:textSize="15dp" /></LinearLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="12dp"android:layout_marginTop="20dp"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="地址:"android:textColor="#ffffff"android:textSize="15dp" /><TextViewandroid: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>
MainActivity.java:具体功能见代码段注释
package com.example.mylocal;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.pm.PackageManager;
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.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
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; //地址@Overrideprotected 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();}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permission,@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);option.setCoorType("bd0911");//保存定位参数mLocationClient.setLocOption(option);}private class MyLocationListener implements BDLocationListener {@Overridepublic 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.TypeNetWorkException) {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;}}@Overrideprotected void onResume() {super.onResume();//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理mapView.onResume();}@Overrideprotected void onPause() {super.onPause();//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理mapView.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理mLocationClient.stop();mapView.onDestroy();}
}
三、实验结果
从上到下依次显示纬度、经度以及地址
四、实验小结
总体来说没有太大难度,但有较多需要注意的地方。首先就是新版本的gradle不支持compile语句而采用implementation代替,若采用compile会报错
然后就是在虚拟机上运行时会出现定位到几内亚湾或者美国的某个地方的问题,这个问题我查了一下好像是虚拟机的问题,所以需要将app安装到真机上运行才能正常定位。
代码仓库地址
Android定位实现相关推荐
- android 定位的几种方式介绍
[地理位置] android 定位的几种方式介绍 开发中对于地图及地理位置的定位是我们经常要用地,地图功能的使用使得我们应用功能更加完善,下面 www.androidkaifa.com 总结了一下网络 ...
- android 定位服务 耗电吗,关于Android的定位服务
今天因为工作须要,把以前编写的一个GPS测试法度榜样拿出来从新修改了一下.这个法度榜样说起来竽暌剐些汗青了,是我11年编写的,那时刻学了Android开辟没多久,算是一个实验性的作品.如今工作须要,从 ...
- 定位 android8.1.0,8.1.2 实现Android定位(2)
8.1.2 实现Android定位(2) (3)实现定位管理器 可以使用Context.getSystemService()方法实现定位管理器功能,并传入Context.LOCATION_ SERV ...
- android 定位 广播,android - 如何触发广播接收器在GPS开启/关闭? - SO中文参考 - www.soinside.com...
如何触发广播接收器在GPS开启/关闭? 问题描述 投票:35回答:5 public class BootReceiver extends BroadcastReceiver { @Override p ...
- 利用百度地图Android定位SDK获取经纬度
环境的搭建(参考上一次的文章) 百度地图Android定位SDK的使用 2.在Android studio里设计程序来获取经纬度 界面布局activity_main.xml文件的源代码: <?x ...
- 基于百度地图实现Android定位功能实现(详解+教程)
基于百度地图实现Android定位功能实现(详解+教程) 1.初始化 (一)获取到SHA1 (1)找到View中的Tool Windows并打开Terminal (2)找到你的jdk的bin目录,小编 ...
- Android定位功能(二)
在前文Android定位功能(一)中,已经大致介绍了一下在Android平台中,和定位功能相关的类,并举例获取了位置信息.但是前文是基于Criteria定制了一个标准,通过getBestProvide ...
- 七、Android定位与拨打电话、发送短信
Android定位与拨打电话.发送短信 前言 项目目录 1.定位 (1)代码LocationActivity.activity_location (2)权限 2.拨打电话.发送短信 3.MainAct ...
- Android定位方式和测试方法,定位方式(d16)
一,回顾, ①selector和xpath的区别,selector是解析的html,xpth是解析的xml,所以使用selector比使用xpath快, ②定位元素的单数和复数,当使用单数定位不到元素 ...
- android定位:获取当前位置的经纬度
Android定位主要使用的是基于位置服务(Location Based Service)技术,有了 Android 系统作为载体,我们可以利用定位出的位置进行许多丰富多彩的操作,比如定位城市,根据我 ...
最新文章
- 为什么要重写hashcode()方法
- iOS开发 Xcode8中遇到的问题及改动
- SASS简介及使用方法
- CCIE-LAB-第二篇-端口聚合LACP+RSTP
- ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
- Web项目:解决eclipse中jsp文件报错javax.servlet.http.HttpServlet 提示 was not found on the Java Build Path的错误
- 干掉项目中杂乱的 if-else,试试状态模式,这才是优雅的实现方式!
- 桌面无法显示计算机,win10 桌面计算机无法显示
- Python3 安装RobotFramework
- Android源码下载编译(TI)
- Emacs,最强编辑器,没有之一
- Power BI前置知识+ 一张报表制作的流程
- Xmind进阶教程:配色指南
- JavaWeb项目(登录注册页面)全过程详细总结
- vue项目中,js根据文件名后缀,判断文件图片、视频、文档、pdf等类型的方法
- oj苹果和虫子c语言,用C++实现苹果和虫子问题
- 【情人节特别篇】想知道玫瑰在哪些城市最畅销嘛?
- 通九省,枢纽之地...
- 解密回声消除技术之二(应用篇)
- Unity学习笔记-I2 localization