Подтвердить что ты не робот

OnLocationChanged не вызывается на некоторых устройствах

Это вопрос, который задавался много раз, но я не мог найти решение, которое всегда работает.

Я разрабатываю приложение с использованием провайдера Fused location. В методе onConnected() я запрашиваю обновления местоположения, и логика приложения будет инициирована после создания исправления местоположения и вызова onLocationChanged(). (См. Мой код ниже).

Проблема onLocationChanged() метод никогда не вызывается на некоторых устройствах. Я использую Samsung Tab 2 и Samsung Galaxy Grand для тестирования. Этот код отлично работает на вкладке 2, но не работает на Grand. Не работает, я имею в виду, что locationClient подключается, но onLocationChanged() никогда не вызывается.

Раньше я использовал диспетчер местоположений для получения местоположения и в этой реализации, возникла одна и та же проблема. Итак, я попробовал реализовать поставщика плавного доступа, но у меня по-прежнему возникает та же проблема.

Может ли кто-нибудь помочь мне с этой проблемой? Здесь что-то не хватает?

public class MainActivity extends Activity implements GooglePlayServicesClient.ConnectionCallbacks, OnConnectionFailedListener, LocationListener {

LocationClient locationclient;
LocationRequest lr;
Location loc1;
static String address;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);     

    locationclient = new LocationClient(this,this,this);
    locationclient.connect();        

}

@Override
public void onConnected(Bundle arg0) {
    // TODO Auto-generated method stub

    lr=LocationRequest.create();
    lr.setInterval(100);
    locationclient.requestLocationUpdates(lr, this);
    Log.d("LocationClient","On Connected");
}

@Override
public void onDisconnected() {
    // TODO Auto-generated method stub
    locationclient.disconnect();

}

@Override
public void onConnectionFailed(ConnectionResult arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onLocationChanged(Location loc) {
    // TODO Auto-generated method stub      

    // Application Logic        

    Log.d("LocationClient","Last Known Location LC:" + loc.getLatitude() + "," + loc.getLongitude());
}
}
4b9b3361

Ответ 1

Я наблюдал такое же поведение на Galaxy Nexus и узнал две вещи, которые вызывали onLocationChanged(). Есть

  • Соответствующий источник местоположения не включен в системных настройках. Для PRIORITY_HIGH_ACCURACY необходимо включить спутники GPS, для PRIORITY_BALANCED_POWER_ACCURACY необходимо включить Wi-Fi и местоположение мобильной сети.

  • Даже для источников с включенным местоположением не может быть действительной информации о местоположении. Например, источник PRIORITY_HIGH_ACCURACY включен, но нет (или не хорошего) приема GPS (например, устройство находится внутри здания). Или источник PRIORITY_BALANCED_POWER_ACCURACY включен, но оба Wi-Fi и мобильные данные отключены. В таких случаях местоположение не может быть обнаружено, а onLocationChanged() не будет вызываться.

Чтобы исправить # 1, я должен был проверить, включены ли требуемые источники местоположения даже до подключения к API сервисов Google, и если они отключены, я уведомил пользователя, предложившего ему/ей разрешить доступ к местоположению.

Чтобы решить # 2, я решил использовать LocationRequest.setExpirationDuration(). Я устанавливал тайм-аут примерно через 10 секунд, и сразу после вызова requestLocationUpdates() я отправляю обратный вызов с задержкой на те же 10 секунд. Если вызванный обратный вызов вызывается до requestLocationUpdates(), это означает, что местоположение не может быть обнаружено по причине № 2. Я делаю три повтора, а затем показываю пользователю сообщение об ошибке.

Документация на Android в этом месте невелика, поэтому я надеюсь, что это поможет.

Ответ 2

lr.setInterval(100); 

с ним ваш интервал составляет 0,1 секунду, поэтому очень сложно для чипсета gps обнаружить местоположение. Ваш интервал должен быть > 1 секунда (со мной это > 10)

locationRequest должно быть установлено:

setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) потому что PRIORITY_BALANCED_POWER_ACCURACY на открытом воздухе он не получает места. Код будет выглядеть так:

lr=LocationRequest.create();

lr.setInterval(5 * 1000);// 5s

lr.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationclient.requestLocationUpdates(lr, this);

Надеюсь на эту помощь.

Ответ 3

Посмотрите, получаете ли вы пройденное местоположение, проверяя if (loc == null). Несмотря на то, что он является одним и тем же провайдером, возможно, одно устройство возвращается нулевым и бомбардирует, что приводит к тому, что он не срабатывает.

Ответ 4

Это, возможно, не имеет смысла, но я столкнулся с этой проблемой раньше, кто-то предложил вам создать свой собственный LocationListener вместо того, чтобы позволить вашему MainActivity реализовать LocationListener. В основном это:

locationclient.requestLocationUpdates(lr, your_location_listener);

Надеюсь, что это поможет.

Ответ 5

Я решил это, установив оба параметра, минимальное расстояние и минимальное время между обновлениями до 0. В соответствии с тем, что я тестировал на двух устройствах, теперь onLocationChanged() вызывается регулярно после запроса обновлений.

Ответ 6

попробуйте удалить и переустановить "google play services". Установите его со ссылкой на google market ниже, услуги Google Play

Ответ 7

Здесь проверьте этот код...

public class MyActivity extends Activity implements LocationListener {
double destLat, destLong;

LocationManager locationManager;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

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

}

@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub
    destLat = location.getLatitude();
    destLong = location.getLongitude();
}

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}