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

时间:2021-08-31 09:21:19 

最近在做一个 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();
     }

标签:GPS导航,位置信息
0
投稿

猜你喜欢

  • c#调用api控制windows关机示例(可以重启/注销)

    2021-12-20 14:52:06
  • JDBC使用游标实现分页查询的方法

    2021-06-03 19:07:26
  • Spring Security OAuth 自定义授权方式实现手机验证码

    2021-10-03 23:30:27
  • Android Studio使用recyclerview实现展开和折叠功能(在之前的微信页面基础之上)

    2023-10-31 23:08:55
  • java实现打砖块小游戏

    2021-07-26 14:47:11
  • C#使用Socket实现局域网聊天

    2021-07-20 02:13:20
  • unity 如何修改材质属性和更换shader

    2023-02-22 12:42:44
  • 基于java配置nginx获取真实IP代码实例

    2023-07-15 12:32:46
  • ibatis学习之搭建Java项目

    2021-11-02 00:35:29
  • Java保留两位小数的几种写法总结

    2022-04-19 06:53:06
  • SpringBoot处理接口幂等性的两种方法详解

    2021-12-23 10:32:32
  • android九宫格可分页加载控件使用详解

    2022-03-04 08:14:02
  • Java中PriorityQueue实现最小堆和最大堆的用法

    2022-03-25 14:32:18
  • WPF+ASP.NET SignalR实现动态折线图的绘制

    2021-11-28 08:13:43
  • Spring中SmartLifecycle和Lifecycle的作用和区别

    2023-11-18 22:55:50
  • Java中的BaseTypeHandler自定义类型转换器的使用

    2022-03-09 00:34:16
  • Java使用贪心算法解决电台覆盖问题(示例详解)

    2022-12-31 05:58:48
  • C#中内联函数的用法介绍

    2023-04-18 18:29:18
  • 基于Mybatis plus 自动代码生成器的实现代码

    2023-11-24 10:40:51
  • 详解Android中IntentService的使用方法

    2021-07-14 06:49:49
  • asp之家 软件编程 m.aspxhome.com