百度地图API:使用百度定位
准备工作:
1.申请百度地图API
2.下载百度地图的SDK
3.将SDK包中的BaiduLBS_Android.jar文件放到,项目里的app/libs里面
4.在src/main目录下创建一个名为jniLibs的目录,然后将SDK包中的其他所有目录放在里面。
5.同步一下项目。
首先修改布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"> <TextView
android:id="@+id/position_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
用一个TextView控件用于显示经纬度。
然后修改AndroidManifest.xml文件,代码如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="co.example.leo.lbstest"> <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.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/> <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">
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="N5yXI1cjwQXw631GaapHpD5Fdv43t8KW"/>
<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.baidu.location.f"
android:exported="true"
android:process=":remote">
</service> </application> </manifest>
里面添加了很多的权限,每一个都是百度LBS SDK内部要用到的, 然后在<application>标签内部添加了一个<meta -data>标签。
这个标签的androi:name部分是固定的,必须填写com.baidu.lbsapi.API_KEY
android:value部分填入申请的APIKey。
最后还要对LBS SDK中的服务进行注册。
最后修改MainActivity中的代码。
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import android.widget.Toast; import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient; import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity { public LocationClient mLocationClient;
private TextView positionText; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//创建一个LocationClient的实例,接受的context通过getApplicationContext()方法获取。
mLocationClient = new LocationClient(getApplicationContext());
//调用LocationClient的registerLocationListener()方法来注册一个监听器 当获取到位置信息的时候,就会回调这个定位监听器
mLocationClient.registerLocationListener(new MyLocationListener());
setContentView(R.layout.activity_main); positionText = (TextView)findViewById(R.id.position_text_view);
/*
* 之前在AndroidManifest.xml内声明了很多权限。
* 其中有4个是危险权限。不过ACCESS_COARSE_LOCATION 和 ACCESS_FINE_LOCATION都属于一个权限组,所以两者只需要申请其中一个就可以了。
* 如何在运行时一次申请三个权限呢?
* 首先创建一个空的List集合,然后依次判断这三个权限有没有被授权,如果没有授权就添加到List集合中,最后将List集合转化成数组,在调用ActivityCompat.requestPermissions()方法就可以一次性申请。
*/
List<String> permissionList = new ArrayList<>();
if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if(ContextCompat.checkSelfPermission(this,Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if(ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if(! permissionList.isEmpty()){
String[] permissions = permissionList.toArray(new String[permissionList.size()]);
ActivityCompat.requestPermissions(this,permissions,);
}else{
requestLocation();
}
} private void requestLocation(){
//调用start方法会回调到我们注册的监听器上面
mLocationClient.start();
} @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case :
if(grantResults.length > ){
//将每个申请的权限都进行判断 如果存在一个没有被授权,那么就调用finish()方法关闭程序。
for(int result : grantResults){
if(result != PackageManager.PERMISSION_GRANTED){
Toast.makeText(MainActivity.this,"必须同意所有权限才能使用本程序",Toast.LENGTH_SHORT).show();
finish();
return ;
}
}
//所有权限都已经授权,那么直接调用requestLocation()方法开始定位。
requestLocation();
}else{
Toast.makeText(MainActivity.this,"发生未知错误", Toast.LENGTH_SHORT).show();
finish();
}
break;
default: break;
}
} public class MyLocationListener implements BDLocationListener{
@Override
public void onReceiveLocation(final BDLocation location) {
runOnUiThread(new Runnable() {
@Override
public void run() {
StringBuilder currentPosition = new StringBuilder();
//通过BDLocation的getLatitude()方法获取当前位置的纬度
currentPosition.append("纬度").append(location.getLatitude()).append("\n");
//通过BDLocation的getLongitude()方法获取当前位置的经度。
currentPosition.append("经线").append(location.getLongitude()).append("\n");
//getLocType()方法获取当前的定位方式。
if(location.getLocType() == BDLocation.TypeGpsLocation){
currentPosition.append("GPS");
}else if(location.getLocType() == BDLocation.TypeNetWorkLocation){
currentPosition.append("网络");
}
positionText.setText(currentPosition);
}
});
} @Override
public void onConnectHotSpotMessage(String s, int i) { }
}
}
默认情况下,调用Location的start()方法只会定位一次。
如果想要实时更新当前的位置怎么办呢?
修改MainActivity中的代码
private void requestLocation(){
//调用start方法会回调到我们注册的监听器上面
initLocation();
mLocationClient.start();
}
这里在requestLocation()方法内增加了一个initLocation()方法
private void initLocation(){
LocationClientOption option = new LocationClientOption();
option.setScanSpan();
mLocationClient.setLocOption(option);
}
在initLocation()方法中创建了一个LocationClientOption对象,然后调用它的setScanSpan()方法来设置更新的间隔。单位为毫秒。
最后记得,在活动销毁的时候要调用LocationClient的Stop()方法来停止定位。
@Override
protected void onDestroy(){
super.onDestroy();
mLocationClient.stop();
}
选择定位模式
定位模式有三种:
高精确度:允许使用GPS,无线网络,蓝牙或者移动网络来进行定位。
节电:仅允许使用WLAN,蓝牙或移动网络确定位置。
仅限设备:仅限GPS来进行定位。
也就是说,如果要想使用GPS定位功能,那么必须要选择高精确度模式,或者是仅限设备模式。
我们可以在之前的initLocation()方法中对百度LBS SDK的定位模式进行指定。
一共有三种模式可选:High_Accuracy,Battery_Saving,和Device_Sensors。
Hight_Accuracy表示高精确度模式,会在GPS信号正常的情况下优先使用GPS定位。
Device_Sensors表示传感器模式,只会用GPS进行定位。
High_Accuracy是默认的模式。
修改initLocation()中的代码
private void initLocation(){
LocationClientOption option = new LocationClientOption();
option.setScanSpan();
option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);
mLocationClient.setLocOption(option);
}
这里调用了setLocationMode()方法将定位模式指定成传感器模式,也就是说只能用GPS进行定位。
看的懂的位置信息
我们可以通过一些简单的接口调用就能得到当前位置各种丰富的地址信息。
修改MainActivity中的initLocation()方法
private void initLocation(){
LocationClientOption option = new LocationClientOption();
option.setScanSpan(5000);
option.setIsNeedAddress(true);
mLocationClient.setLocOption(option);
}
这里调用了LocationClientOption的setIsNeedAddress()方法,并传入了true。这就表示我们需要获取当前位置的详细的地址信息。
然后修改MainActivity中的MyLocationListener
public class MyLocationListener implements BDLocationListener{
@Override
public void onReceiveLocation(final BDLocation location) {
runOnUiThread(new Runnable() {
@Override
public void run() {
StringBuilder currentPosition = new StringBuilder();
//通过BDLocation的getLatitude()方法获取当前位置的纬度
currentPosition.append("纬度").append(location.getLatitude()).append("\n");
//通过BDLocation的getLongitude()方法获取当前位置的经度。
currentPosition.append("经线").append(location.getLongitude()).append("\n");
currentPosition.append("国家").append(location.getCountry()).append("\n");
currentPosition.append("省").append(location.getProvince()).append("\n");
currentPosition.append("市").append(location.getCity()).append("\n");
currentPosition.append("区").append(location.getDistrict()).append("\n");
currentPosition.append("街道").append(location.getStreet()).append("\n");
//getLocType()方法获取当前的定位方式。
if(location.getLocType() == BDLocation.TypeGpsLocation){
currentPosition.append("GPS");
}else if(location.getLocType() == BDLocation.TypeNetWorkLocation){
currentPosition.append("网络");
}
positionText.setText(currentPosition);
}
});
}
getCounty()获取当前所在国家
getProvince()获取当前所在省 以此类推。 需要我们注意的是获取地址信息一定需要用到网络,因此即使我们将定位模式指定成了Device Sensors,也会自动开启网络定位功能。
让“我”显示在地图上
百度LBS SDK当中提供了一个MyLocatioData.Builder类,这个类是用来封装设备当前所在位置的。只需要将经纬度信息传入到这个类的相应方法中就可以了。如下所示:
MyLocationData.Builder locationBuilder = new MyLocationData.Builder();
locationBuilder.latitude(39.315);
locationBuilder.longitude(116.404);
MyLocationData.Builder类中还提供了一个builde()方法,当我们把要封装的信息都设置完成之后,只需要调用它的build()方法。就会生成一个MyLocationData的实例。
然后将这个实例传入到BaiduMap的setMyLocationData()方法中,就可以让设备当前的位置显示在地图上了。
百度地图API:使用百度定位的更多相关文章
- 如何利用【百度地图API】进行定位?非GPS定位
原文:如何利用[百度地图API]进行定位?非GPS定位 如果你可以上网,如果你有火狐浏览器,那么恭喜你.你能很容易使用以下代码进行定位! ------------------------------- ...
- HTML5调用百度地图API进行地理定位实例
自从HTML5的标准确定以后,越来越多的网站使用HTML5来进行开发.虽然对HTML5支持的浏览器不是很多,但是依然抵挡不了大伙对HTML5开发的热情.今天为大家带来的是使用HTML5调用百度地图AP ...
- 【百度地图API】百度API卫星图使用方法和卫星图对比工具
原文:[百度地图API]百度API卫星图使用方法和卫星图对比工具 百度地图API推出卫星图接口也有一个月啦~ 本文除了介绍如何使用百度地图API来操作卫星图外,还顺带制作了个卫星图对比工具. 一.百度 ...
- 百度地图API的IP定位城市和浏览器定位(转)
百度地图API提供了Geolocation 和 LocalCity两个服务类. 这俩API可以分别供用户在JavaScript中进行定位和城市确认. 1 本质上,Geolocation这个类是使用了支 ...
- php用百度地图API进行IP定位和GPS定位
<?php /** * 根据地理坐标获取国家.省份.城市,及周边数据类(利用百度Geocoding API实现) * 百度密钥获取方法:http://lbsyun.baidu.com/apico ...
- 通过百度地图API将百度坐标转换成GPS经纬度
百度地图API链接:http://developer.baidu.com/map/index.php?title=webapi/guide/changeposition 百度地图API中,有GPS坐标 ...
- 【Android接百度地图API】百度地图Demo点击按钮闪退
运行百度地图自带的BaiduMap_AndroidSDK_v4.1.0_Sample里面的BaiduMapsApiASDemo发现点击上面的按钮会闪退,控制台报的是xml的问题 查了一下,官方文档特别 ...
- JS通过百度地图API获取当前定位信息
$(function(){ var latlon=null; //ajax获取用户所在经纬度 $.ajax({ url:"http://api.map.baidu.com/location/ ...
- 利用百度地图api实现定位
使用百度地图api前需要先获取一个百度地图开放平台的访问应用AK, 获取百度地图开放平台访问应用AK方式:注册百度账号-->申请百度开发者-->获取密匙-->使用相关功能. 注册账号 ...
- 百度地图API开发指南
简介什么是百度地图API? 百度地图API是一套由JavaScript语言编写的应用程序接口,它能够帮助您在网站中构建功能丰富.交互性强的地图应用.百度地图API包含了构建地图基本功能的各种接口,提供 ...
随机推荐
- TextBox换行C#文本框换行.net文本框换行textarea换行
在TextBox中输入的内容,显示的时候如果用lable显示,无法换行 可以使用TextBox输入,然后也使用TextBox 显示,这样换行输入的内容,显示的时候也可以换行.显示的时候可以设置一下控件 ...
- Android之布局LinearLayout
1.weight属性用法 主要用于view对象屏幕适配比例 如下图,左边是等比例,右边是1:2比例 实现代码: <LinearLayout xmlns:android="http:// ...
- crontab不执行service命令
我这里的需求是每30分钟重启一次 写成下面的格式就可以正确执行了,后面执行的命令写绝对路径 */30 * * * * /usr/bin/supervisorctl restart all
- Cobbler_自动装系统
Cobbler —自动装系统的操作步骤 Cobbler是一款自动化操作系统安装的实现,与PXE安装系统的区别就是可以同时部署多个版本的系统,而PXE只能选择一种系统. Cobbler 的安装 # 在一 ...
- Python_运维中常用的20个库和模块
1.psutil是一个跨平台库(https://github.com/giampaolo/psutil)能够实现获取系统运行的进程和系统利用率(内存,CPU,磁盘,网络等),主要用于系统监控,分析和系 ...
- JavaScript之Date常用知识点
1.new Date(dateStr) :把字符串转换为Date对象 参数: ①dateStr {string} :可转换为Date对象的字符串(可省略时间):字符串的格式主要有两种: 1) yyyy ...
- ZOJ-1610 Count the Colors(线段树染色,求染色段)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1610 https://vjudge.net/contest/318019# ...
- 吴裕雄--天生自然python机器学习:朴素贝叶斯算法
分类器有时会产生错误结果,这时可以要求分类器给出一个最优的类别猜测结果,同 时给出这个猜测的概率估计值. 概率论是许多机器学习算法的基础 在计算 特征值取某个值的概率时涉及了一些概率知识,在那里我们先 ...
- VS工程的相对路径写法
最近搭建一个VS工程的框架,为了让所有人都能直接使用,要使用相对路径,下面的几种常见路径的写法: 1.两个点“..\”表示在工程文件(*.vcxproj)的上一级目录. 2.一个点“.\”则表示和工程 ...
- C++ 中类的内存布局
在许多笔试面试中都会涉及到sizeof 运算符的求值问题. 这类问题主要分四类: 基本数据类型,如int,bool,fload,long,long,int * 等,这一类比较简单,但要注意x86和x6 ...