Android LocationManager locationManager.requestLocationUpdates() 不起作用

5

大家好,我想通过位置管理器获取当前位置,我正在使用下面的代码:

LocationManager locationManager = (LocationManager) 
getSystemService(Context.LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        String bestProvider =locationManager.getBestProvider(criteria,true);

        Location location = 
locationManager.getLastKnownLocation(bestProvider);
        if (location != null) {
            onLocationChanged(location);
        }
        locationManager.requestLocationUpdates(bestProvider, 20000, 0,this);

但是我没有得到对这行代码的任何响应。
locationManager.requestLocationUpdates(bestProvider, 20000, 0,this);

同时也得到了null的最后已知位置,我已经在清单文件中添加了所有权限以及动态添加,但是上述代码没有任何响应,我已经搜索过但没有找到相关的答案,请帮忙解决。

3个回答

1

LocationManager.NETWORK_PROVIDER需要网络,但它是实际的,而不是精确的。 如果你想使用LocationManager.GPS_PROVIDER,情况必须是户外而不是室内,因为GPS位置需要卫星,如果你在任何建筑物中,卫星无法找到你!请到户外再次使用GPS_PROVIDER进行检查!

*最好的方法是从GPS和NETWORK获取位置,并检查任何一个不为空且更准确的使用它。


1
对于getLastKnownLocation方法,在文档中说明:

如果提供者当前被禁用,则返回null。

这意味着您的GPS已被禁用。

对于requestLocationUpdates,您每20秒请求一次位置,请尝试减少此数字,以便您至少知道程序是否正常工作。

您可以尝试这个:

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);

我强烈建议您使用新的API请求位置更新:https://developer.android.com/training/location/receive-location-updates.html。它非常快速和准确,但您需要创建一个免费的Google开发者帐户并创建API密钥。所有所需信息都应在链接中。

我已经启用了GPS,让我再次检查一下。 - AKSHAY MANAGOOLI
我添加了代码来检查 GPS 是否启用,但仍然无法正常工作。 - AKSHAY MANAGOOLI
我尝试缩短时间,但仍然没有起作用,我会尝试使用新的API并回复您。 - AKSHAY MANAGOOLI
由于:java.lang.ClassNotFoundException:在路径上找不到类“com.google.firebase.provider.FirebaseInitProvider”:DexPathList [[zip文件“/data/app/com.akeditzz.akshaymanagooli.currentlocation-2.apk”],nativeLibraryDirectories = [/ data / app-lib / com.akeditzz.akshaymanagooli.currentlocation-2,/ vendor / lib,/ system / lib]],在使用谷歌API后我遇到了这个错误。 - AKSHAY MANAGOOLI
1
我之前在依赖中使用了这个编译语句:compile 'com.google.android.gms:play-services:10.2.4',现在我将其替换为compile 'com.google.android.gms:play-services-location:10.2.4',现在我可以获取到经纬度信息。 - AKSHAY MANAGOOLI
1
谢谢,使用那个链接我得到了我需要的东西。 - AKSHAY MANAGOOLI

1
String bestProvider =locationManager.getBestProvider(criteria,true);

在上述代码中,第二个布尔参数为true。这意味着它将获取已启用的提供程序。而GPS_PROVIDER是被禁用的,这可以通过locationManager.getLastKnownLocation返回null来验证。
此外,由于您请求BestProvier的标准为空,所以您必须得到"passive"作为您的BestProvider。这意味着只有当其他应用程序请求并接收更新时,您才会收到位置更新。
要在您的类的onLocationChangedMethod()中获得真实的位置更新,您必须确保以下事项:
  1. Make sure that you have either one of ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION and then request it in runtime too, which you say you have already done.
  2. If you want to request location through GPS_PROVIDER then you need to make sure that GPS_PROVIDER is enabled you can do that using below code:

    locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); // OR some other PRIORITY depending upon your requirement
    
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest);
    builder.setAlwaysShow(true);
    
    PendingResult<LocationSettingsResult> result =
            LocationServices.SettingsApi.checkLocationSettings(googleApiClient,
                    builder.build());
    
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(LocationSettingsResult locationSettingsResult) {
            final Status status = locationSettingsResult.getStatus();
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:
                    // All location settings are satisfied. The client can
                    // Request for location updates now
    
                    break;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    // Location settings are not satisfied, but this can be fixed
                    // by showing the user a dialog.
                    status.startResolutionForResult(YourActivity.this, 100); // First parameter is your activity instance
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    // Location settings are not satisfied. However, we have no way
                    // to fix the settings so we won't show the dialog.
                    Log.e("TAG", "Error: Can't enable location updates SETTINGS_CHANGE_UNAVAILABLE");
                    break;
            }
        }
    });
    

我使用这个来检查 GPS。isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 如果没有启用,它将弹出警报并显示消息,当用户按下“确定”按钮时,他们将被重定向到位置设置。在启用 GPS 后,我得到了最佳提供者的 GPS。 - AKSHAY MANAGOOLI
@AKSHAYMANAGOOLI 如果您使用从checkForLocationSettings API获取的PendingResult,就不必将用户重定向到设置页面。您只需要调用status.startResolutionForResult(),它会打开一个应用内对话框,让用户在不离开您的应用的情况下启用GPS位置即可。 - ankit209

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