Überprüfen Sie die Internetverbindung

70

Gibt es ein Android Intent ACTION_XXX, das mich benachrichtigt, wenn eine Internetverbindung verfügbar ist?

Ich möchte eine instanziieren BroadcastReceiver, die meine Anwendung benachrichtigt, wenn ein Benutzer die Internetverbindung aktiviert (über WLAN, über GSM usw.).

Könnte mir jemand helfen?

CeccoCQ
quelle

Antworten:

161
<receiver android:name=".YOURRECEIVER">
   <intent-filter>
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
   </intent-filter>
</receiver>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
fedj
quelle
27
Dieser Code funktioniert aus diesem
Grund
Ja, die Antwort sollte für zukünftige Referenzen aktualisiert werden.
Sarthak Mittal
5
@ShreyashSSarnayak Es ist richtig. Ich würde hinzufügen, beginnend mit Android N müssen Sie Ihren Rundfunkempfänger in der Aktivität registrieren (und die Registrierung aufheben). Wenn Sie dies im XML-Manifest belassen, wird die Fähigkeit Ihrer Aktivität, die Konnektivitätsänderung auf Android N zu empfangen, nicht beeinträchtigt. Nur eine Klarstellung für diejenigen, die sich fragen.
Severin.Julien
1
Apps für Android 7.0 (API-Level 24) und höher empfangen keine CONNECTIVITY_ACTION-Broadcasts, wenn sie den Broadcast-Empfänger in ihrem Manifest deklarieren. Apps erhalten weiterhin CONNECTIVITY_ACTION-Broadcasts, wenn sie ihren BroadcastReceiver bei Context.registerReceiver () registrieren und dieser Kontext weiterhin gültig ist.
Vivek Verma
127

Akzeptierte Antwort ist richtig. Ich füge nur Empfängercode zur Vervollständigung hinzu:

public class NetworkStateReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
     Log.d("app","Network connectivity change");
     if(intent.getExtras()!=null) {
        NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO);
        if(ni!=null && ni.getState()==NetworkInfo.State.CONNECTED) {
            Log.i("app","Network "+ni.getTypeName()+" connected");
        } else if(intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)) {
            Log.d("app","There's no network connectivity");
        }
   }
}
lujop
quelle
26
BroadcastReceiver.onReceiveist abstrakt, Sie können also nicht anrufen super.onReceive(context, intent);.
Felipe Lima
3
Wo haben Sie gesucht (Dokumentation), um den Inhalt des getExtras () Bundles herauszufinden?
Ярослав Рахматуллин
56

Update auf @lujop Antwort:

public class NetworkStateReceiver extends BroadcastReceiver {
    private static final String TAG = "NetworkStateReceiver";

    @Override
    public void onReceive(final Context context, final Intent intent) {

        Log.d(TAG, "Network connectivity change");

        if (intent.getExtras() != null) {
            final ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
            final NetworkInfo ni = connectivityManager.getActiveNetworkInfo();

            if (ni != null && ni.isConnectedOrConnecting()) {
                Log.i(TAG, "Network " + ni.getTypeName() + " connected");
            } else if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) {
                Log.d(TAG, "There's no network connectivity");
            }
        }
    }
}
Felipe Lima
quelle
5
Danke für deine Antwort. Sie haben das Problem der veralteten gelöst EXTRA_NETWORK_INFO. +1
Sami Eltamawy
2
Obwohl dies besser zu funktionieren scheint, wird die Meldung "Keine Netzwerkverbindung" nie
Herr Pablo,
Was ist der Kontext hier aus?
Bhargav
1
@ MrPablo und alle anderen, die das gleiche Problem haben, müssen Sie WLAN auf dem Empfänger registrieren, wie z. B. <Empfänger android: name = "com.swipeclock.android.network.receivers.NetworkStateReceiver"> <intent-filter> <action android: name = "android .net.wifi.supplicant.CONNECTION_CHANGE "/> <action android: name =" android.net.wifi.STATE_CHANGE "/> <action android: name =" android.net.conn.CONNECTIVITY_CHANGE "/> </ intent-filter > </ empfänger>
Marc Niceler
19

MyReceiver.java

public class MyReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {

        if(isConnected(context)) Toast.makeText(context, "Connected.", Toast.LENGTH_LONG).show();
        else Toast.makeText(context, "Lost connect.", Toast.LENGTH_LONG).show();
    }

    public boolean isConnected(Context context) {
        ConnectivityManager cm =
                (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        boolean isConnected = activeNetwork != null &&
                              activeNetwork.isConnected();
        return isConnected;
    }
}

AndroidManifest.xml

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

AKTUALISIEREN

Wenn Ihre App auf API-Level 26 oder höher abzielt, können Sie das Manifest nicht verwenden, um einen Empfänger für implizite Broadcasts zu deklarieren (Broadcasts, die nicht speziell auf Ihre App abzielen), mit Ausnahme einiger impliziter Broadcasts, die von dieser Einschränkung ausgenommen sind. In den meisten Fällen können Sie stattdessen geplante Jobs verwenden.

Verwendung connection = MyReceiver()

// onCreate - onDestroy, onResume - onPause depends on you
override fun onStart() {
    super.onStart()
    registerReceiver(connection, IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION))
  }

override fun onStop() {
    super.onStop()
    // remember unregister to avoid leak
    unregisterReceiver(connection)
  }

UPDATE 2

CONNECTIVITY_ACTIONDiese Konstante wurde in API - Ebene veraltet 28. apps die vielseitiger verwenden sollten requestNetwork(NetworkRequest, PendingIntent), registerNetworkCallback(NetworkRequest, PendingIntent)oder registerDefaultNetworkCallback(ConnectivityManager.NetworkCallback)stattdessen die Funktionen für eine schnellere und detailliertere Updates über das Netzwerk ändert , was sie interessiert.

weil es added in API level 22so oben Code funktioniert auf allen Versionen von Android gut

vuhung3990
quelle
Entschuldigung, Sir, Sie können mehr hier sehen oder googeln: stackoverflow.com/questions/14701422/…
vuhung3990
Hallo, können Sie dies bitte beantworten stackoverflow.com/questions/28294677/…
JRE.exe
Sie können einen Ping-
Befehl senden
17

Der fehlende Teil aller Antworten erinnert Sie daran, sich für diese Aktion zu registrieren:

IntentFilter filter = new IntentFilter();
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(your_receiver, filter);
hasan
quelle
4
Die akzeptierte Antwort registriert den Hörer. Dies geschieht nur in XML im Manifest, nicht in Code, wie Sie es vorschlagen.
Ridcully
@Ridcully Ich denke, neuere Versionen des SDK (über 22?) Rufen den Empfänger nicht automatisch an, wie sie es früher getan haben.
Brill Pappin
1
@BrillPappin Sie haben Recht - siehe Kommentar zur akzeptierten Antwort, der auf einen neuen Abschnitt in der Android SDK-Dokumentation verweist: developer.android.com/training/monitoring-device-state/…
Ridcully
8

Ich verwende Broadcast, um die Verbindung jedes Mal zu überprüfen. Erstellen Sie eine Klasse für Verbindungsinformationen.

import android.content.Context;
import android.content.ContextWrapper;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;


public class ConnectivityStatus extends ContextWrapper{

    public ConnectivityStatus(Context base) {
        super(base);
    }

    public static boolean isConnected(Context context){

        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo connection = manager.getActiveNetworkInfo();
        if (connection != null && connection.isConnectedOrConnecting()){
            return true;
        }
        return false;
    }
}

Wenden Sie Code in Ihre Aktivität an:

 private BroadcastReceiver receiver = new BroadcastReceiver() {
 @Override
 public void onReceive(Context context, Intent intent) {
        if(!ConnectivityStatus.isConnected(getContext())){
            // no connection
        }else {
            // connected
        }
    }
 };

Registrieren Sie die Sendung in der onCreate()Methode Ihrer Aktivität :

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout);
    your_activity_context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
    ..
    ...
    ....
  }

Vergessen Sie nicht, sich im Aktivitätszyklus abzumelden / zu registrieren:

@Override
protected void onResume() {
    super.onResume();
    your_activity_context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

}

@Override
protected void onPause() {
    super.onPause();
    your_activity_context.unregisterReceiver(receiver);

}
W4R10CK
quelle
1
Ihre Lösung ist die beste und einfachste Lösung, die ich gefunden habe. Danke :)
Ahmad Moussa
ConnectivityManager.CONNECTIVITY_ACTIONist jetzt veraltet.
Tahsin Rupam
8

Dieser Code funktioniert (in allen Versionen), da die Manifestregistrierung für Geräte ab 7 (API 25 und höher) nicht funktioniert. Siehe diesen Link .

