安卓手机重启后无法获取位置信息

3
我在我的一个测试人员的手机上获取用户位置时遇到了问题。对我来说一切都正常,所以我不知道区别在哪里。
以下是操作步骤:
1. 重启他的手机。 2. 检查位置服务是否已启用(包括GPS和网络)。 3. 启动我的应用程序。
操作系统从未提供有效的位置。getLastKnownLocation() 对于 GPS_PROVIDER 和 NETWORK_PROVIDER 始终返回 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()中没有获得非空值。

在重新启动后,是否需要进一步的操作才能使其始终正常工作?


我遇到了同样的问题。你最终解决了吗? - Jules
5个回答

1

我猜你是在一个服务中编写了这个代码。如果是这样的话,尝试使用一个监听启动事件的广播接收器。例如:

<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文件中调用您的服务。


1
更好的解决方案不是一次性尝试获取最佳提供商(无法确定它是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
    }
}

0

尝试更改此代码

locationManager.requestLocationUpdates( provider, 120 * 1000, 10000, locationListener );

 locationManager.requestLocationUpdates( provider, 120 * 1000, 0, locationListener ); 

这可能是因为您在1000米范围内


谢谢,但我最初确实将它设置为1000米。同样的问题。我认为如果它知道我在1000米(或任何距离)以内,当我要求“最后已知位置”时,它应该返回那个位置。而不是返回null。我应该强调的是,这仅发生在我的朋友的手机上,我的手机在重新启动后总是按预期工作。 - btschumy
我有一个Galaxy Ace手机也遇到了同样的问题。有时我的应用程序中的LocationListener没有被调用,getLastKnownLocation()总是返回null。但如果我启动Google Maps,它可以获取位置信息。 - Fede

0

我自己也遇到了这个问题。我忘记在清单文件中添加访问ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION位置/权限的权限。

添加了这些权限并重新构建后,它开始按预期工作。


0

我在使用GPS_PROVIDER时,遇到了三星Galaxy 3和Nexus设备的相同问题。一旦我开始同时使用GPS和网络,它会捕捉到首先返回的位置并显示给用户。另外,我将距离指定为300米,时间间隔为10秒。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接