手机重启后Android无法获取位置
Posted
技术标签:
【中文标题】手机重启后Android无法获取位置【英文标题】:Android failing to get location after a phone reboot 【发布时间】:2011-07-19 18:12:03 【问题描述】:我在我的测试人员的一部手机上获取用户的位置时遇到问题。它对我来说总是很好,所以我不知道有什么区别。
顺序如下:
1:重启手机。 2. 检查以确保已启用定位服务(GPS 和网络)。 3. 启动我的应用程序。
操作系统从不提供有效位置。对于 GPS_PROVIDER 和 NETWORK_PROVIDER,getLastKnownLocation() 始终返回 null,并且在请求LocatioUpdates 之后永远不会调用 LocationListener。
-
然后他运行 Google 地图应用程序(似乎确实可以找到他)。
然后,如果他再次运行我的应用程序并且它确实可以正确获取位置。
以下是我的代码的基础知识:
LocationManager locationManager = (LocationManager) this.getSystemService( Context.LOCATION_SERVICE );
LocationListener locationListener = new LocationListener()
public void onLocationChanged( Location location )
useLocation( location );
public void onStatusChanged( String provider, int status, Bundle extras )
public void onProviderEnabled( String provider )
public void onProviderDisabled( String provider )
;
// Register the listener with the Location Manager to receive location updates
// Checks a minimum of every 120 seconds. Location must change by 10000 meters
String provider = locationManager.getBestProvider( new Criteria(), true );
if ( provider != null )
System.out.println( "Using provider: " + provider );
locationManager.requestLocationUpdates( provider, 120 * 1000, 10000, locationListener );
// Get the last know location for immediate use
Location lastLocation = locationManager.getLastKnownLocation( LocationManager.GPS_PROVIDER );
if ( lastLocation != null )
useLocation( lastLocation );
else
useLocation( locationManager.getLastKnownLocation( LocationManager.NETWORK_PROVIDER ) );
当它失败时,代码说最好的提供者是“网络”,所以这就是我使用的。但是永远不会调用 onLocationChanged。我也从未从 getLastKnowLocation() 获得非空值。
我需要做一些进一步的魔法来让它在重新启动后始终如一地工作吗?
【问题讨论】:
我遇到了同样的问题。你有没有解决这个问题? 【参考方案1】:我假设您已经在服务中编写了这个。如果是这种情况,请尝试使用侦听启动事件的 BroadCastReciever。例如
<receiver android:name="com.singulera.familysiren.receiver.BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED">
</action>
<category android:name="android.intent.category.HOME">
</category>
</intent-filter>
</receiver>
然后在 BootReceiver 文件中调用你的服务。
【讨论】:
【参考方案2】:更好的解决方案不是尝试一次获得最佳提供商(您不能确定它是 GPS 还是网络),而是听取 GPS 和网络提供商的意见,并根据其准确性和提供商来决定使用哪个位置:
locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, PERIOD_UPDATE_GPS*1000, DISTANCE_UPDATE_GPS, this);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, PERIOD_UPDATE_NETWORK*1000, DISTANCE_UPDATE_NETWORK, this);
在onLocationChange
:
@Override
public void onLocationChanged(Location locationNew)
// for example, check if location was provided by GPS
if (locationNew.getProvider().equals(LocationManager.GPS_PROVIDER))
// do your work here
【讨论】:
【参考方案3】:尝试更改此代码
locationManager.requestLocationUpdates( provider, 120 * 1000, 10000, locationListener );
到
locationManager.requestLocationUpdates( provider, 120 * 1000, 0, locationListener );
可能是因为你在 1000 米以内
【讨论】:
谢谢,但我最初确实在 1000m 处拥有它。同样的问题。我认为如果它是新的,我在 1000m(或任何距离)内,当我询问“最后一个已知位置”时,它会返回。相反,它返回 null。我要强调的是,这只发生在我朋友的手机上,我的手机在重启后总是能正常工作。 我的 Galaxy Ace 手机也有同样的问题。有时在我的应用程序中未调用 LocationListener 并且 getLastKnownLocation() 始终返回 null。如果我启动 Google 地图,它可以获取位置。【参考方案4】:我在使用 GPS_PROVIDER 的三星 Galaxy 3 和 Nexus 设备上遇到了同样的问题,一旦我开始同时使用 GPS 和 Ntwork。它会选择首先返回的位置并显示给用户。一件事,我指定的距离是300米,时间间隔是10秒
【讨论】:
【参考方案5】:我自己也有同样的问题。我忘记在清单中添加访问ACCESS_COARSE_LOCATION
和ACCESS_FINE_LOCATION
位置/权限的权限。
添加这些并重建后,它开始按预期工作。
【讨论】:
以上是关于手机重启后Android无法获取位置的主要内容,如果未能解决你的问题,请参考以下文章
在 GPS 芯片长时间处于活动状态后,Android 设备需要重启/重启才能获取 GPS 位置
Android:如果手机通过 WiFi 连接,则无法从网络获取地理位置
在 android 中获取更新位置和禁用 GPS 后如何获取?