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());
}
}
Ответы
Ответ 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
}