3

我在我的测试人员的一部手机上获取用户的位置时遇到问题。它对我来说总是很好,所以我不知道有什么区别。

这是顺序:

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

操作系统从不提供有效位置。对于 GPS_PROVIDER 和 NETWORK_PROVIDER,getLastKnownLocation() 始终返回 null,并且在请求LocatioUpdates 之后永远不会调用 LocationListener。

  1. 然后他运行谷歌地图应用程序(似乎确实找到了他)。
  2. 然后,如果他再次运行我的应用程序并且它确实获得了正确的位置。

以下是我的代码的基础知识:

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

我需要做一些进一步的魔法才能在重新启动后使其始终如一地工作吗?

4

5 回答 5

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
    }
}
于 2014-03-25T17:54:13.603 回答
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 文件中调用您的服务。

于 2011-11-24T15:10:58.523 回答
0

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

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

于 2014-03-26T10:52:01.970 回答
0

尝试更改此代码

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

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

可能是因为你在 1000 米以内

于 2011-03-21T14:58:28.150 回答
0

一旦我开始同时使用 GPS 和 Ntwork,我在使用 GPS_PROVIDER 的三星 Galaxy 3 和 Nexus 设备上遇到了同样的问题。它会选择首先返回的位置并显示给用户。一件事,我指定的距离是300米,时间间隔是10秒

于 2012-12-18T22:26:41.520 回答