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

Android: как получить информацию о местоположении из унаследованных комплектов при использовании LocationManager.requestLocationUpdates()

Я пытаюсь использовать запрос Local LocationManager RequestLocationUpdates. Все работает до тех пор, пока я не попытаюсь извлечь фактический объект местоположения в моем широковещательном приемнике. Нужно ли конкретно определять "дополнительные функции" в соответствии с моими намерениями, чтобы Android LocationManager перед тем, как передать его запросуLocationUpdates, чтобы он знал, как добавить его в намерение, или он будет создавать набор дополнительных компонентов, независимо от того, когда он пройдет уволенную намерение для широковещательного приемника?

Мой код выглядит следующим образом:

Intent intent = new Intent("com.myapp.swarm.LOCATION_READY");
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
    0, intent, 0);

//Register for broadcast intents
int minTime = 5000;
int minDistance = 0;
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime,
    minDistance, pendingIntent);

У меня есть широковещательный приемник, который определен в манифесте как:

<receiver android:name=".LocationReceiver">
    <intent-filter>
        <action android:name="com.myapp.swarm.LOCATION_READY" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>

И класс вещательного приемника, как:

public class LocationReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    //Do this when the system sends the intent
    Bundle b = intent.getExtras();
    Location loc = (Location)b.get("KEY_LOCATION_CHANGED");

    Toast.makeText(context, loc.toString(), Toast.LENGTH_SHORT).show(); 
    }
}

Мой объект "loc" приближается к нулю.

4b9b3361

Ответ 1

ОК, мне удалось исправить это, изменив KEY_LOCATION_CHANGED в коде приемника вещания на:

public class LocationReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    //Do this when the system sends the intent
    Bundle b = intent.getExtras();
    Location loc = (Location)b.get(android.location.LocationManager.KEY_LOCATION_CHANGED);

    Toast.makeText(context, loc.toString(), Toast.LENGTH_SHORT).show(); 
    }
}

Ответ 2

Я попытался запрограммировать и протестировать предлагаемое вами решение, так как у меня возникают аналогичные проблемы, связанные с предупреждениями о близости и намерениями, несущими объекты местоположения. Согласно предоставленной вами информации вам удалось преодолеть нулевой поиск объектов на стороне BroadcastReceiver. То, что вы, возможно, не заметили, - это то, что теперь вы должны получать то же место, что и ваше намерение, которое было впервые создано (также рассматривалось как проблема с запуском кэширования).

Чтобы преодолеть эту проблему, я использовал FLAG_CANCEL_CURRENT, как это предлагают многие люди здесь, и это работает очень хорошо, получая свежие (и сочные: P) значения местоположения. Поэтому строка, определяющая ваше ожидающее намерение, должна выглядеть так:

PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
    0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

Однако вы можете игнорировать это, если:

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