verificar velocidad tengo studio señal puedo porque pero para medir internet disponible conexion conectar conectado conecta celular aplicacion java android broadcastreceiver android-wifi android-networking

java - tengo - velocidad de internet



Receptor de difusión para comprobar la conexión a internet en la aplicación de Android (15)

Estoy desarrollando un receptor de difusión de Android para comprobar la conexión a Internet.

El problema es que mi receptor de difusión es llamado dos veces. Quiero que se llame solo cuando la red esté disponible. Si no está disponible, no quiero ser notificado.

Este es el receptor de difusión.

public class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, final Intent intent) { final ConnectivityManager connMgr = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); final android.net.NetworkInfo wifi = connMgr .getNetworkInfo(ConnectivityManager.TYPE_WIFI); final android.net.NetworkInfo mobile = connMgr .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if (wifi.isAvailable() || mobile.isAvailable()) { // Do something Log.d("Network Available ", "Flag No 1"); } } }

Este es el archivo manifest.xml.

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.broadcastreceiverforinternetconnection" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <receiver android:name=".NetworkChangeReceiver" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> </intent-filter> </receiver> </application> </manifest>


Agregue un receptor de difusión que pueda escuchar el cambio de conectividad de la red. Luego, verifique si el dispositivo está conectado a Internet o no está utilizando ConnectivityManager. Consulte este post o video para una comprensión detallada. A continuación se muestra el código:

public class NetworkStateChangeReceiver extends BroadcastReceiver { public static final String NETWORK_AVAILABLE_ACTION = "com.ajit.singh.NetworkAvailable"; public static final String IS_NETWORK_AVAILABLE = "isNetworkAvailable"; @Override public void onReceive(Context context, Intent intent) { Intent networkStateIntent = new Intent(NETWORK_AVAILABLE_ACTION); networkStateIntent.putExtra(IS_NETWORK_AVAILABLE, isConnectedToInternet(context)); LocalBroadcastManager.getInstance(context).sendBroadcast(networkStateIntent); } private boolean isConnectedToInternet(Context context) { try { if (context != null) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); return networkInfo != null && networkInfo.isConnected(); } return false; } catch (Exception e) { Log.e(NetworkStateChangeReceiver.class.getName(), e.getMessage()); return false; } } }

Escribí este receptor para mostrar una notificación en la pantalla, por eso ve una transmisión local con el estado de la red. Aquí está el código para mostrar la notificación.

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); IntentFilter intentFilter = new IntentFilter(NetworkStateChangeReceiver.NETWORK_AVAILABLE_ACTION); LocalBroadcastManager.getInstance(this).registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { boolean isNetworkAvailable = intent.getBooleanExtra(IS_NETWORK_AVAILABLE, false); String networkStatus = isNetworkAvailable ? "connected" : "disconnected"; Snackbar.make(findViewById(R.id.activity_main), "Network Status: " + networkStatus, Snackbar.LENGTH_LONG).show(); } }, intentFilter); } }

La actividad escucha la intención emitida por el receptor de la red y muestra la notificación en la pantalla.


Aquí hay una forma cómoda de hacerlo por actividad, fragmento o contexto. También se cancelará automáticamente el registro si lo hace para la actividad / el fragmento (en onDestroy), si lo desea:

abstract class ConnectionBroadcastReceiver : BroadcastReceiver() { companion object { @JvmStatic fun registerWithoutAutoUnregister(context: Context, connectionBroadcastReceiver: ConnectionBroadcastReceiver) { context.registerReceiver(connectionBroadcastReceiver, IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)) } @JvmStatic fun registerToFragmentAndAutoUnregister(context: Context, fragment: Fragment, connectionBroadcastReceiver: ConnectionBroadcastReceiver) { val applicationContext = context.applicationContext registerWithoutAutoUnregister(applicationContext, connectionBroadcastReceiver) fragment.lifecycle.addObserver(object : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) fun onDestroy() { applicationContext.unregisterReceiver(connectionBroadcastReceiver) } }) } @JvmStatic fun registerToActivityAndAutoUnregister(activity: AppCompatActivity, connectionBroadcastReceiver: ConnectionBroadcastReceiver) { registerWithoutAutoUnregister(activity, connectionBroadcastReceiver) activity.lifecycle.addObserver(object : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) fun onDestroy() { activity.unregisterReceiver(connectionBroadcastReceiver) } }) } @JvmStatic fun hasInternetConnection(context: Context): Boolean { val info = (context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).activeNetworkInfo return !(info == null || !info.isConnectedOrConnecting) } } override fun onReceive(context: Context, intent: Intent) { val hasConnection = !intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false) // Log.d("AppLog", "conenctivity changed. hasConnection? $hasConnection") onConnectionChanged(hasConnection) } abstract fun onConnectionChanged(hasConnection: Boolean) }

