Comprobación de conectividad no funciona en Android Oreo Kotlin

Intentando llamar al receptor de difusión llamado NetworkReceiver en el cambio de networking. El mismo código en Java funciona, pero no funciona al intentar hacerlo en Kotlin. El receptor nunca se invoca cuando ocurre la connection o cuando se pierde. Estoy tratando de hacerlo en emulador. Además, no se llama al receptor cuando se completa el arranque. También estoy probando esto en Android Oreo, es decir, Android 8.0

NetworkReceiver.kt 
 class NetworkReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { Logs.v("onReceive") val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val networkInfo = connectivityManager.activeNetworkInfo if (networkInfo != null && networkInfo.detailedState == NetworkInfo.DetailedState.CONNECTED) { Logs.v("Network Connected") } else if (networkInfo != null) { val state = networkInfo.detailedState Logs.v("NetworkReceiver", state.name) } else { Logs.v("Network Connected") } } } 

Manifest.xml

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.test.android.client"> <!-- To auto-complete the email text field in the login form with the user's emails --> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.READ_PROFILE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application android:name=".application.App" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <receiver android:name=".network.NetworkReceiver"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> </intent-filter> </receiver> <activity android:name=".views.activities.kt.LoginActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".views.activities.kt.DashboardActivity" android:label="@string/title_activity_dashboard" android:theme="@style/AppTheme.NoActionBar" /> <activity android:name=".views.activities.kt.ConfigurationActivity" android:label="@string/title_activity_configuration" android:theme="@style/AppTheme.NoActionBar"/> </application> </manifest> 

Necesitas este permiso para escuchar el inicio completado:

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 

Intenta declarar tu receptor de difusión en el manifiesto de esta manera:

 <receiver android:name=".network.NetworkReceiver" android:enabled="true" android:exported="false"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> <action android:name="android.intent.action.BOOT_COMPLETED"/> <action android:name="android.intent.action.QUICKBOOT_POWERON" /> <action android:name="android.net.wifi.WIFI_STATE_CHANGED"/> </intent-filter> </receiver> 

En Oreo, el comportamiento del receptor de difusión ha cambiado, es mucho más restringido. Me sorprende que diga "funciona en Java".

De todos modos, deberá leer los cambios de "Oreo". Y algunas cosas faltan en tu aplicación. Debes configurar android:enabled="true" en el manifiesto en tu receptor y debes llamar …

 registerReceiver(MyNetworkReceiver(), IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"))` 

… desde su aplicación (probablemente en onCreate) para recibir cambios de estado de connection mientras se ejecuta su aplicación (también se activará al inicio de la aplicación). Es posible que también deba configurar android:export="true" en el manifiesto (para recibir transmisiones de acciones de la list blanca).

  • Kotlin: No se puede encontrar la class de símbolo Fragmento u otras classs de Android
  • Referencia no resuelta: kotlinx
  • Kotlin: configuration de un boolean privado en class Java a través de una class de datos en Kotlin. ¿Por qué no puedo hacer esto?
  • Tipo de interferencia fallida. No coinciden los types esperados: requiere un par de cadenas encontrado <String, String> en Kotlin y Anko
  • La variable de vista de Kotlin es inesperadamente nula en el método Activity onCreate
  • Función de extensión de llamada dentro de la class Java como cualquier operador de RX
  • ¿Cuál es la forma correcta de declarar el tipo de variable en Android con Kotlin?
  • Kotlinx no puede resolver el símbolo "sintético"
  • La function Kotlin requiere nada, pero se define como un tipo diferente
  • Extensiones de Kotlin para Android, los packages no se pueden importar
  • Cómo inicializar widgets en Android usando kotlin