Android: Internet connectivity change listener
Try this
public class NetworkUtil {
public static final int TYPE_WIFI = 1;
public static final int TYPE_MOBILE = 2;
public static final int TYPE_NOT_CONNECTED = 0;
public static final int NETWORK_STATUS_NOT_CONNECTED = 0;
public static final int NETWORK_STATUS_WIFI = 1;
public static final int NETWORK_STATUS_MOBILE = 2;
public static int getConnectivityStatus(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (null != activeNetwork) {
if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
return TYPE_WIFI;
if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
return TYPE_MOBILE;
}
return TYPE_NOT_CONNECTED;
}
public static int getConnectivityStatusString(Context context) {
int conn = NetworkUtil.getConnectivityStatus(context);
int status = 0;
if (conn == NetworkUtil.TYPE_WIFI) {
status = NETWORK_STATUS_WIFI;
} else if (conn == NetworkUtil.TYPE_MOBILE) {
status = NETWORK_STATUS_MOBILE;
} else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) {
status = NETWORK_STATUS_NOT_CONNECTED;
}
return status;
}
}
And for the BroadcastReceiver
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
int status = NetworkUtil.getConnectivityStatusString(context);
Log.e("Sulod sa network reciever", "Sulod sa network reciever");
if ("android.net.conn.CONNECTIVITY_CHANGE".equals(intent.getAction())) {
if (status == NetworkUtil.NETWORK_STATUS_NOT_CONNECTED) {
new ForceExitPause(context).execute();
} else {
new ResumeForceExitPause(context).execute();
}
}
}
}
Don't forget to put this into your AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<receiver
android:name="NetworkChangeReceiver"
android:label="NetworkChangeReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>
Hope this will help you Cheers!
Broadcast receiver for checking internet connection in android app
Answer to your first question: Your broadcast receiver is being called two times because
You have added two <intent-filter>
Change in network connection :
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
Change in WiFi state:
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
Just use one:
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
.
It will respond to only one action instead of two. See here for more information.
Answer to your second question (you want receiver to call only one time if internet connection available):
Your code is perfect; you notify only when internet is available.
UPDATE
You can use this method to check your connectivity if you want just to check whether mobile is connected with the internet or not.
public boolean isOnline(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
//should check null because in airplane mode it will be null
return (netInfo != null && netInfo.isConnected());
}
Network listener Android
New java class:
public class ConnectionChangeReceiver extends BroadcastReceiver
{
@Override
public void onReceive( Context context, Intent intent )
{
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE );
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo( ConnectivityManager.TYPE_MOBILE );
if ( activeNetInfo != null )
{
Toast.makeText( context, "Active Network Type : " + activeNetInfo.getTypeName(), Toast.LENGTH_SHORT ).show();
}
if( mobNetInfo != null )
{
Toast.makeText( context, "Mobile Network Type : " + mobNetInfo.getTypeName(), Toast.LENGTH_SHORT ).show();
}
}
}
New xml in your AndroidManifest.xml under the "manifest" element:
<!-- Needed to check when the network connection changes -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
New xml in your AndroidManifest.xml under the "application" element:
<receiver android:name="com.blackboard.androidtest.receiver.ConnectionChangeReceiver"
android:label="NetworkConnection">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
How to test for active internet connection in android
Follow below code to check properly Internet is available or not as well as active or not.
//I have taken dummy icon from server, so it may be removed in future. So you can place one small icon on server and then access your own URL.
1. Specify Permission in manifest file, also make sure for marshmellwo runtime permission handle. As I am not going to show reuntime permission here.
<uses-permission android:name="android.permission.INTERNET"/>
2. Check for Internet Availibility and the State as Active or Inactive.
public class InternetDemo extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkInternetAvailibility();
}
public void checkInternetAvailibility()
{
if(isInternetAvailable())
{
new IsInternetActive().execute();
}
else {
Toast.makeText(getApplicationContext(), "Internet Not Connected", Toast.LENGTH_LONG).show();
}
}
public boolean isInternetAvailable() {
try {
ConnectivityManager connectivityManager
= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
} catch (Exception e) {
Log.e("isInternetAvailable:",e.toString());
return false;
}
}
class IsInternetActive extends AsyncTask<Void, Void, String>
{
InputStream is = null;
String json = "Fail";
@Override
protected String doInBackground(Void... params) {
try {
URL strUrl = new URL("http://icons.iconarchive.com/icons/designbolts/handstitch-social/24/Android-icon.png");
//Here I have taken one android small icon from server, you can put your own icon on server and access your URL, otherwise icon may removed from another server.
URLConnection connection = strUrl.openConnection();
connection.setDoOutput(true);
is = connection.getInputStream();
json = "Success";
} catch (Exception e) {
e.printStackTrace();
json = "Fail";
}
return json;
}
@Override
protected void onPostExecute(String result) {
if (result != null)
{
if(result.equals("Fail"))
{
Toast.makeText(getApplicationContext(), "Internet Not Active", Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(getApplicationContext(), "Internet Active " + result, Toast.LENGTH_LONG).show();
}
}
else
{
Toast.makeText(getApplicationContext(), "Internet Not Active", Toast.LENGTH_LONG).show();
}
}
@Override
protected void onPreExecute() {
Toast.makeText(getBaseContext(),"Validating Internet",Toast.LENGTH_LONG).show();
super.onPreExecute();
}
}
}
Check internet connectivity android in kotlin
Call the AsyncTask this way, it should work. You don't need to change anything in your InternetCheck AsyncTask. Basically you need to pass in an object that implements the Consumer interface that's defined in the InternetCheck class.
InternetCheck(object : InternetCheck.Consumer {
override fun accept(internet: Boolean?) {
Log.d("test", "asdasdas")
}
})
Detect if Android device has Internet connection
You are right. The code you've provided only checks if there is a network connection.
The best way to check if there is an active Internet connection is to try and connect
to a known server via http.
public static boolean hasActiveInternetConnection(Context context) {
if (isNetworkAvailable(context)) {
try {
HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
urlc.setRequestProperty("User-Agent", "Test");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(1500);
urlc.connect();
return (urlc.getResponseCode() == 200);
} catch (IOException e) {
Log.e(LOG_TAG, "Error checking internet connection", e);
}
} else {
Log.d(LOG_TAG, "No network available!");
}
return false;
}
Of course you can substitute the http://www.google.com
URL for any other server you want to connect to, or a server you know has a good uptime.
As Tony Cho also pointed out in this comment below, make sure you don't run this code on the main thread, otherwise you'll get a NetworkOnMainThread exception (in Android 3.0 or later). Use an AsyncTask or Runnable instead.
If you want to use google.com you should look at Jeshurun's modification. In his answer he modified my code and made it a bit more efficient. If you connect to
HttpURLConnection urlc = (HttpURLConnection)
(new URL("http://clients3.google.com/generate_204")
.openConnection());
and then check the responsecode for 204
return (urlc.getResponseCode() == 204 && urlc.getContentLength() == 0);
then you don't have to fetch the entire google home page first.
Related Topics
Is There on Install Event in Android
I Cant See Any Firebaserecycleradapter Items on My Layout
Android Gives Error "Cannot Fit Requested Classes in a Single Dex File"
Deadobjectexception on Android App
How to Launch Home Screen Programmatically in Android
How to Chain Async Task Sequentially (Starting One After the Previous Asynctask Completes)
Aes Gcm Implementation with Authentication Tag in Java
Jruby: Watir Is Hanging When Launching Browser
Android: How to Use Download Manager Class
Google Maps API and Custom Polyline Route Between Markers
Preload Multiple Images with Glide
How to Remove a Specific Element from a JSONarray
Rotate Marker and Move Animation on Map Like Uber Android
Encrypt with Node.Js Crypto Module and Decrypt with Java (In Android App)