Kotlin - проблема с приемником BroadCast - PullRequest
0 голосов
/ 21 января 2020

У меня небольшая проблема.

Я получил все необходимые разрешения для определения местоположения у пользователя.

Я создал Broadcast Receiver, как показано ниже:

public class GpsLocationReceiver : BroadcastReceiver() {
    private lateinit var mLocationManager: LocationManager
    override fun onReceive(context: Context, intent: Intent) {
        LogUtil.e(">>>On Receive","called")
        mLocationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
        if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            LogUtil.e(">>>On Receive","called inside")
            GetLocationAccessFragment().getAndSaveCurrentLocation()
        }
    }
}

В моем манифесте я сделал следующее:

<receiver android:name=".ui.user_profile.fragments.GetLocationAccessFragment$GpsLocationReceiver">
        <intent-filter>
            <action android:name="android.location.PROVIDERS_CHANGED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>

Теперь я регистрирую его в моем методе init () фрагмента:

mContext.registerReceiver(
            GpsLocationReceiver(),
            IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION)

и отменил регистрацию после завершения работы:

mContext.unregisterReceiver(GpsLocationReceiver())

Но, к сожалению, метод OnReceive () не вызывается, когда я включаю / выключаю GPS на моем устройстве. В чем может быть проблема?

Ответы [ 2 ]

1 голос
/ 21 января 2020

Из документации:

Получение первого обновления местоположения может занять некоторое время. Если требуется непосредственное местоположение, приложения могут использовать метод getLastKnownLocation (java .lang.String).

По моему опыту, обновления широковещательной рассылки происходят только при изменении местоположения. Это сделано для оптимизации времени автономной работы устройства.

1 голос
/ 21 января 2020

Вы запускаете это на Oreo или выше. Если это так, это не будет работать, поскольку android ограничивает неявные приемники вещания. https://developer.android.com/about/versions/oreo/background.html#broadcasts

Использовать явную трансляцию. Другая проблема:

mContext.registerReceiver(
        GpsLocationReceiver(),
        IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION)

Вы создаете instanceA в регистре и отменяете регистрацию нового экземпляра в незарегистрированном, который даже не был зарегистрирован.

mContext.unregisterReceiver(GpsLocationReceiver())

Используйте один и тот же экземпляр в обоих вызовах.

Когда вы используете явную широковещательную регистрацию, вам не требуется манифест, чтобы это заявить. Надеюсь, это поможет.

...