Uso en fragmento:

ConnectionBroadcastReceiver.registerToFragmentAndAutoUnregister(activity!!, this, object : ConnectionBroadcastReceiver() { override fun onConnectionChanged(hasConnection: Boolean) { // Log.d("AppLog", "onConnectionChanged:" + hasConnection) } })


En primer lugar haremos una clase que verificará la conectividad del estado de la red. Así que vamos a crear una clase:

public class AppStatus { private static AppStatus instance = new AppStatus(); static Context context; ConnectivityManager connectivityManager; NetworkInfo wifiInfo, mobileInfo; boolean connected = false; public static AppStatus getInstance(Context ctx) { context = ctx.getApplicationContext(); return instance; } public boolean isOnline() { try { connectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); connected = networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected(); return connected; } catch (Exception e) { System.out.println("CheckConnectivity Exception: " + e.getMessage()); Log.v("connectivity", e.toString()); } return connected; } }

Ahora haz una nueva clase de receptor de transmisión:

public class ConnectivityReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (AppStatus.getInstance(context).isOnline()) { Intent intent1=new Intent(context,DisplayAct.class); intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent1); } else { Toast.makeText(context, "Please !! Make your network ON", Toast.LENGTH_SHORT).show(); } } }

y ahora registre su receptor de difusión en el manifiesto:

<receiver android:name=".ConnectivityReceiver"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> </receiver>


Prueba con esto

public class ConnectionBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (<Check internet connection available >) { Toast.makeText(context, "connect to the internet", Toast.LENGTH_LONG).show(); /*upload background upload service*/ Intent serviceIntent = new Intent(context,<your service class>); context.startService(serviceIntent); }else{ Toast.makeText(context, "Connection faild", Toast.LENGTH_LONG).show(); } } }

Este es el receptor de difusión. tan pronto como se active la conexión a internet esto se cargará


Sé que este hilo es antiguo y está completamente respondido, pero creo que lo siguiente podría ayudar a algunas personas.

El código en el cuerpo de la pregunta contiene un error que nadie abordó aquí. @Nikhil está comprobando si el wifi / móvil está disponible y no si está conectado.

La solución está aquí:

@Override public void onReceive(final Context context, final Intent intent) { final ConnectivityManager connMgr = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); final android.net.NetworkInfo wifi = connMgr .getNetworkInfo(ConnectivityManager.TYPE_WIFI); final android.net.NetworkInfo mobile = connMgr .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if (wifi.isConnected() || mobile.isConnected()) { // do stuff } }


Transmite el código del receptor para verificar el cambio de conectividad a internet

public class BroadCastDetecter extends BroadcastReceiver { public static boolean internet_status = false; public static void checkInternetConenction(Context context) { internet_status = false; ConnectivityManager check = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (check != null) { NetworkInfo[] info = check.getAllNetworkInfo(); if (info != null) for (int i = 0; i < info.length; i++) { if (info[i].getState() == NetworkInfo.State.CONNECTED) { internet_status = true; } } if(internet_status) { //do what you want to if internet connection is available } } } @Override public void onReceive(Context context, Intent intent) { try { checkInternetConenction(context); }catch(Exception e){ } } }

agregar esto en el archivo de manifiesto:

<receiver android:name=".BroadCastDetecter"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver>


Utilice este método para verificar el estado de la red:

private void checkInternetConnection() { if (br == null) { br = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Bundle extras = intent.getExtras(); NetworkInfo info = (NetworkInfo) extras .getParcelable("networkInfo"); State state = info.getState(); Log.d("TEST Internet", info.toString() + " " + state.toString()); if (state == State.CONNECTED) { Toast.makeText(getApplicationContext(), "Internet connection is on", Toast.LENGTH_LONG).show(); } else { Toast.makeText(getApplicationContext(), "Internet connection is Off", Toast.LENGTH_LONG).show(); } } }; final IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver((BroadcastReceiver) br, intentFilter); } }

Recuerde que debe anular el registro de servicio en onDestroy.

¡¡Aclamaciones!!


manifiesto:

<receiver android:name=".your.namepackage.here.ConnectivityReceiver"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> </receiver>

clase para el receptor:

public class ConnectivityReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); switch (action) { case ConnectivityManager.CONNECTIVITY_ACTION: DebugUtils.logDebug("BROADCAST", "network change"); if(NetworkUtils.isConnect()){ //do action here } break; } } }

y clases de clases como ejemplo:

public class NetworkUtils { public static boolean isConnect() { ConnectivityManager connectivityManager = (ConnectivityManager) Application.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Network[] netArray = connectivityManager.getAllNetworks(); NetworkInfo netInfo; for (Network net : netArray) { netInfo = connectivityManager.getNetworkInfo(net); if ((netInfo.getTypeName().equalsIgnoreCase("WIFI") || netInfo.getTypeName().equalsIgnoreCase("MOBILE")) && netInfo.isConnected() && netInfo.isAvailable()) { //if (netInfo.getState().equals(NetworkInfo.State.CONNECTED)) { Log.d("Network", "NETWORKNAME: " + netInfo.getTypeName()); return true; } } } else { if (connectivityManager != null) { @SuppressWarnings("deprecation") NetworkInfo[] netInfoArray = connectivityManager.getAllNetworkInfo(); if (netInfoArray != null) { for (NetworkInfo netInfo : netInfoArray) { if ((netInfo.getTypeName().equalsIgnoreCase("WIFI") || netInfo.getTypeName().equalsIgnoreCase("MOBILE")) && netInfo.isConnected() && netInfo.isAvailable()) { //if (netInfo.getState() == NetworkInfo.State.CONNECTED) { Log.d("Network", "NETWORKNAME: " + netInfo.getTypeName()); return true; } } } } } return false; } }


solo para alguien que quiera registrar una transmisión dinámicamente:

BroadcastReceiver mWifiReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (checkWifiConnect()) { Log.d(TAG, "wifi has connected"); // TODO } } }; private void registerWifiReceiver() { IntentFilter filter = new IntentFilter(); filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); mContext.registerReceiver(mWifiReceiver, filter); } private void unregisterWifiReceiver() { mContext.unregisterReceiver(mWifiReceiver); } private boolean checkWifiConnect() { ConnectivityManager manager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = manager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) { return true; } return false; }


Documentos de CONECTIVIDAD_ACCIÓN :

Las aplicaciones dirigidas a Android 7.0 (nivel de API 24) y superiores no reciben esta transmisión si declaran el receptor de difusión en su manifiesto. Las aplicaciones seguirán recibiendo transmisiones si registran su BroadcastReceiver con Context.registerReceiver () y ese contexto sigue siendo válido.


Comprobar Intenert Cada vez que use Broadcast Receiver Igual que Youtube Vaya a en línea, fuera de línea

Código fuente

https://drive.google.com/open?id=0BzBKpZ4nzNzUYjhZamFIZTh6VTQ

AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <receiver android:name=".receivers.NetworkChangeReceiver"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver>

BroadcastReciever

package com.keshav.networkchangereceiverexample.receivers; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.util.Log; import static com.keshav.networkchangereceiverexample.MainActivity.dialog; public class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { try { if (isOnline(context)) { dialog(true); Log.e("keshav", "Online Connect Intenet "); } else { dialog(false); Log.e("keshav", "Conectivity Failure !!! "); } } catch (NullPointerException e) { e.printStackTrace(); } } private boolean isOnline(Context context) { try { 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()); } catch (NullPointerException e) { e.printStackTrace(); return false; } } } ================================================================= package com.keshav.networkchangereceiverexample; import android.content.BroadcastReceiver; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Color; import android.net.ConnectivityManager; import android.os.Build; import android.os.Handler; import android.os.Looper; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.TextView; import com.keshav.networkchangereceiverexample.receivers.NetworkChangeReceiver; public class MainActivity extends AppCompatActivity { private BroadcastReceiver mNetworkReceiver; static TextView tv_check_connection; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_check_connection=(TextView) findViewById(R.id.tv_check_connection); mNetworkReceiver = new NetworkChangeReceiver(); registerNetworkBroadcastForNougat(); } public static void dialog(boolean value){ if(value){ tv_check_connection.setText("We are back !!!"); tv_check_connection.setBackgroundColor(Color.GREEN); tv_check_connection.setTextColor(Color.WHITE); Handler handler = new Handler(); Runnable delayrunnable = new Runnable() { @Override public void run() { tv_check_connection.setVisibility(View.GONE); } }; handler.postDelayed(delayrunnable, 3000); }else { tv_check_connection.setVisibility(View.VISIBLE); tv_check_connection.setText("Could not Connect to internet"); tv_check_connection.setBackgroundColor(Color.RED); tv_check_connection.setTextColor(Color.WHITE); } } private void registerNetworkBroadcastForNougat() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); } } protected void unregisterNetworkChanges() { try { unregisterReceiver(mNetworkReceiver); } catch (IllegalArgumentException e) { e.printStackTrace(); } } @Override public void onDestroy() { super.onDestroy(); unregisterNetworkChanges(); } } ============================================================== activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.keshav.networkchangereceiverexample.MainActivity"> <TextView android:id="@+id/tv_check_connection" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Connection establised !" android:padding="25dp" app:layout_constraintBottom_toBottomOf="parent" android:gravity="center" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </LinearLayout>


Responda a su primera pregunta : su receptor de difusión se llama dos veces porque

Has añadido dos <intent-filter>

  1. Cambio en la conexión de red:
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

  2. Cambio en el estado de WiFi:
    <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />

Solo usa uno:
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> .

Responderá a una sola acción en lugar de dos. Vea here para más información.

Responda a su segunda pregunta (desea que el receptor llame solo una vez si hay conexión a internet disponible):

Tu código es perfecto; Usted notifica solo cuando internet esta disponible.

ACTUALIZAR

Puede usar este método para verificar su conectividad si solo quiere verificar si el móvil está conectado a Internet o no.

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()); }


public class AsyncCheckInternet extends AsyncTask<String, Void, Boolean> { public static final int TIME_OUT = 10 * 1000; private OnCallBack listener; public interface OnCallBack { public void onBack(Boolean value); } public AsyncCheckInternet(OnCallBack listener) { this.listener = listener; } @Override protected void onPreExecute() { } @Override protected Boolean doInBackground(String... params) { ConnectivityManager connectivityManager = (ConnectivityManager) General.context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if ((networkInfo != null && networkInfo.isConnected()) && ((networkInfo.getType() == ConnectivityManager.TYPE_WIFI) || (networkInfo .getType() == ConnectivityManager.TYPE_MOBILE))) { HttpURLConnection urlc; try { urlc = (HttpURLConnection) (new URL("http://www.google.com") .openConnection()); urlc.setConnectTimeout(TIME_OUT); urlc.connect(); if (urlc.getResponseCode() == HttpURLConnection.HTTP_OK) { return true; } else { return false; } } catch (MalformedURLException e) { e.printStackTrace(); return false; } catch (IOException e) { e.printStackTrace(); return false; } } else { return false; } } @Override protected void onPostExecute(Boolean result) { if (listener != null) { listener.onBack(result); } }

}


public class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, final Intent intent) { if(checkInternet(context)) { Toast.makeText(context, "Network Available Do operations",Toast.LENGTH_LONG).show(); } } boolean checkInternet(Context context) { ServiceManager serviceManager = new ServiceManager(context); if (serviceManager.isNetworkAvailable()) { return true; } else { return false; } } }

ServiceManager.java

public class ServiceManager { Context context; public ServiceManager(Context base) { context = base; } public boolean isNetworkAvailable() { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); return networkInfo != null && networkInfo.isConnected(); } }

permisos:

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


public static boolean isNetworkAvailable(Context context) { boolean isMobile = false, isWifi = false; NetworkInfo[] infoAvailableNetworks = getConnectivityManagerInstance( context).getAllNetworkInfo(); if (infoAvailableNetworks != null) { for (NetworkInfo network : infoAvailableNetworks) { if (network.getType() == ConnectivityManager.TYPE_WIFI) { if (network.isConnected() && network.isAvailable()) isWifi = true; } if (network.getType() == ConnectivityManager.TYPE_MOBILE) { if (network.isConnected() && network.isAvailable()) isMobile = true; } } } return isMobile || isWifi; } /* You can write such method somewhere in utility class and call it NetworkChangeReceiver like below */ public class NetworkChangedReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (isNetworkAvailable(context)) { Toast.makeText(context, "Network Available Do operations",Toast.LENGTH_LONG).show(); } } }

Este receptor de difusión anterior se llamará solo cuando el estado de la red cambie a conectado y no se desconecte.