Как получить местоположение с помощью Fused Location Provider в Android с помощью сети?

Я пытался получить местоположение (широта/долгота), используя Fused Location Api в andriod. Мой код отлично работает, когда включены Wi-Fi и GPS. Если я отключу GPS, я не получу обновления местоположения.

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

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();


}

}


person Alvi    schedule 18.09.2016    source источник
comment
Вы проверяли настройки местоположения? Также setInterval(10000) равен 10 секундам. Не то, чтобы это имело значение.   -  person masp    schedule 18.09.2016
comment
спасибо за упоминание настроек местоположения, но я хочу получать обновления местоположения только через сеть, т. е. служба определения местоположения будет отключена. Я смог сделать это, используя обычную службу LocationService, но слитный провайдер не работает с отключенной службой определения местоположения. Можете ли вы дать мне какую-либо информацию об этом?   -  person Alvi    schedule 18.09.2016
comment
Вы отключили службы определения местоположения? Почему и какая настройка именно на вашем 21 самсунге? Если вы не хотите, чтобы приложение использовало GPS, вы можете изменить разрешения и использовать только ACCESS_COARSE_LOCATION. Вы по-прежнему можете использовать объединенного поставщика с PRIORITY_BALANCED_POWER_ACCURACY. Сначала алгоритм проверяет поставщика сети, а затем переходит к GPS, если он доступен.   -  person masp    schedule 18.09.2016
comment
Я могу получать обновления от любого провайдера, оставив службы определения местоположения включенными. Но я пытаюсь сократить использование батареи и получить обновление местоположения только с помощью сети. Можно ли получить это при отключенных службах определения местоположения?   -  person Alvi    schedule 18.09.2016
comment
В настройках местоположения он запрашивает режим, верно? Что вы там используете? Если вы закроете все, ваше приложение не будет получать обновления. Наверное, только последнее известное место. Также вашей конечной целью является энергоэффективный алгоритм. Вот почему Google предоставил нам провайдера Fused. До этого приходилось делать это самому. Здесь developer.android.com/training/location/ есть достаточно опций, которые вы можете использовать. И прочитайте еще раз мой предыдущий комментарий по отключению gps.   -  person masp    schedule 18.09.2016
comment
Вы нашли какое-нибудь решение   -  person M.Yogeshwaran    schedule 14.10.2016
comment
Нет, необходимо оставить службу определения местоположения включенной для работы на всех устройствах.   -  person Alvi    schedule 15.10.2016


Ответы (1)


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

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

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

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

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

И затем у нас есть FusedLocationProviderAPI константы где все становится немного сложнее. Также от API lvl 21 и выше у нас есть это:

введите здесь описание изображения

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

введите здесь описание изображения

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

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

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

person MadDim    schedule 15.02.2017