1

How can I make something in my Java constantly check for connectivity of internet I already have something that checks for connectivity of internet but do not know how to make it constant

Current connectivity checker

public static boolean isNetworkAvailable(Context context) {
 
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
 
        if (connectivityManager != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());
                return capabilities != null && (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET));
            } else {
                NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();
                return activeNetwork != null && activeNetwork.isConnected();
 
            }
        }
 
        return false;
    }]
Alexis
  • 11
  • 1
  • @RickyMo no that doesn't have anything to do with constantly checking for a connectivity – Alexis Jan 21 '22 at 02:45
  • Why not? All you need is to set up a timer to run your function repeatedly. – Ricky Mo Jan 21 '22 at 02:46
  • In everything I have read That's not the best way to do it and not a good way at all – Alexis Jan 21 '22 at 02:48
  • Given that your function is just checking the network interface connectivity instead of pinging a server, you better off [detect network state change](https://stackoverflow.com/questions/25678216/android-internet-connectivity-change-listener). However, if you want to check "real" internet connectivity, there is no alternative way other than to ping a server regularly. – Ricky Mo Jan 21 '22 at 02:50
  • How is it real internet connectivity aren't you detecting it either way – Alexis Jan 21 '22 at 02:52
  • Just having Wi-Fi or cellular "connected" doesn't necessary mean that you have internet access. For example, you may be connecting to an isolated LAN without internet access via a Wi-Fi router. – Ricky Mo Jan 21 '22 at 02:54
  • Like I'm just trying to detect whether there's internet connectivity or not so this way when there's no internet it automatically shows that there's no internet here's the main activity Java https://pastebin.com/RX8YdWKN – Alexis Jan 21 '22 at 02:55

1 Answers1

0

I have done it in Kotlin. If you face problem in converting Kotlin into Java you can ask me for help.

So, I am using Broadcast Receiver and detect whenever the network state changed and when there is no Internet, a dialogBox will show.

MainActivity.kt

class MainActivity : AppCompatActivity() {

    private var br: BroadcastReceiver? = null
    private var filter: IntentFilter? = null
    private var mContext: MainActivity? = null
    private var isPaused = false
    private var toConfirm = true
    private var noInternetBuilder: AlertDialog.Builder? = null
    private var noInternetDialog: AlertDialog? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        br = MyBroadCastReceiver()
        filter = IntentFilter()
        filter?.addAction("android.net.conn.CONNECTIVITY_CHANGE")
        mContext = this@MainActivity
        mContext?.registerReceiver(br, filter)
    }

    /**
     * Broadcast for Internet Checking
     *
     */
    inner class MyBroadCastReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            if (!isNetworkStatusAvailable(this@MainActivity)) {
                if (!isPaused) {
                    toConfirm = true
                    if (noInternetDialog != null) {
                        noInternetDialog?.dismiss()
                    }
                    showDialogNoInternet(this@MainActivity)
                }
                toConfirm = false
            } else {
                toConfirm = true
                if (noInternetDialog != null) {
                    if (noInternetDialog!!.isShowing) {
                        noInternetDialog?.dismiss()
                    }
                }
            }
        }
    }

    fun isNetworkStatusAvailable(context: Context): Boolean {
        var result = false
        val connectivityManager =
            context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            val networkCapabilities = connectivityManager.activeNetwork ?: return false
            val actNw =
                connectivityManager.getNetworkCapabilities(networkCapabilities) ?: return false
            result = when {
                actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
                actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
                actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
                else -> false
            }
        } else {
            @Suppress("DEPRECATION")
            connectivityManager.run {
                connectivityManager.activeNetworkInfo?.run {
                    result = when (type) {
                        ConnectivityManager.TYPE_WIFI -> true
                        ConnectivityManager.TYPE_MOBILE -> true
                        ConnectivityManager.TYPE_ETHERNET -> true
                        else -> false
                    }

                }
            }
        }
        return result
    }

    fun showDialogNoInternet(activity: Activity) {
    noInternetBuilder = AlertDialog.Builder(activity)
    val viewGroup = findViewById<ViewGroup>(android.R.id.content)
    val dialogView: View = LayoutInflater.from(viewGroup.context)
        .inflate(R.layout.dialog_nointernet, viewGroup, false)
    noInternetBuilder!!.setView(dialogView)
    noInternetDialog = noInternetBuilder!!.create()
    noInternetDialog!!.setCancelable(false)
    noInternetDialog!!.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
    val btn = dialogView.findViewById<View>(R.id.btnOkInternet) as Button
    btn.setOnClickListener {
        resultInternetLauncher.launch(Intent(Settings.ACTION_WIFI_SETTINGS))
        noInternetDialog?.dismiss()
    }
    noInternetDialog!!.show()
}

    override fun onPause() {
        super.onPause()
        isPaused = true
    }

    override fun onResume() {
        super.onResume()
        isPaused = false
        if (!toConfirm) {
            if (noInternetDialog != null) {
                noInternetDialog?.dismiss()
            }
            showDialogNoInternet(mContext!!)
        }
    }
}

Must implement override fun onPause() and override fun onResume() along with it because it will control the crashes of dialogBox.