private void foo(){
    registerReceiver(connectionBroadcastReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}

private BroadcastReceiver connectionBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent == null || intent.getExtras() == null)
           return;

        ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = cm.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.getState() == NetworkInfo.State.CONNECTED) {  
            // connected
        } 
    }
};
Nicky
quelle
Können Sie erklären, was eine foo()Methode ist und wo / wie ich sie anwenden soll? Vielen Dank.
Dumbo
@EJusius registriert den Empfänger in onResumeund hebt die Registrierung aufonPause
Santhosh
Was ist, wenn ich Netzwerkänderungen erkennen möchte, wenn die App / Aktivität nicht ausgeführt wird?
Mohaimanul Chowdhury
6

Weiter miau mwo's Antwort

Sie können den Empfänger aktivieren / deaktivieren, indem Sie:

aktivieren

 ComponentName receiver = new ComponentName(MainActivity.this, MyReceiver.class);
       PackageManager pm = this.getPackageManager();
       pm.setComponentEnabledSetting(receiver,
               PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
               PackageManager.DONT_KILL_APP);
       Toast.makeText(this, "Disabled broadcst receiver", Toast.LENGTH_SHORT).show();
   }

deaktivieren

ComponentName receiver = new ComponentName(MainActivity.this, MyReceiver.class);
       PackageManager pm = this.getPackageManager();
       pm.setComponentEnabledSetting(receiver,
               PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
               PackageManager.DONT_KILL_APP);
       Toast.makeText(this, "Enabled broadcast receiver", Toast.LENGTH_SHORT).show();
   }

Dabei kann dasselbe in einem Intent oder in onCreate aufgerufen werden

JRE.exe
quelle
2
Tippfehler?: Ich denke, Sie wollen "deaktivieren" für "aktivieren" und umgekehrt.
JDOaktown
3

NetworkInfo.isConnected()ist eine unzuverlässige Methode zum Testen des Internetstatus. Sie gibt true zurück, wenn eine Netzwerkverbindung besteht, obwohl sie möglicherweise keinen Internetzugang hat (z. B. WLAN ohne Internet). Ein zuverlässigerer Ansatz wäre die Verwendung pingmit CONNECTIVITY_ACTION BroadcastReceiver:

private void registerInternetReceiver()
{
    if (this.internetReceiver != null) return;
    this.internetReceiver = new BroadcastReceiver()
    {
        @Override
        public void onReceive (Context context, Intent intent)
        {
            if (isInternetAvailable()) Log.i ("Tag", "internet status online");
            else Log.i ("Tag", "internet status offline");
        }
    };
    IntentFilter filter = new IntentFilter();
    filter.addAction (ConnectivityManager.CONNECTIVITY_ACTION);
    registerReceiver (internetReceiver, filter);
}

private boolean isInternetAvailable()
{
    try
    {
        return (Runtime.getRuntime().exec ("ping -c 1 google.com").waitFor() == 0);
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }
    return false;
}
Razz
quelle
2
**Also worked on above Android 7.0**

// AndroidManifest.xml

 <service
            android:name=".NetworkSchedulerService"
            android:exported="true"
            android:permission="android.permission.BIND_JOB_SERVICE"/>


// MyApplication.java           

import  android.app.Application;
import android.app.job.JobInfo;
import android.app.job.JobScheduler;
import android.content.ComponentName;
import android.content.Context;
public class MyApplication extends Application {

    private static Context context;

    public static Context getContext() {
        return context;
    }

    public static final String TAG = MyApplication.class.getSimpleName();

    private static MyApplication mInstance;


    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
        mInstance = this;
        scheduleJob();
    }

    public static synchronized MyApplication getInstance() {
        return mInstance;
    }

    private void scheduleJob()
    {
        JobInfo myJob = new JobInfo.Builder(0, new ComponentName(this, NetworkSchedulerService.class))
                .setRequiresCharging(true)
                .setMinimumLatency(1000)
                .setOverrideDeadline(2000)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                .setPersisted(true)
                .build();

        JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
        assert jobScheduler != null;
        jobScheduler.schedule(myJob);
    }
}   


// Constants.java   

public class Constants {
    public static final String CONNECT_TO_WIFI = "WIFI";
    public static final String CONNECT_TO_MOBILE = "MOBILE";
    public static final String NOT_CONNECT = "NOT_CONNECT";
    public final static String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
}


