Skip to content

Connectivity.isOnlineNow throws security exception #14

Description

@syarihu

Expected Behavior

This was confirmed in the crash report of an app that uses KARTE SDK.
This appears to be a bug in the Android Platform.
refs: https://issuetracker.google.com/issues/175055271

So I would like you to use runCatching or something similar to prevent crashes from occurring.

Current Behavior

Android 11 crashes with a security exception when Connectivity.isOnlineNow is called.


Possible Solution

Steps to Reproduce

I tried running the following code on my Xperia 1 II (Android 11) , but the crash was not reproduced at hand.

val manager =
    context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
manager.getNetworkCapabilities(manager.activeNetwork)
    ?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) ?: false

SDK Version

  • core 2.11.0

Android Version

  • Android 11

Build Environment

  • Android Studio Version Arctic Fox | 2020.3.1
  • Gradle Version 7.0.2
  • Android Gradle Plugin Version 7.0.0

Context Details

  • More than a dozen crash reports come up a day but I don't known user impact

Logs

Fatal Exception: java.lang.SecurityException: Package android does not belong to 10158
       at android.os.Parcel.createExceptionOrNull(Parcel.java:2373)
       at android.os.Parcel.createException(Parcel.java:2357)
       at android.os.Parcel.readException(Parcel.java:2340)
       at android.os.Parcel.readException(Parcel.java:2282)
       at android.net.IConnectivityManager$Stub$Proxy.getNetworkCapabilities(IConnectivityManager.java:2456)
       at android.net.ConnectivityManager.getNetworkCapabilities(ConnectivityManager.java:1385)
       at io.karte.android.utilities.connectivity.Connectivity.isOnlineNow(Connectivity.java:50)
       at io.karte.android.utilities.connectivity.Connectivity.isOnline(Connectivity.java:34)
       at io.karte.android.tracking.queue.Dispatcher.dequeue(Dispatcher.java:104)
       at io.karte.android.tracking.queue.Dispatcher.access$enqueue(Dispatcher.java:48)
       at io.karte.android.tracking.queue.Dispatcher$push$2.invoke(Dispatcher.java:79)
       at io.karte.android.tracking.queue.Dispatcher$push$2.invoke(Dispatcher.java:48)
       at io.karte.android.tracking.queue.DispatcherKt$sam$java_lang_Runnable$0.run(DispatcherKt.java:2)
       at android.os.Handler.handleCallback(Handler.java:938)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:223)
       at android.os.HandlerThread.run(HandlerThread.java:67)

Possible Implementation

@RequiresApi(Build.VERSION_CODES.M)
private fun isOnlineNow(context: Context): Boolean {
val manager =
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
return manager.getNetworkCapabilities(manager.activeNetwork)
?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) ?: false
}

  @RequiresApi(Build.VERSION_CODES.M)
  private fun isOnlineNow(context: Context): Boolean {
    return kotlin.runCatching {
          val manager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
          manager.getNetworkCapabilities(manager.activeNetwork)
              ?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
      }.onFailure { e ->
          Logger.e(LOG_TAG, "Failed to getNetworkCapabilities: $e")
      }.getOrNull() ?: false
  }

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions