Android打开GPS导航并获取位置信息返回null解决方案

最近在做一个 Android 项目,需要用到GPS获取位置信息,从 API 查了一下,发现获取位置信息仅需极其简单的一句即可:
复制代码 代码如下:
getLastKnownLocation(LocationManager.GPS_PROVIDER),

于是高兴地不得了。可是一写进代码里,返回值(Location 类型)居然一直为null..郁闷的不得了。在网上查了好久,发现好多人都和我一样纠结于这个问题上,有人说是因为GPS没打开,也有人说是相关权限没加上..可是我的明明已经在设置里打开,权限自然也加上了。在api上纠结了半天,终于找出原因了,原来要打开GPS其实在于这句:
 复制代码 代码如下: 
setTestProviderEnabled("gps",true);

而跟手机上的设置没多大关系(起码在我的手机上测是这样的)。手机上的设置关闭了,这一句照样能打开;而即使手机设置打开了,没这一句也是白搭。与这句对应的是
 复制代码 代码如下: 
setTestProviderEnabled("gps",false);

用来关闭GPS.
GPS打开后可以用上面的方法获取Location了吗?还是不可以!确切地说是有时候可以,因为这个函数获取的是上次已经获得的位置信息,设想如果此程序第一次跑,先前并没有获取过位置信息,当然返回值为null了。经仔细查看api,在
复制代码 代码如下:
requestLocationUpdates (String provider, long minTime, float minDistance, LocationListener listener)

里发现了这样一句话:It may take a while to receive the most recent location. If an immediate location is required, applications may use the getLastKnownLocation(String) method. 因此为了获取位置信息,应该用此方法为manager设置监听器,在监听器中onLocationChanged(Location location)里获取。
测试代码如下:
复制代码 代码如下:
public void onLocationChanged(Location location)
            {
                Log.i("onLocationChanged", "come in");
                if (location != null)
                {
                    Log.w("Location","Current altitude = "+ location.getAltitude());
                    Log.w("Location","Current latitude = "+ location.getLatitude());
                }
            }
    
经过测试,经过一段时间后可以获取Location(获取时间与minTime、minDistance相关)。还需注意的一个问题是在设置了监听器后,删除监听器之前不能用上面的方法关闭gps,否则会报错。因此关闭gps的方法是
 复制代码 代码如下: 
manager.removeUpdates (listener);//listener 即为监听器实例
manager.setTestProviderEnabled("gps",false);

以下是测试代码,所需权限有:
复制代码 代码如下:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"></uses-permission>