// LiveConnectivityReceiver.java    

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

public class LiveConnectivityReceiver extends BroadcastReceiver {

    private MConnectivityReceiver mConnectivityReceiver;
    LiveConnectivityReceiver(MConnectivityReceiver listener) {
        mConnectivityReceiver = listener;
    }


    @Override
    public void onReceive(Context context, Intent intent) {
        mConnectivityReceiver.onNetworkConnectionChanged(isConnected(context));

    }

    public static boolean isConnected(Context context) {
        ConnectivityManager cm = (ConnectivityManager)
                context.getSystemService(Context.CONNECTIVITY_SERVICE);
        assert cm != null;
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
    }

    public interface MConnectivityReceiver {
        void onNetworkConnectionChanged(boolean isConnected);
    }
}   


// MainActivity.java    

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private BroadcastReceiver mReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    @Override
    protected void onStop() {
        stopService(new Intent(this, NetworkSchedulerService.class));
        super.onStop();
    }

    @Override
    protected void onStart() {
        super.onStart();
        startService( new Intent(this, NetworkSchedulerService.class));
    }


    @Override
    protected void onPause() {
        super.onPause();
        this.unregisterReceiver(this.mReceiver);
    }

    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter intentFilter = new IntentFilter("android.intent.action.MAIN");
        mReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                boolean isConnection = intent.getBooleanExtra("VALUE", false);
                if (!isConnection) {
                    Toast.makeText(context, "No Internet Connection", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(context, "Back to online", Toast.LENGTH_SHORT).show();
                }
            }
        };
        this.registerReceiver(mReceiver, intentFilter);
    }
}   


// NetworkSchedulerService.java 


import android.app.job.JobParameters;
import android.app.job.JobService;
import android.content.Intent;
import android.content.IntentFilter;

public class NetworkSchedulerService extends JobService implements LiveConnectivityReceiver.ConnectivityReceiverListener 
{

    private LiveConnectivityReceiver mLiveConnectivityReceiver;

    @Override
    public void onCreate()
    {
        super.onCreate();
        mLiveConnectivityReceiver = new LiveConnectivityReceiver(this);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_NOT_STICKY;
    }

    @Override
    public boolean onStartJob(JobParameters params) {
        registerReceiver(mLiveConnectivityReceiver, new IntentFilter(Constants.CONNECTIVITY_ACTION));
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        unregisterReceiver(mLiveConnectivityReceiver);
        return true;
    }

    @Override
    public void onNetworkConnectionChanged(boolean isConnected)
    {
        Intent broadcastedIntent=new Intent("android.intent.action.MAIN");
        broadcastedIntent.putExtra("VALUE", isConnected);
        sendBroadcast(broadcastedIntent);
    }
}
Coldfin Lab
quelle
1

Unter Android 7 ++ funktioniert die Antwort von @ fedj nicht, aber Sie können den Rundfunkempfänger programmgesteuert registrieren.

Apps für Android 7.0 (API-Level 24) und höher empfangen keine CONNECTIVITY_ACTION-Broadcasts, wenn sie den Broadcast-Empfänger in ihrem Manifest deklarieren. Apps erhalten weiterhin CONNECTIVITY_ACTION-Broadcasts, wenn sie ihren BroadcastReceiver bei Context.registerReceiver () registrieren und dieser Kontext weiterhin gültig ist.

Zumry Mohamed
quelle
0

Ich würde die für nougat + aktualisierten Dokumente lesen, da die Absicht aufgrund der Anzahl der Geräte veraltet ist und Netzwerkinformationen allein nicht ausreichen. Ich würde dort Befehle und Variablen des Konnektivitätsmanagers (Konnektivitätsaktion, dort Variablen hinzufügen) verwenden, da sich die meisten allein im letzten Jahr geändert haben. Aktivieren Sie zum Testen die immer aktiven Zelldaten, die ausführliche Protokollierung und die aggressive Übergabe und verwenden Sie bei Bedarf den WLAN-Filter ::

https://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION

kbrackson
quelle
0

** Sie können diese Codezeile in die Hilfsmethoden einfügen und aufrufen, wenn Sie die Internetverbindung überprüfen möchten **

public static class InternetState {
    static ConnectivityManager cm;

    static public boolean isConnected(Context context) {
        try {
            cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        } catch (NullPointerException e) {

        }

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
        return isConnected;
    }
}
Usama El Gindy
quelle