2015-02-13 3 views
12

Итак, я внедрил новый API провайдера Fused Location Provider, чтобы получить местоположение пользователя, но по какой-то причине я не могу получить какое-либо местоположение, если GPS не включен. Не всегда, у пользователей будет свой GPS, и я бы не стал просить их поворачивать свой GPS каждый раз при загрузке приложения. Как я могу сказать API, чтобы дать мне местоположение с любым поставщиком, который у него есть?Продвинутый провайдер местоположения не получает местоположение, если GPS не включен

Вот мой код:

public class FusedLocationService implements 
     LocationListener, 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener { 

    public interface OnLocationChangedListener { 
     public void OnLocationChanged(Location location); 
    } 

    private final String TAG = "SE8611"; 
    private boolean mRequestingLocationUpdates = true; 

    private OnLocationChangedListener mCallBack; 

    Service locationService; 
    private LocationRequest locationRequest; 
    private GoogleApiClient googleApiClient; 
    private Location mCurrentLocation; 
    private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi; 

    public FusedLocationService(Service locationService, final long INTERVAL, final long FASTEST_INTERVAL) { 
     Logger.log(TAG, "FusedLocationService called"); 

     this.mCallBack = (OnLocationChangedListener)locationService; 

     locationRequest = LocationRequest.create(); 
     locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     locationRequest.setInterval(INTERVAL); 
     locationRequest.setFastestInterval(FASTEST_INTERVAL); 
     this.locationService = locationService; 

     googleApiClient = new GoogleApiClient.Builder(locationService) 
       .addApi(LocationServices.API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 

     if (googleApiClient != null) { 
      googleApiClient.connect(); 
     } 
    } 

    @Override 
    public void onConnected(Bundle connectionHint) { 
     if(mRequestingLocationUpdates) { 
      startLocationUpdates(); 
     }else{ 
      Logger.log(TAG, "Location updates are already running."); 
     } 
    } 

    protected void startLocationUpdates() { 
     this.fusedLocationProviderApi.requestLocationUpdates(
       googleApiClient, locationRequest, this); 
     this.mRequestingLocationUpdates = false; 
    } 

    @Override 
    public void onLocationChanged(Location mCurrentLocation) { 
     Logger.log(TAG, "onLocationChanged called"); 
     this.mCurrentLocation = mCurrentLocation; 
     this.mCallBack.OnLocationChanged(this.mCurrentLocation); 
    } 

    public void startLocationUpdatesAfterResume(){ 
     if (googleApiClient.isConnected() && !mRequestingLocationUpdates) { 
      Logger.log(TAG, "startLocationUpdatesAfterResume called"); 
      this.startLocationUpdates(); 
     } 
    } 

    public void stopLocationUpdates() { 
     Logger.log(TAG, "stopping Location Updates"); 
     LocationServices.FusedLocationApi.removeLocationUpdates(
       googleApiClient, this); 
    } 

    public Location getLocation() { 
     return this.mCurrentLocation; 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     this.mRequestingLocationUpdates = true; 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     this.mRequestingLocationUpdates = true; 
    } 
} 
+1

Я m также испытывает эту проблему, вы решили это? – jzarsuelo

+0

То же самое происходило на моем планшете Nexus 7, пожалуйста, поделитесь решением, если оно будет разрешено, спасибо –

+0

Имея ту же проблему, никакого местоположения вообще, если GPS не включен. Вы удовлетворили свою проблему? – AAverin

ответ

0

Вы, кажется, использует LocationRequest.PRIORITY_HIGH_ACCURACY, который предпочитает использовать GPS и выше по сравнению с другими методами. Возможно, вы захотите использовать PRIORITY_BALANCED_POWER_ACCURACY, который будет использовать WiFi и сотовые вышки перед использованием GPS.

Кроме того, поскольку PRIORITY_BALANCED_POWER_ACCURACY является «грубым» уровнем точности, вы можете соответствующим образом изменить разрешение на размещение в своем манифесте.

The training documentation Подробная информация о флажках приоритета, вы также можете пройти через нее.

+1

Ну, я определенно пробовал это. Однако я не получаю никакого местоположения, когда использую PRIORITY_BALANCED_POWER_ACCURACY. –

+0

Вы тестируете на эмуляторе или устройстве? – Abhishek

+0

Я тестирую устройство. Чтобы уточнить, я не получаю никакого места, если у меня нет GPS. –

2

Я думаю, что нашел решение проблемы.

Если вы перейдете в Настройки -> Конфиденциальность и безопасность -> Местоположение, вы заметите, что Location - это не только GPS, но и позволяет пользователю решить, какие поставщики могут быть использованы. Например, вы можете установить, что для получения любых местоположений следует использовать только WiFi и Cellular.

Отключить параметр местоположения отключит сразу всех провайдеров, а не только GPS.

Чтобы проверить, что приложение для пользователей только с WiFi может получить местоположение, измените настройку на «Wifi + Cellular».

5

У меня была такая же проблема, как и вы, что совсем не проблема. У Android была кнопка GPS, которая позволяла вам контролировать ее напрямую, но они заменили ее кнопкой «Расположение», которая работает по-разному. Чтобы получить любое местоположение, вы должны включить его. Как и вы, я думал, что кнопка «Местоположение» включена и выключается только с GPS, но это не тот случай. Вы можете управлять GPS путем изменения режима определения местоположения: 1. Высокая точность (GPS, Wi-Fi и мобильных сетей) 2. Энергосберегающий (Wi-Fi и мобильные сети) 3. GPS только

+0

Я думаю, что этот ответ решает путаницу между местоположением и GPS. –