2

Я пытался найти местоположение (lat/lon), используя Fused Location Api in andriod. Мой код отлично работает, когда включены WiFi и gps. Если я отключу gps, то я не получаю никакого обновления местоположения.

Я использую BALANCED_POWER_ACCURACY для запроса местоположения. Я добавил Access_FINE_Location в манифест и использовал play services version 9.2.1 в файле build.gradle.
Я тестирую на реальных устройствах (Samsung SM0G360H API 19 и Samsung SM-G361 API 21). Оба дают одинаковые результаты.
Может ли кто-нибудь сказать мне, как именно спланированное местоположение Api работает?
Как я могу получить обновления местоположения, когда gps отключен, но сетевое соединение включено?
Мой код:
Как получить местоположение с помощью Fused Location Provider в android с помощью сети?

public class LocationUpdateusingFused extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener,LocationListener{ 



TextView txtOutputLat, txtOutputLon; 
Location mLastLocation; 
private GoogleApiClient mGoogleApiClient; 
private LocationRequest mLocationRequest; 
String lat, lon; 

Intent batteryStatus; 
@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.fleet_layout); 

    txtOutputLat = (TextView) findViewById(R.id.textView); 
    txtOutputLon = (TextView) findViewById(R.id.textView2); 


    buildGoogleApiClient(); 
} 

@Override 
public void onConnected(@Nullable Bundle bundle) { 
    mLocationRequest = LocationRequest.create(); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
    mLocationRequest.setMaxWaitTime(5000); 
    mLocationRequest.setInterval(10000); // Update location every second 

    try { 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 


     mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
       mGoogleApiClient); 
    } 
    catch (SecurityException e) 
    { 
     Log.e("LocatonUpdate",e+" "); 
    } 
    if (mLastLocation != null) { 
     lat = String.valueOf(mLastLocation.getLatitude()); 
     lon = String.valueOf(mLastLocation.getLongitude()); 

    } 
    updateUI(); 
} 

@Override 
public void onConnectionSuspended(int i) { 

} 

@Override 
public void onLocationChanged(Location location) { 
    lat = String.valueOf(location.getLatitude()); 
    lon = String.valueOf(location.getLongitude()); 
    Log.e("LocationChanged",location.getSpeed()+" "+location.getAccuracy()+" "+location.getBearing()+" "+location.getProvider()+" "+location.getAltitude() 
    ); 

    updateUI(); 
} 

@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
    buildGoogleApiClient(); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    mGoogleApiClient.connect(); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    mGoogleApiClient.disconnect(); 
} 
void updateUI() { 
    txtOutputLat.setText(lat); 
    txtOutputLon.setText(lon); 
} 
synchronized void buildGoogleApiClient() { 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 


} 

}

+0

Вы проверили настройки местоположения? Также setInterval (10000) составляет 10 секунд. Не важно. – masp

+0

спасибо за упоминание настроек местоположения, но я хочу получить обновление местоположения только с использованием сети, то есть служба определения местоположения будет отключена. Я смог сделать это, используя обычный LocationService, но плавный провайдер не работает с отключенным сервисом определения местоположения. Можете ли вы дать мне информацию об этом? – Alvi

+0

Вы предоставляете услуги по отключению местоположения? Почему и какие настройки именно на вашем 21-м Samsung? Если вы не хотите, чтобы приложение использовало gps, вы можете изменить разрешения и использовать только ACCESS_COARSE_LOCATION. Вы все еще можете использовать плавкий провайдер с PRIORITY_BALANCED_POWER_ACCURACY. Сначала алгоритм проверяет поставщика сети, а затем переходит на gps, если он доступен. – masp

ответ

2

Извините за довольно длительной задержки в попытке ответить на ваш вопрос. Я сам борюсь со всей проблемой местоположения, поэтому я дам вам то, что я заметил и узнал после «много трудностей». Надеюсь, вам по-прежнему нужен ответ.

Я не помню, как выглядят настройки уровня API 19, но в целом все настройки местоположения от API lvl 15 и выше (плюс минус некоторые опции здесь и там) были настроены на соответствие логике FusedLocationProviderAPI. Что я имею в виду под этим; вы HAVE, чтобы установить местоположение в любое время, чтобы получить какие-либо обновления местоположения, так как настройка/переключатель управляет общим местоположением. Надеюсь, это ответит на ваш главный вопрос.

Чтобы предоставить дополнительную информацию. Поскольку masp упоминает в одном из комментариев, вы можете контролировать то, что поставщик фактически использует через разрешения и константы API Fused Location.

Для получения разрешений вы должны выбрать между ACCESS_COARSE_LOCATION или ACCESS_FINE_LOCATION. Разница заключается в том (I quote):

Если вы используете как NETWORK_PROVIDER и GPS_PROVIDER, то вам необходимо запросить только разрешение ACCESS_FINE_LOCATION, потому что она включает в себя разрешение для обоих провайдеров. Разрешение для ACCESS_COARSE_LOCATION позволяет получить доступ только к NETWORK_PROVIDER.

И тогда у нас есть FusedLocationProviderAPI constants, где все становится немного сложнее. Кроме того, из API лвл 21 и выше, мы имеем следующее:

enter image description here

Если войти в режим, то вы получите:

enter image description here

Я не пойду больше в постоянных. Они были протестированы в принятом ответе этого question. Я предлагаю вам иметь гусака. Я должен упомянуть, однако, что независимо от того, что вы делаете с ними, режим в настройках имеет приоритет. Вы можете запросить GPS в приложении, но если пользователь говорит, что сохранение батареи в настройках, то это все.

Последнее, что я, вероятно, должен упомянуть, заключается в том, что если вы установите разрешение ACCESS_COARSE_LOCATION, тогда ожидаете ужасающей точности (также показано в тесте, который я связал выше). Мое предложение - использовать ACCESS_FINE_LOCATION, а затем поиграть с константами Fused Location и интервалами (setInterval и setFastestInterval)

Надеюсь, что это поможет немного, даже если довольно поздно.

Смежные вопросы