彻底解决Android GPS没法定位这一顽固问题
大家去网上搜索Android定位location为null没法定位问题。预计有一大堆文章介绍怎样来解决。可是最后大家发现基本没用。
本文将从Android定位实现原理来深入分析没法定位原因并提出真正的解决方式。
在分析之前,我们肯定得先看看android官方提供的定位SDK。
默认Android GPS定位实例
获取LocationManager:
mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
选择Location Provider:
Android系统存在多种provider,各自是
GPS_PROVIDER:
这个就是手机里有GPS芯片,然后利用该芯片就能利用卫星获得自己的位置信息。可是在室内,GPS定位基本没用,非常难定位的到。
NETWORK_PROVIDER:
这个就是利用网络定位,一般是利用手机基站和WIFI节点的地址来大致定位位置,
这样的定位方式取决于server,即取决于将基站或WIF节点信息翻译成位置信息的server的能力。因为眼下大部分Android手机没有安装google官方的location manager库。大陆网络也不同意。即没有server来做这个事情,自然该方法基本上没法实现定位。
PASSIVE_PROVIDER:
被动定位方式。这个意思也比較明显。就是用现成的,当其它应用使用定位更新了定位信息。系统会保存下来。该应用接收到消息后直接读取就能够了。比方假设系统中已经安装了百度地图,高德地图(室内能够实现精确定位)。你仅仅要使用它们定位过后。再使用这样的方法在你的程序肯定是能够拿到比較精确的定位信息。
用户能够直接指定某一个provider
String provider = mLocationManager.getProvider(LocationManager.GPS_PROVIDER);
也能够提供配置,由系统依据用户的配置为用户选择一个最接近用户需求的provider
Criteria crite = new Criteria();
crite.setAccuracy(Crite.ACCURACY_FINE); //精度
crite.setPowerRequirement(Crite.POWER_LOW); //功耗类型选择
String provider = mLocationManager.getBestProvider(crite, true);
获取Location
Location location = mLocationManager.getLocation(provider);
然后你会发现,这个返回的location永远为null,你自然没法定位。然后网上到处是咨询为啥获得的location为null,相同网络到处是解决问题的所谓解决方式。
所谓解决方式
网上有人说。一開始location是非常有可能是null的,这是由于程序还从来没有请求 过,仅仅需又一次请求更新location,并注冊监听器以接收更新后的location信息。
LocationListener locationListener = new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onLocationChanged(Location location) {
longitude = location.getLongitude();
latitude = location.getLatitude();
Log.d(TAG,"Location longitude:"+ longitude +" latitude: "+ latitude );
}
};
mLocationManager.requestLocationUpdates(serviceProvider, 10000, 1, this);
然后你发现onLocationChanged永远不会被调用,你仍然没法获取定位信息。
为什么就没法获取到location呢?
事实上在上面我已经提到了,全部上面的解决的方案都没有解决根本问题,那就是当你在室内开发时。你的手机根本就没法获取位置信息,你叫系统怎样将位置信息通知给你的程序。
所以要从根本上解决问题,就要解决位置信息获取问题。刚刚也提到了,仅仅有NETWORK_PROVIDER这样的模式才是室内定位可靠的方式,仅仅只是因为大陆的怪怪网络,且大部分厂商也不会用google的服务,这样的定位方式默认是没法用的。那怎么办?好办,找个替代的服务商就能够了,百度的位置信息sdk就能够解决问题。
它的基本原理在上面已经提到过了,就是搜集你的wifi节点信息和你的手机基站信息来定位。
真正的解决方式,使用百度位置定位SDK
SDK下载:
http://pan.baidu.com/s/1i3xGMih
当然大家能够在官网下载,这样能够下载到最新的sdk
http://lbsyun.baidu.com/sdk/download
SDK使用:
1. 申请百度的服务密钥。详细操作步骤见官网:
2.将上面下载的sdk文件locSDK_4.1.jar复制到你项目的libs下
3. 改动AndroidManifest文件,在该文件中加入例如以下配置
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="xxxxx " />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
上面meta-data中value的值改为你自己的密钥
代码里调用sdk:
public class LocationUtil {
private final static boolean DEBUG = true;
private final static String TAG = "LocationUtil";
private static LocationUtil mInstance;
private BDLocation mLocation = null;
private MLocation mBaseLocation = new MLocation();
public static LocationUtil getInstance(Context context) {
if (mInstance == null) {
mInstance = new LocationUtil(context);
}
return mInstance;
}
Context mContext;
String mProvider;
public BDLocationListener myListener = new MyLocationListener();
private LocationClient mLocationClient;
public LocationUtil(Context context) {
mLocationClient = new LocationClient(context.getApplicationContext());
initParams();
mLocationClient.registerLocationListener(myListener);
}
public void startMonitor() {
if (DEBUG) Log.d(TAG, "start monitor location");
if (!mLocationClient.isStarted()) {
mLocationClient.start();
}
if (mLocationClient != null && mLocationClient.isStarted()) {
mLocationClient.requestLocation();
} else {
Log.d("LocSDK3", "locClient is null or not started");
}
}
public void stopMonitor() {
if (DEBUG) Log.d(TAG, "stop monitor location");
if (mLocationClient != null && mLocationClient.isStarted()) {
mLocationClient.stop();
}
}
public BDLocation getLocation() {
if (DEBUG) Log.d(TAG, "get location");
return mLocation;
}
public MLocation getBaseLocation() {
if (DEBUG) Log.d(TAG, "get location");
return mBaseLocation;
}
private void initParams() {
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);
//option.setPriority(LocationClientOption.NetWorkFirst);
option.setAddrType("all");//返回的定位结果包括地址信息
option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms
option.disableCache(true);//禁止启用缓存定位
option.setPoiNumber(5); //最多返回POI个数
option.setPoiDistance(1000); //poi查询距离
option.setPoiExtraInfo(true); //是否须要POI的电话和地址等具体信息
mLocationClient.setLocOption(option);
}
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null) {
return ;
}
mLocation = location;
mBaseLocation.latitude = mLocation.getLatitude();
mBaseLocation.longitude = mLocation.getLongitude();
StringBuffer sb = new StringBuffer(256);
sb.append("time : ");
sb.append(location.getTime());
sb.append("\nerror code : ");
sb.append(location.getLocType());
sb.append("\nlatitude : ");
sb.append(location.getLatitude());
sb.append("\nlontitude : ");
sb.append(location.getLongitude());
sb.append("\nradius : ");
sb.append(location.getRadius());
sb.append("\ncity : ");
sb.append(location.getCity());
if (location.getLocType() == BDLocation.TypeGpsLocation){
sb.append("\nspeed : ");
sb.append(location.getSpeed());
sb.append("\nsatellite : ");
sb.append(location.getSatelliteNumber());
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation){
sb.append("\naddr : ");
sb.append(location.getAddrStr());
}
if (DEBUG) Log.d(TAG, "" + sb);
}
public void onReceivePoi(BDLocation poiLocation) {
}
}
public class MLocation {
public double latitude;
public double longitude;
}
}
当然别忘了在setting里将gps定位打开
/********************************
* 本文来自博客 “爱踢门”
* 转载请标明出处:http://blog.csdn.net/itleaks
******************************************/
彻底解决Android GPS没法定位这一顽固问题的更多相关文章
- Android GPS定位测试(附效果图)
今天因为工作需要,把以前编写的一个GPS测试程序拿出来重新修改了一下.这个程序说起来有些历史了,是我11年编写的,那时候学了Android开发没多久,算是一个实验性的作品.现在工作需要,重新拿出来修整 ...
- Android GPS定位测试(附效果图)
今天因为工作需要,把以前编写的一个GPS测试程序拿出来重新修改了一下.这个程序说起来有些历史了,是我11年编写的,那时候学了Android开发没多久,算是一个实验性的作品.现在工作需要,重新拿出来修整 ...
- Android定位(是否使用GPS进行定位)
TencentLocationRequest request = TencentLocationRequest.create(); request.setRequestLevel(TencentLoc ...
- Android之实现定位
基于android的定位无非就两种:network.gps.两者各有优劣. Network:定位快,准确度低,受环境影响小. GPS:定位慢,准确度高,受环境影响大. 本文要解决的问题: 1. ...
- Android GPS应用开发
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5715879.html GPS定位系统由三部分组成,即由GPS卫星组成的空间部分,若干地面组成的控制部分和普通 ...
- 解决Android SDK Manager更新、下载速度慢
hosts文件里面原来的内容不做修改,只是添加内容 方法/步骤 先看看如何加快更新速度,再说如何更新. 首先更新host文件,如图,打开目录 C:\Windows\System32\drivers\e ...
- android 三种定位方式
http://www.cnblogs.com/oudi/archive/2012/03/22/2411509.html 最近在看android关于定位的方式,查了很多资料,也做了相关实验,在手机上做了 ...
- Android GPS应用:动态获取位置信息
在上文中,介绍了GPS概念及Android开发GPS应用涉及到的常用类和方法.在本文中,开发一个小应用,实时获取定位信息,包括用户所在的纬度.经度.高度.方向.移动速度等.代码如下: Activity ...
- android gps开发必备资料(含测试demo下载)
入门资料参考: How accurate is Android GPS? Part 1: Understanding Location Data How accurate is Android GPS ...
随机推荐
- .Net-ASP.NET Web API:目录
ylbtech-.Net-ASP.NET Web API:目录 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 0. https://www.asp.net/we ...
- python3用list实现栈
工作中遇到的需求,****代表标签数据别的信息: D01 ******** 1 ******** D01 ******** 2 ******** D01 ******** 3 ******** D01 ...
- 如何让 vue 在 sublime 中变成彩色的
在 sublime 中编辑 vue 时,导入后是纯白色的文本,如下图: 想让其变成彩色的文本,需要安装插件,步骤如下: 1. 按住:Ctrl + Alt + P 2. 输入:install Packa ...
- cocos creator制作微信小游戏
2019-05-30 22:11:47 基础: javaScript基础 https://www.bilibili.com/video/av34087791?from=search&sei ...
- [转]RDLC报表——动态添加列
本文转自:http://www.cnblogs.com/pszw/archive/2012/07/19/2599937.html 前言 最近接到一个需求:在给定的数据源中,某(些)列,可能需要单独统计 ...
- Ionic学习记录(一):ionic及cordova安装、创建第一个应用、项目结构
目录: 一.ionic的安装 二.创建第一个应用程序 三.浏览器中预览应用 四.项目结构 五.添加页面 一.ionic的安装 使用Ionic创建和开发应用程序主要通过Ionic命令行实用程序(“CLI ...
- QQ 临时会话+图标 HTML代码
啦啦啦 QQ会话的HTML代码 <a target="_blank" href="http://wpa.qq.com/msgrd?v=3& uin=2553 ...
- bug,实现类未找到service
- 团队作业-Beta版本发布
这个作业属于哪个课程 <课程的链接> 这个作业要求在哪里 <作业要求的链接> 团队名称 Three cobblers 这个作业的目标 Beta版本发布报 ...
- Leetcode0037--Sudoku Solver 数独游戏
[转载请注明]http://www.cnblogs.com/igoslly/p/8719622.html 来看一下题目: Write a program to solve a Sudoku puzzl ...