اكتشف ما إذا كان هناك اتصال بالإنترنت متاح على Android [مكرر

StackOverflow https://stackoverflow.com/questions/4238921

سؤال

أحتاج إلى اكتشاف ما إذا كان جهاز Android متصلاً بالإنترنت.

ال NetworkInfo يوفر الفصل طريقة غير قاسية isAvailable() هذا يبدو مثاليا.

المشكلة هي:

NetworkInfo ni = new NetworkInfo();
if (!ni.isAvailable()) {
    // do something
}

يلقي هذا الخطأ:

The constructor NetworkInfo is not visible.

الرهان الآمن هو أن هناك فئة أخرى تعيد أ NetworkInfo هدف. لكني لا أعرف أيها.

  1. كيف تحصل على مقتطف رمز أعلاه؟
  2. كيف يمكن أن أجد نفسي المعلومات التي احتاجها في الوثائق عبر الإنترنت؟
  3. هل يمكنك اقتراح طريقة أفضل لهذا النوع من الكشف؟
هل كانت مفيدة؟

المحلول

ال getActiveNetworkInfo() طريقة ConnectivityManager إرجاع أ NetworkInfo مثيل يمثل أول واجهة شبكة متصلة يمكن أن تجد أو null إذا لم يتم توصيل أي من الواجهات. التحقق مما إذا كانت هذه الطريقة تعود null يجب أن يكون كافياً لمعرفة ما إذا كان اتصال الإنترنت متاحًا أم لا.

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager 
          = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

ستحتاج أيضًا:

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

في بيان Android الخاص بك.

تعديل:

لاحظ أن وجود واجهة شبكة نشطة لا يضمن توفر خدمة معينة متصلة بالشبكة. يمكن أن تمنع مشكلات الشبكة ، ووقت تعطل الخادم ، والإشارة المنخفضة ، والوابات الأسيرة ، ومرشحات المحتوى وما شابه ذلك تطبيقك من الوصول إلى الخادم. على سبيل المثال ، لا يمكنك معرفة ما إذا كان تطبيقك يمكنه الوصول إلى Twitter حتى تتلقى استجابة صالحة من خدمة Twitter.

نصائح أخرى

أتحقق من كل من Wi-Fi وإنترنت الأجهزة المحمولة على النحو التالي ...

private boolean haveNetworkConnection() {
    boolean haveConnectedWifi = false;
    boolean haveConnectedMobile = false;

    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo[] netInfo = cm.getAllNetworkInfo();
    for (NetworkInfo ni : netInfo) {
        if (ni.getTypeName().equalsIgnoreCase("WIFI"))
            if (ni.isConnected())
                haveConnectedWifi = true;
        if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
            if (ni.isConnected())
                haveConnectedMobile = true;
    }
    return haveConnectedWifi || haveConnectedMobile;
}

من الواضح أنه يمكن تعديله بسهولة للتحقق من أنواع اتصال محددة فردية ، على سبيل المثال ، إذا كان تطبيقك يحتاج إلى سرعات أعلى من Wi-Fi للعمل بشكل صحيح وما إلى ذلك.

الخطوة 1: إنشاء فئة AppStatus في مشروعك (يمكنك إعطاء أي اسم آخر أيضًا). ثم يرجى لصق السطور أدناه في الكود الخاص بك:

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;


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

الخطوة 2: الآن للتحقق مما إذا كان جهازك يحتوي على اتصال بالشبكة ، فما عليك سوى إضافة مقتطف الرمز هذا في أي مكان تريد التحقق منه ...

if (AppStatus.getInstance(this).isOnline()) {

    Toast.makeText(this,"You are online!!!!",8000).show();

} else {

    Toast.makeText(this,"You are not online!!!!",8000).show();
    Log.v("Home", "############################You are not online!!!!");    
}

أيضا ملاحظة مهمة أخرى. عليك تعيين android.permission.ACCESS_NETWORK_STATE في AndroidManifest.xml لهذا العمل.

_ كيف يمكن أن أجد نفسي المعلومات التي احتاجها في الوثائق عبر الإنترنت؟

عليك فقط قراءة الوثائق الفصول بشكل صحيح بما يكفي وستجد جميع الإجابات التي تبحث عنها. تحقق من الوثائق في ConnectivityManager. يخبرك الوصف بما يجب فعله.

تقوم طريقة GetActiveNetworkInfo () لـ ConnectivityManager بإرجاع مثيل NetworkInfo الذي يمثل أول واجهة شبكة متصلة يمكن أن تجدها أو لا ، إذا لم يتم توصيل الواجهات. التحقق مما إذا كان يجب أن تكون هذه الطريقة التي يتم إرجاعها NULL كافية لمعرفة ما إذا كان اتصال الإنترنت متاحًا.

private boolean isNetworkAvailable() {
     ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
     NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
     return activeNetworkInfo != null; 
}

ستحتاج أيضًا:

في بيان Android الخاص بك.

تعديل:

لاحظ أن وجود واجهة شبكة نشطة لا يضمن توفر خدمة معينة متصلة بالشبكة. يمكن أن تمنع كل من مشكلات الشبكات ، ووقت تعطل الخادم ، والإشارة المنخفضة ، والوابات الأسيرة ، ومرشحات المحتوى وما شابه ذلك تطبيقك من الوصول إلى خادم. على سبيل المثال ، لا يمكنك معرفة ما إذا كان تطبيقك يمكنه الوصول إلى Twitter حتى تتلقى استجابة صالحة من خدمة Twitter.

لا ينبغي أن يعطي GetActivenetworkInfo () Null. لا أعرف ما الذي كانوا يفكرون فيه عندما توصلوا إلى ذلك. يجب أن يعطيك كائنا دائما.

ربما وجدت نفسي:

ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
return connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top