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() чтобы не быть призванным. Есть

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

  2. Даже для включенных источников местоположения не может быть никакой доступной информации о местоположении. Например, 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 servicesMsgstr "Установите его из 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

}
Другие вопросы по тегам