手机重启后Android无法获取位置

时间:2011-03-21 14:53:13

标签: android gps location locationmanager

我在测试人员的手机上找到用户的位置时遇到问题。它总是适合我,所以我不知道有什么区别。

以下是序列:

1:重新启动手机。 2.检查以确保启用位置服务(对于GPS和网络)。 3.启动我的应用程序。

操作系统永远不会提供有效的位置。 getLastKnownLocation()始终为GPS_PROVIDER和NETWORK_PROVIDER返回null,并且在requestLocatioUpdates之后永远不会调用LocationListener。

  1. 然后他运行谷歌地图应用程序(似乎确实找到了他)。
  2. 然后,如果他再次运行我的应用程序,它确实正确地获取了位置。
  3. 以下是我的代码的基础知识:

        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()获得非null值。

    我需要做些进一步的魔术才能让它在重启后始终如一地工作吗?

5 个答案:

答案 0 :(得分:1)

我认为你已经在服务中写了这个。如果是这种情况,请尝试使用侦听Boot事件的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文件中调用您的服务。

答案 1 :(得分: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
    }
}

答案 2 :(得分:0)

尝试更改此代码

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

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

可能是因为你的1000米

答案 3 :(得分:0)

一旦我开始使用GPS和GPS,我使用GPS_PROVIDER与三星Galaxy 3和Nexus设备有同样的问题。 Ntwork ..它选择首先返回的位置并向用户显示。有一点,我指定的距离是300米,时间间隔是10秒

答案 4 :(得分:0)

我自己也有同样的问题。我忘记添加权限以访问我的清单中的ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION位置/权限。

添加并重建后,它开始按预期工作。