复制代码 代码如下:
import android.app.Activity;
 import android.content.Context;
 import android.location.Criteria;
 import android.location.Location;
 import android.location.LocationListener;
 import android.location.LocationManager;
 import android.os.Bundle;
 import android.util.Log;
 public class audio extends Activity
 {
     /** Called when the activity is first created. */
     LocationManager locationManager;
     LocationListener llistener;
     String provider;
     public void onCreate(Bundle savedInstanceState)
     {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
         Criteria criteria = new Criteria();
         criteria.setAccuracy(Criteria.ACCURACY_FINE);
         criteria.setAltitudeRequired(false);
         criteria.setBearingRequired(false);
         criteria.setCostAllowed(true);
         criteria.setPowerRequirement(Criteria.POWER_LOW);
         String serviceName = Context.LOCATION_SERVICE;
         locationManager = (LocationManager) getSystemService(serviceName);
         locationManager.setTestProviderEnabled("gps", true);
         provider = locationManager.getBestProvider(criteria, true);
         Log.d("provider", provider);
         llistener = new LocationListener() {
             @Override
             public void onLocationChanged(Location location)
             {
                 // TODO Auto-generated method stub
                 Log.i("onLocationChanged", "come in");
                 if (location != null)
                 {
                     Log.w("Location", "Current altitude = "
                             + location.getAltitude());
                     Log.w("Location", "Current latitude = "
                             + location.getLatitude());
                 }
                 locationManager.removeUpdates(this);
                 locationManager.setTestProviderEnabled(provider, false);
             }
             @Override
             public void onProviderDisabled(String provider)
             {
                 // TODO Auto-generated method stub
                 Log.i("onProviderDisabled", "come in");
             }
             @Override
             public void onProviderEnabled(String provider)
             {
                 // TODO Auto-generated method stub
                 Log.i("onProviderEnabled", "come in");
             }
             @Override
             public void onStatusChanged(String provider, int status,
                     Bundle extras)
             {
                 // TODO Auto-generated method stub
                 Log.i("onStatusChanged", "come in");
             }
         };
          locationManager.requestLocationUpdates(provider, 1000, (float) 1000.0, llistener);
     }
     protected void onDestroy()
     {
         locationManager.removeUpdates(llistener);
         locationManager.setTestProviderEnabled(provider, false);
         super.onDestroy();
     }

时间: 2024-08-19 10:40:15

Android打开GPS导航并获取位置信息返回null解决方案的相关文章

Android打开GPS导航并获取位置信息返回null解决方案_Android

最近在做一个 Android 项目,需要用到GPS获取位置信息,从 API 查了一下,发现获取位置信息仅需极其简单的一句即可: 复制代码 代码如下: getLastKnownLocation(LocationManager.GPS_PROVIDER), 于是高兴地不得了.可是一写进代码里,返回值(Location 类型)居然一直为null..郁闷的不得了.在网上查了好久,发现好多人都和我一样纠结于这个问题上,有人说是因为GPS没打开,也有人说是相关权限没加上..可是我的明明已经在设置里打开,权限

对Android GPS获取位置信息的新研究

最近在做一个 Android 项目,需要用到GPS获取位置信息,从 API 查了一下,发现获取位置信息仅需极其简单的一句即可: getLastKnownLocation(LocationManager.GPS_PROVIDER), 于是高兴地不得了.可是一写进代码里,返回值(Location 类型)居然一直为null..郁闷的不得了.在网上查了好久,发现好多人都和我一样纠结于这个问题上,有人说是因为GPS没打开,也有人说是相关权限没加上..可是我的明明已经在设置里打开,权限自然也加上了.在api

Android 中Crash时如何获取异常信息详解及实例

Android 中Crash时如何获取异常信息详解 前言: 大家都知道,Android应用不可避免的会发生crash,无论你的程序写的多完美,总是无法完全避免crash的发生,可能是由于Android系统底层的bug,也可能是由于不充分的机型适配或者是糟糕的网络状况.当crash发生时,系统会kill掉你的程序,表现就是闪退或者程序已停止运行,这对用户来说是很不友好的,也是开发者所不愿意看到的,更糟糕的是,当用户发生了crash,开发者却无法得知程序为何crash,即便你想去解决这个crash,

html5-网页版高德地图是如何获取位置信息的

问题描述 网页版高德地图是如何获取位置信息的 webapp如何获取位置信息,html5的不好用,有没有大侠贴代码出来,

微信开发,获取位置信息

问题描述 微信开发,获取位置信息 怎么可以实现微信用户给公共号发送信息的同时,微信公共号获取到用户的位置信息 解决方案 认证的服务号才有此功能 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140841&token=&lang=zh_CN 解决方案二: 微信公众号开发_如何获取用户信息?[微信开发]获取用户信息微信开发之如何根据经纬度获取所在的地点信息

Android SdkVersion的区别及获取版本信息方法

1.minSdkVersion,targetSdkVersion,maxSdkVersion,compileSdkVersion四个数值之间有什么区别? • minSdkVersion,maxSdkVersion是项目支持的最低sdk版本和最高sdk版本.在安装apk前,系统会对这两个数值进行判断,决定当前系统是否可以安装,一般maxSdkVerson不会设置. • compileSdkVersion是项目编译时的sdk版本. • targetSdkVersion 会告诉系统,此版本已经经过充分

asp.net 使用模板页Master后,子页面打开新页面,获取不了返回值

问题描述 asp.net 使用模板页Master后,子页面打开新页面,获取不了返回值 内容页: var url = "SelectContractNo1.aspx?PersonId=" + ticks; var aim=window.showModalDialog(url) 返回值页面: setTimeout(function(){window.returnValue='" + aaa + "'; self.close();}, 100); aim 不能获得返回值

android使用百度地图SDK获取定位信息示例

本文使用Android Studio开发. 获取定位信息相对简单,我们只需要如下几步: 第一步,注册百度账号,在百度地图开放平台新建应用.生成API_KEY.这些就不细说了,请前往这里:http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/key 第二步,下载sdk,地址:http://lbsyun.baidu.com/index.php?title=android-locsdk/geosdk-android-download

Android系统Gps分析(一)

1 GPS架构 2 GPS分析 2.1 头文件 头文件定义在:hardware/libhardware/include/hardware/gps.h,定义了GPS底层相关的结构体和接口 GpsLocation GPS位置信息结构体,包含经纬度,高度,速度,方位角等. [cpp] view plaincopy /** Flags to indicate which values are valid in a GpsLocation. */   typedef uint16_t GpsLocatio