【问题标题】:Change my location provider in android, when there is no proper location updates from GPS provider当 GPS 提供商没有正确的位置更新时,在 android 中更改我的位置提供商
【发布时间】:2013-03-25 12:54:05
【问题描述】:

我需要定期跟踪用户的位置。

为此,我在我的服务的 onCreate 方法中调用 requestLocationUpdates()。

@Override
public void onCreate()
{
LocationManager aLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);

aLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME, MIN_DISTANCE, new LocationListener(LocationManager.GPS_PROVIDER));
}

通常我会通过这个 GPS_PROVIDER 定期获取位置更新。但是,在某些区域,我无法正确获取位置更新。在这种情况下,我喜欢将我的 requestLocationUpdates 调用切换为使用 NETWORK_PROVIDER。

因此,当我无法从 GPS_PROVIDER 获取正确的位置更新时,我可以将我的 requestLocationUpdates 切换为使用 NETWORK_PROVIDER。

我该怎么做?检查某种条件并在 onStatusChanged() 中更改我的 requestLocationUpdates() 是否正确。

请提出建议。

谢谢。

【问题讨论】:

    标签: android location


    【解决方案1】:

    是的,有办法做到这一点。您可以使用locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) 检查 GPS 提供商是否可用,如果为 false,则使用网络提供商

    您还可以覆盖 onProviderEnabled() 和 onProviderDisabled() 以从 GPS 切换到网络 意思是如果你喜欢使用库,那么你可以使用这个位置跟踪库 https://github.com/nagendraksrivastava/Android-Location-Tracking-Library 它漂亮的图书馆和完美的工作

    这里是获取所有提供者列表并在此基础上获取数据的代码,所以在这种情况下你应该担心提供者

    LocationManager mLocationManager = new LocationManager()
    List<String> matchingProviders = mLocationManager.getProviders(true);
    for(String provider : matchingProviders ){
    Location location = mLocationManager.getLastKnownLocation(provider);
    if(location != null){
    double lat = location.getLatitude();
    }
    

    【讨论】:

    • 另外,selva 建议我同时使用 NETWORK_PROVIDER 和 GPS_PROVIDER 调用 requestLocationUpdates()?那是对的吗?我们可以同时进行 2 个 requestLocationUpdates 初始化吗?如果是这样,在某些时候,我可以同时使用 GPS_PROVIDER 和 NETWORK_PROVIDER 获取位置。
    • 你可以有,但那将是一个坏主意,它会耗尽电池,所以我不建议这样做..
    • 您可以使用获取所有提供者然后从提供者中选择数据我已经编辑了我的答案。只需签出代码
    【解决方案2】:

    试试这个对我有用的代码...

    void currentlocation(){
        LocationManager locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
        LocationListener locationListener = new LocationListener() {
            public void onLocationChanged(Location location) {
                // Called when a new location is found by the network location provider.
                MyContants.lat = location.getLatitude();
                MyContants.lon = location.getLongitude();
                //  Log.w(MyContants.ScanResult_TAG, "Currnet Location==="+String.valueOf(lat)+"-----"+String.valueOf(lon));
            }
            public void onStatusChanged(String provider, int status, Bundle extras) {}
            public void onProviderEnabled(String provider) {}
            public void onProviderDisabled(String provider) {}
    
        };
    
    
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
        //GPS location updates.
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
    }
    

    使用权限

     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    

    【讨论】:

    • 我们能否同时进行 2 个 requestLocationUpdates 初始化。如果是这样,在某些时候,我可以同时使用 GPS_PROVIDER 和 NETWORK_PROVIDER 获取位置更新。在这种情况下,我想我可能会收到 2 次对 onLocationChanged() 方法的调用(可能是错误的,如果我是这样,请正确)。
    • onLocationChanged() 方法仅调用位置更新(新位置建立)所以 onLocation 更改方法仅调用一次...在哪里建立新位置...我使用这个我没有收到两个电话.. .所以我把它
    猜你喜欢
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多