onLocationChanged не вызывается на некоторых устройствах
Это вопрос, который задавался много раз, но я не мог найти решение, которое всегда работает.
Я разрабатываю приложение с использованием провайдера Fused location. в onConnected()
метод, я запрашиваю обновления местоположения, и логика приложения будет инициирована, как только будет сгенерировано исправление местоположения, и onLocationChanged()
называется. (Пожалуйста, обратитесь к моему коду ниже).
проблема onLocationChanged()
Метод никогда не вызывается на некоторых устройствах. Я использую Samsung Tab 2 и Samsung Galaxy Grand для тестирования. Этот код отлично работает на Tab 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());
}
}
7 ответов
Я наблюдал такое же поведение на 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 не очень хорошая в этом месте, поэтому я надеюсь, что это поможет.
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);
Надеюсь, это поможет.
Проверьте, получили ли вы пройденное местоположение, проверяя на наличие if (loc == null). Даже если это один и тот же поставщик, возможно, одно устройство возвращается в исходное состояние и взрывается, в результате чего создается впечатление, что оно не срабатывает.
Попробуй удалить и переустановитьgoogle play services
Msgstr "Установите его из Google Market по ссылке ниже, сервисы Google Play
Я решил эту проблему, установив оба параметра, минимальное расстояние и минимальное время между обновлениями до 0. Согласно тому, что я тестировал на 2 устройствах, теперь onLocationChanged() вызывается регулярно после запроса обновлений.
Это может быть бессмысленно, но я сталкивался с этой проблемой раньше, кто-то предложил вам создать свой собственный LocationListener
вместо того, чтобы позволить вашему MainActivity
инвентарь LocationListener
, В основном это:
locationclient.requestLocationUpdates(lr, your_location_listener);
Надеюсь это поможет.
Здесь Проверьте этот код...
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
}