কানেক্টিভিটি ম্যানেজার getNetworkInfo (int) অবমূল্যায়িত হয়েছে


144

কম্পাইলএসডকভিশন 23 ব্যবহার করে তবে 9 হিসাবে সমর্থন করার চেষ্টা করছে।

getNetworkInfo(int)23-এ অসমর্থিত হয়েছে প্রস্তাবনা ব্যবহার ছিল getAllNetworks()এবং getNetworkInfo(Network)পরিবর্তে। তবে এই উভয়টিরই সর্বনিম্ন 21 এপিআই প্রয়োজন।

এমন কোনও শ্রেণি রয়েছে যা আমরা সমর্থন প্যাকেজে ব্যবহার করতে পারি যা এর সাথে সহায়তা করতে পারে?

আমি জানি যে এর আগে একটি সমাধান প্রস্তাব করা হয়েছিল , তবে আমার 9 টির ন্যূনতম এপিআই প্রয়োজনীয়তাগুলির চ্যালেঞ্জ একটি সমস্যা তৈরি করেছে।


আপনি রানটাইমে বিল্ড সংস্করণটি পরীক্ষা করতে পারেন এবং উপযুক্ত পদ্ধতিটি ব্যবহার করতে পারেন
স্টাইনপাইক

1
এটি কি অবহেলিত সতর্কতাটি ফেলে দেবে?
কাইলড

দয়া করে আমার কানেকটিভিটিঅবেসভার ক্লাসটি চেকআউট করুন যা অ্যান্ড্রয়েড নুগাটের নীচে এবং তারপরে এপিআই পদ্ধতিগুলিকে আবদ্ধ করে।
জেজেডি

উত্তর:


165

তুমি ব্যবহার করতে পার:

getActiveNetworkInfo ();

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null) { 
    // connected to the internet
    if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
        // connected to wifi
    } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
        // connected to mobile data
    }
} else {
    // not connected to the internet
}

বা একটি সুইচ ক্ষেত্রে

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null) { 
    // connected to the internet
    switch (activeNetwork.getType()) {
        case ConnectivityManager.TYPE_WIFI:
            // connected to wifi
            break;
        case ConnectivityManager.TYPE_MOBILE:
            // connected to mobile data
            break;
        default:
            break;
    }
} else {
    // not connected to the internet
}

1
@ শিরিশহেরওয়াড - হ্যাঁ ব্রডকাস্ট রিসিভারটি এই ক্ষেত্রে প্রয়োজনীয় নয়। getActiveNetworkInfo () একটি প্রসঙ্গ রেফারেন্স অন্তর্ভুক্ত করা হয় তার নিজস্ব পদ্ধতিতে স্থাপন করা যেতে পারে।
পনির রুটি

1
@TheIT - হ্যাঁ ডক বলেছেন "নেটওয়ার্ক ট্র্যাফিক শুরু করার আগে আপনার সর্বদা isCnnected () পরীক্ষা করা উচিত"। এই সমাধানটি ট্র্যাফিক শুরু করছে না এবং কেবল অবহেলিত getNetworkInfo () কলটির সমাধান সরবরাহ করে।
পনির রুটি

7
অ্যান্ড্রয়েড 9, এসডিকে 28 হিসাবে এটি এখন অবচয় করা হয়েছে।
জবার্সিয়া খ্রিস্টান

32
activeNetwork.getType()অবহেলা ও ConnectivityManager.TYPE_WIFIঅবহেলা করা হয়েছে
গডউইন

7
প্রতিস্থাপন এখনcm.getNetworkCapabilities(cm.activeNetwork).hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
tmm1

63

অক্টোবর 2018 হিসাবে, গৃহীত উত্তর হ্রাস করা হয়েছে।

getType(), এবং নিজস্ব টাইপগুলি, এখন এপিআই স্তরের ২৮-এ অবমুক্ত করা হয়েছে J জাভাডোক থেকে:

কলকারীদের নেটওয়ার্কের ক্ষমতা # ট্রান্সপোর্ট * ধ্রুবকের পরিবর্তে নেটওয়ার্ক কেপাবিলিটি # হ্যাশ ট্রান্সপোর্টের পরীক্ষা করা উচিত

ব্যবহার করার জন্য NetworkCapabilities, আপনাকে পদ্ধতিতে একটি Networkউদাহরণ পাস করতে হবে getNetworkCapabilities()। এই উদাহরণটি পেতে আপনাকে কল করতে হবে getActiveNetwork()যা এপিআই লেভেল 23 এ যুক্ত হয়েছিল।

সুতরাং আমি আপাতত বিশ্বাস করি যে আপনি ওয়াই-ফাই বা সেলুলার নেটওয়ার্কের সাথে সংযুক্ত আছেন কিনা তা নিরাপদে যাচাই করার সঠিক উপায়:

public static boolean isNetworkConnected() {
    final ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

    if (cm != null) {
        if (Build.VERSION.SDK_INT < 23) {
            final NetworkInfo ni = cm.getActiveNetworkInfo();

            if (ni != null) {
                return (ni.isConnected() && (ni.getType() == ConnectivityManager.TYPE_WIFI || ni.getType() == ConnectivityManager.TYPE_MOBILE));
            }
        } else {
            final Network n = cm.getActiveNetwork();

            if (n != null) {
                final NetworkCapabilities nc = cm.getNetworkCapabilities(n);

                return (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI));
            }
        } 
    }

    return false; 
}

আপনি অন্যান্য ধরণের জন্য যাচাই TRANSPORTকরতে পারেন, যা আপনি এখানে খুঁজে পেতে পারেন ।

গুরুত্বপূর্ণ দ্রষ্টব্য: আপনি যদি Wi-Fi এবং কোনও VPN এর সাথে সংযুক্ত থাকেন তবে আপনার বর্তমান অবস্থা হতে পারে TRANSPORT_VPN, তাই আপনি এটির জন্যও পরীক্ষা করতে চাইতে পারেন।

আপনার অ্যান্ড্রয়েডমেনিস্ট ফাইলটিতে নিম্নলিখিত অনুমতিটি যুক্ত করতে ভুলবেন না:

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

হ্যাশট্রান্সপোর্ট (নেটওয়ার্কক্যাপাবিলিটিটিস.আরআরএসএসপিএসআইডাব্লুআইআইপিআই) ni.isCnnected () && (ni.getType () == কানেক্টিভিটিম্যানেজটিআরওয়াইওয়াইওয়াইফাই) এর সমান? মানে হ্যাশটান্সপোর্ট () ফাংশনটিও কি ডিভাইসটি সংযুক্ত রয়েছে বা সংযোগের চেষ্টা করছে কিনা তা পরীক্ষা করে দেখুন?
বিস্কুট

আবার, NetworkInfoঅবমূল্যায়িত হয়, আপনি আর ব্যবহার করতে পারবেন না NetWorkInfo, তবে এটি কীভাবে বিকল্প সরবরাহ করে?
প্রেসকোট চারটিয়ার

@ প্রেসকোটচ্যারিয়ার এই কোড স্নিপেট কেবল এসডিকে <23 ডিভাইসে নেটওয়ার্কইনফোতে অ্যাক্সেস করতে পারে
টম

59

2020 ফেব্রুয়ারী আপডেট:

গৃহীত উত্তরটি আবার হ্রাস করা হয় 28 (Android P)তবে এর প্রতিস্থাপন পদ্ধতিটি কেবলমাত্র কাজ করে 23 (Android M)। পুরানো ডিভাইসগুলি সমর্থন করার জন্য, আমি একটি সহায়ক ফাংশন লিখেছি।

ব্যবহারবিধি:

int type = getConnectionType(getApplicationContext());

এটি একটি ফেরত দেয় int, আপনি এটি আপনার কোডটিতে পরিবর্তন করতে পারেন enum:

0: কোনও ইন্টারনেট উপলভ্য নয় (সম্ভবত বিমান মোডে, বা কোনও ওয়াই-ফাইতে যোগ দেওয়ার প্রক্রিয়াতে)।

1: সেলুলার (মোবাইল ডেটা, 3 জি / 4 জি / এলটিই যাই হোক না কেন)।

2: ওয়াই ফাই

3: ভিপিএন

আপনি সাহায্যকারী ফাংশনের কোটলিন বা জাভা সংস্করণটি অনুলিপি করতে পারেন।

Kotlin:

@IntRange(from = 0, to = 3)
fun getConnectionType(context: Context): Int {
    var result = 0 // Returns connection type. 0: none; 1: mobile data; 2: wifi
    val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        cm?.run {
            cm.getNetworkCapabilities(cm.activeNetwork)?.run {
                if (hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                    result = 2
                } else if (hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                    result = 1
                } else if (hasTransport(NetworkCapabilities.TRANSPORT_VPN)){
                    result = 3
                }
            }
        }
    } else {
        cm?.run {
            cm.activeNetworkInfo?.run {
                if (type == ConnectivityManager.TYPE_WIFI) {
                    result = 2
                } else if (type == ConnectivityManager.TYPE_MOBILE) {
                    result = 1
                } else if(type == ConnectivityManager.TYPE_VPN) {
                    result = 3
                }
            }
        }
    }
    return result
}

জাভা:

@IntRange(from = 0, to = 3)
public static int getConnectionType(Context context) {
    int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (cm != null) {
            NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
            if (capabilities != null) {
                if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                    result = 2;
                } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                    result = 1;
                } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
                    result = 3;
                }
            }
        }
    } else {
        if (cm != null) {
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            if (activeNetwork != null) {
                // connected to the internet
                if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
                    result = 2;
                } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                    result = 1;
                } else if (activeNetwork.getType() == ConnectivityManager.TYPE_VPN) {
                    result = 3;
                }
            }
        }
    }
    return result;
}

2
আপনার যেমন 2 ফলাফল রয়েছে, কোনও পূর্ণসংখ্যার ফেরতের পরিবর্তে বুলিয়ান ব্যবহার করা ভাল ...
ক্রিশ্চিয়ান

3
@Christian হিসাবে হলুদ পর্বে ব্যাখ্যা করা, এই সাহায্যকারী ফাংশনটি 3 সম্ভব বলে: No Internet, Cellularএবং Wi-Fi। আপনি যদি সংযোগের প্রকারের বিষয়ে চিন্তা না করেন তবে আপনার অ্যাপ্লিকেশনটির জন্য উপযুক্ত কোডটি সংশোধন করুন।
ব্যবহারকারী 1032613

1
উপরের সমাধানটির মন্তব্যে কী হবে "যদি আপনি ওয়াই-ফাই এবং কোনও ভিপিএন-এর সাথে সংযুক্ত থাকেন তবে আপনার বর্তমান অবস্থা TRANSPORT_VPN হতে পারে, তাই আপনি এটিও পরীক্ষা করতে চাইতে পারেন?"
ডেভিড

1
@ লুকাস আপনি যদি আড়ম্বরপূর্ণ Booleanক্লাসের পরিবর্তে booleanআদিম ব্যবহার করেন তবে সাবধানতা অবলম্বন করতে হবে । যদি বিবৃতিতে আপনাকে চেক যোগ করতে হবে null। এছাড়াও যদি আগামীকাল নেটওয়ার্কক্যাবিলিটিসে আরও একটি নতুন ট্রান্সপোর্ট মোড চালু হয় ... সুতরাং শাখা প্রশাখার জন্য পূর্ণসংখ্যার ব্যবহার সাহায্য করবে এবং আপনি স্যুইচ কেসের ক্ষেত্রেও যেতে পারেন।
শ্যাডো ড্রড

3
এই ধ্রুবক অবমূল্যায়ন চক্র থেকে ক্লান্ত
সেগুন ওহাব

16

আপডেট উত্তর (19: 07: 2018):

এই পদ্ধতিটি আপনাকে ইন্টারনেট সংযোগ উপলব্ধ কিনা তা পরীক্ষা করতে সহায়তা করবে।

public static boolean isNetworkAvailable(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    if (connectivityManager != null) {
        NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();
        return (activeNetwork != null && activeNetwork.isConnectedOrConnecting());
    } else {
        return false;
    }
}

পুরানো উত্তর:

সেরা কোড পুনরায় ব্যবহার অনুশীলনের জন্য, চিজ ব্রেড উত্তরটি উন্নত করে।

public static boolean isNetworkAvailable(Context context) {
    int[] networkTypes = {ConnectivityManager.TYPE_MOBILE,
            ConnectivityManager.TYPE_WIFI};
    try {
        ConnectivityManager connectivityManager =
                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        for (int networkType : networkTypes) {
            NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
            if (activeNetworkInfo != null &&
                    activeNetworkInfo.getType() == networkType)
                return true;
        }
    } catch (Exception e) {
        return false;
    }
    return false;
}

কোডটি ইউটিল ক্লাসে স্থাপন করা যেতে পারে এবং ফোনটি আপনার আবেদনের যে কোনও অংশ থেকে ওয়াইফাই বা মোবাইল ইন্টারনেটের মাধ্যমে ইন্টারনেটের সাথে সংযুক্ত রয়েছে কিনা তা পরীক্ষা করে ব্যবহার করা যেতে পারে।


3
আমি লুপটির বাইরে সক্রিয় নেটওয়ার্কটি সরিয়ে নিয়ে যাওয়ার পরামর্শ দিই।
shtolik

20
activeNetwork.isConnectedOrConnecting()এখন
অবহিত করা

1
আমি সক্রিয় নেট নেটওয়ার্ক.আইস কানেক্টেডঅর কানেক্টিং () কে অ্যাক্টিভেট নেটওয়ার্ক.আইস কানেক্টেড
মুরিলো

নেটওয়ার্কআইএনফো এখন অবচয় করা হয়েছে। আবারও আপডেট করা দরকার!
স্কট বিগস

13

গৃহীত উত্তরটি ২৮ সংস্করণে অবচিত করা হয়েছে সুতরাং আমি আমার প্রকল্পে যে সমাধানটি ব্যবহার করছি তা এখানে।

সংযোগের প্রকার ফেরত দেয়। মিথ্যা: কোনও ইন্টারনেট সংযোগ নেই; সত্য: মোবাইল ডেটা || ওয়াইফাই

public static boolean isNetworkConnected(Context context) { 
    boolean result = false; 
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (cm != null) {
            NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
            if (capabilities != null) {
                if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                    result = true;
                } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                    result = true;
                }
            }
        }
    } else {
        if (cm != null) {
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            if (activeNetwork != null) {
                // connected to the internet
                if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
                    result = true;
                } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                    result = true;
                }
            }
        }
    }
    return result;
}

2
অনলাইনে নেট ওয়ার্ক.গেটটাইপ () এছাড়াও হ্রাস করা হয়। আপনি অ্যাক্টিভ নেট নেট ওয়ার্ক.আইস কানেক্টেড () ব্যবহার করতে পারেন;
আমান ভার্মা

11

2020 সালের মার্চ পর্যন্ত এই উত্তরের একটি আপডেট রয়েছে যা API.29 এর মাধ্যমে API.15 সমর্থন করে, আপনি এটির মূল উত্তর অনুসরণ করে খুঁজে পেতে পারেন

উত্তর ফেব্রুয়ারী 2019

আপনি অনলাইনে আছেন কিনা তা পরীক্ষা করতে:

boolean isOnline() {
    // Checking internet connectivity
    ConnectivityManager connectivityMgr = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = null;
    if (connectivityMgr != null) {
        activeNetwork = connectivityMgr.getActiveNetworkInfo();
    }
    return activeNetwork != null;
}

অ্যান্ড্রয়েড এম এর আগে / পরে ইন্টারনেট সংযোগের ধরণটি পেতে

void internetType() {
    // Checking internet connectivity
    ConnectivityManager connectivityMgr = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = null;
    if (connectivityMgr != null) {
        activeNetwork = connectivityMgr.getActiveNetworkInfo();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            NetworkCapabilities nc = connectivityMgr.getNetworkCapabilities(connectivityMgr.getActiveNetwork());
            if (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                // connected to mobile data
            } else if (nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                // connected to wifi
            }
        } else {
            if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
                // connected to wifi
            } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                // connected to mobile data
            }
        }
    }
}

সমস্ত ক্ষেত্রে নেটওয়ার্কের স্থিতিতে অ্যাক্সেসের অনুমতি প্রয়োজন

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

2020 মার্চ আপডেট করুন

অবহিত NetworkInfoকরা হয়েছে এবং এপিআই 29 হিসাবে এখন থেকে আমাদের ConnectivityManager.NetworkCallbackএর নেটওয়ার্কের স্থিতি পরিবর্তন onAvailable()এবং onLost()কলব্যাকগুলি ব্যবহার করতে হবে ।

ব্যবহার:

  • আপনি হয় এই লাইব্রেরিটি ব্যবহার করতে পারেন , বা সরাসরি এই লাইব্রেরির একটি অংশ হিসাবে নীচের ইউটিলিটি শ্রেণিটি ব্যবহার করতে পারেন।

বৈশিষ্ট্য

  • পদ্ধতিতে LifecycleObserverকিছু ক্লিনআপ করে স্মৃতি ফুটো এড়ানোর জন্য প্রয়োগ করে এটি লাইফসাইকেল সচেতন onDestroy()
  • এটি API 15 (আইসক্রিম স্যান্ডউইচ) থেকে API 29 29 (অ্যান্ড্রয়েড কিউ) এর মাধ্যমে সমর্থন করে
  • এপিআই 21 পূর্বে API গুলির জন্য, এটি ব্যবহার করে একটি প্রেক্ষাপটে ভিত্তিক BoradcastReceiverএবং NetworkInfo, এবং ব্যবহারের ConnectivityManager.NetworkCallbackএপিআই 21 এবং উপরে জন্য।
  • যখন উভয়ই ওয়াইফাই এবং সেলুলার নেটওয়ার্ক চালু থাকে, তখন সেলুলার নেটওয়ার্কে স্থানান্তরিত করার সময় ওয়াইফাই সংযোগ বিচ্ছিন্ন হয়ে গেলে কানেক্টিভিটি শ্রোতা বাধা দেয় না।
  • যখন সেলুলার নেটওয়ার্ক চালু থাকে, তখন ওয়াইফাই সংযুক্ত থাকে এবং সক্রিয় নেটওয়ার্ক হওয়ার কারণে কানেক্টিভিটি শ্রোতা বাধা দেয় না (কারণ এটি পছন্দসই নেটওয়ার্ক) is
  • আপনি যদি গ্রন্থাগারটি ব্যবহার করতে চলেছেন তবে এই অনুমতিটি অন্তর্ভুক্ত করার দরকার নেই android.permission.ACCESS_NETWORK_STATE; আপনি যদি ইউটিলিটি ক্লাস ব্যবহার করতে যাচ্ছেন তবে আপনাকে এটি অন্তর্ভুক্ত করতে হবে।

কেপেবিলিটিস

  • বর্তমান সংযোগ স্থিতি (অনলাইন / অফলাইন) পান।
  • অবিচ্ছিন্নভাবে চেকিং / ইন্টারনেট সংযোগ শুনে এবং যখন ডিভাইস অফলাইন বা অনলাইনে চলে আসে তখন কলব্যাক ট্রিগার করে।
  • সক্রিয় ইন্টারনেট সংযোগের প্রকারটি (ওয়াইফাই বা সেলুলার) পান।
  • সমস্ত উপলভ্য নেটওয়ার্কের প্রকার (ওয়াইফাই বা সেলুলার) পান। >> কেবলমাত্র 21+ এপিআই-তে সমর্থিত
  • সমস্ত উপলভ্য নেটওয়ার্কের সংখ্যা পান >> কেবলমাত্র 21++ এ সমর্থিত
@RequiresApi(api = Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
public class ConnectionUtil implements LifecycleObserver {

    private static final String TAG = "LOG_TAG";
    private ConnectivityManager mConnectivityMgr;
    private Context mContext;
    private NetworkStateReceiver mNetworkStateReceiver;

    /*
     * boolean indicates if my device is connected to the internet or not
     * */
    private boolean mIsConnected = false;
    private ConnectionMonitor mConnectionMonitor;


    /**
     * Indicates there is no available network.
     */
    private static final int NO_NETWORK_AVAILABLE = -1;


    /**
     * Indicates this network uses a Cellular transport.
     */
    public static final int TRANSPORT_CELLULAR = 0;


    /**
     * Indicates this network uses a Wi-Fi transport.
     */
    public static final int TRANSPORT_WIFI = 1;


    public interface ConnectionStateListener {
        void onAvailable(boolean isAvailable);
    }


    public ConnectionUtil(Context context) {
        mContext = context;
        mConnectivityMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        ((AppCompatActivity) mContext).getLifecycle().addObserver(this);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mConnectionMonitor = new ConnectionMonitor();
            NetworkRequest networkRequest = new NetworkRequest.Builder()
                    .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
                    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                    .build();
            mConnectivityMgr.registerNetworkCallback(networkRequest, mConnectionMonitor);
        }

    }


    /**
     * Returns true if connected to the internet, and false otherwise
     *
     * <p>
     * NetworkInfo is deprecated in API 29
     * https://developer.android.com/reference/android/net/NetworkInfo
     * <p>
     * getActiveNetworkInfo() is deprecated in API 29
     * https://developer.android.com/reference/android/net/ConnectivityManager#getActiveNetworkInfo()
     * <p>
     * getNetworkInfo(int) is deprecated as of API 23
     * https://developer.android.com/reference/android/net/ConnectivityManager#getNetworkInfo(int)
     */
    public boolean isOnline() {

        mIsConnected = false;

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
            // Checking internet connectivity
            NetworkInfo activeNetwork = null;
            if (mConnectivityMgr != null) {
                activeNetwork = mConnectivityMgr.getActiveNetworkInfo(); // Deprecated in API 29
            }
            mIsConnected = activeNetwork != null;

        } else {
            Network[] allNetworks = mConnectivityMgr.getAllNetworks(); // added in API 21 (Lollipop)

            for (Network network : allNetworks) {
                NetworkCapabilities networkCapabilities = mConnectivityMgr.getNetworkCapabilities(network);
                if (networkCapabilities != null) {
                    if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                            || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
                            || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET))
                        mIsConnected = true;
                }
            }
        }

        return mIsConnected;

    }


    /**
     * Returns
     * <p> <p>
     * <p><p> NO_NETWORK_AVAILABLE >>> when you're offline
     * <p><p> TRANSPORT_CELLULAR >> When Cellular is the active network
     * <p><p> TRANSPORT_WIFI >> When Wi-Fi is the Active network
     * <p>
     */
    public int getActiveNetwork() {

        NetworkInfo activeNetwork = mConnectivityMgr.getActiveNetworkInfo(); // Deprecated in API 29
        if (activeNetwork != null)

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                NetworkCapabilities capabilities = mConnectivityMgr.getNetworkCapabilities(mConnectivityMgr.getActiveNetwork());
                if (capabilities != null)
                    if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                        // connected to mobile data
                        return TRANSPORT_CELLULAR;

                    } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                        // connected to wifi
                        return TRANSPORT_WIFI;
                    }

            } else {
                if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) { // Deprecated in API 28
                    // connected to mobile data
                    return TRANSPORT_CELLULAR;

                } else if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) { // Deprecated in API 28
                    // connected to wifi
                    return TRANSPORT_WIFI;
                }
            }
        return NO_NETWORK_AVAILABLE;
    }


    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public int getAvailableNetworksCount() {

        int count = 0;

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            Network[] allNetworks = mConnectivityMgr.getAllNetworks(); // added in API 21 (Lollipop)
            for (Network network : allNetworks) {
                NetworkCapabilities networkCapabilities = mConnectivityMgr.getNetworkCapabilities(network);
                if (networkCapabilities != null)
                    if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                            || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR))
                        count++;
            }

        }

        return count;
    }


    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public List<Integer> getAvailableNetworks() {

        List<Integer> activeNetworks = new ArrayList<>();

        Network[] allNetworks; // added in API 21 (Lollipop)
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            allNetworks = mConnectivityMgr.getAllNetworks();
            for (Network network : allNetworks) {
                NetworkCapabilities networkCapabilities = mConnectivityMgr.getNetworkCapabilities(network);
                if (networkCapabilities != null) {
                    if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI))
                        activeNetworks.add(TRANSPORT_WIFI);

                    if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR))
                        activeNetworks.add(TRANSPORT_CELLULAR);

                }
            }
        }

        return activeNetworks;
    }


    public void onInternetStateListener(ConnectionStateListener listener) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            mNetworkStateReceiver = new NetworkStateReceiver(listener);
            IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
            mContext.registerReceiver(mNetworkStateReceiver, intentFilter);

        } else {
            mConnectionMonitor.setOnConnectionStateListener(listener);
        }
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy() {
        Log.d(TAG, "onDestroy");
        ((AppCompatActivity) mContext).getLifecycle().removeObserver(this);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            if (mConnectionMonitor != null)
                mConnectivityMgr.unregisterNetworkCallback(mConnectionMonitor);
        } else {
            if (mNetworkStateReceiver != null)
                mContext.unregisterReceiver(mNetworkStateReceiver);
        }

    }


    public class NetworkStateReceiver extends BroadcastReceiver {

        ConnectionStateListener mListener;

        public NetworkStateReceiver(ConnectionStateListener listener) {
            mListener = listener;
        }

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getExtras() != null) {

                NetworkInfo activeNetworkInfo = mConnectivityMgr.getActiveNetworkInfo(); // deprecated in API 29

                /*
                 * activeNetworkInfo.getState() deprecated in API 28
                 * NetworkInfo.State.CONNECTED deprecated in API 29
                 * */
                if (!mIsConnected && activeNetworkInfo != null && activeNetworkInfo.getState() == NetworkInfo.State.CONNECTED) {
                    Log.d(TAG, "onReceive: " + "Connected To: " + activeNetworkInfo.getTypeName());
                    mIsConnected = true;
                    mListener.onAvailable(true);

                } else if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) {
                    if (!isOnline()) {
                        mListener.onAvailable(false);
                        mIsConnected = false;
                    }

                }

            }
        }
    }


    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public class ConnectionMonitor extends ConnectivityManager.NetworkCallback {

        private ConnectionStateListener mConnectionStateListener;

        void setOnConnectionStateListener(ConnectionStateListener connectionStateListener) {
            mConnectionStateListener = connectionStateListener;
        }

        @Override
        public void onAvailable(@NonNull Network network) {

            if (mIsConnected)
                return;

            Log.d(TAG, "onAvailable: ");

            if (mConnectionStateListener != null) {
                mConnectionStateListener.onAvailable(true);
                mIsConnected = true;
            }

        }

        @Override
        public void onLost(@NonNull Network network) {

            if (getAvailableNetworksCount() == 0) {
                mConnectionStateListener.onAvailable(false);
                mIsConnected = false;
            }

        }

    }

}

@ রাসেল দয়া করে আপডেট করা উত্তর যাচাই করুন, আশা করি এটি সাহায্য করতে পারে
জেইন

যদি ব্যবহারকারী একই সাথে ওয়াইফাই এবং মোবাইল ডেটার সাথে সংযুক্ত থাকে, এবং তাদের মধ্যে একটিতে সংযোগ হারায় তবে ফোন করা onLostহবে। onLostএর অর্থ এই নয় যে ডিভাইসটি ইন্টারনেট সংযোগ হারিয়েছে, তবে একটি নেটওয়ার্ক সংযোগটি হারিয়েছে।
গোখন আরিক

@Gokhan Arik .. নিস ধরা আমি এটা তে এটি সমাধানে কাজ করছি
জৈন

1
এই আলোচনাটি দেখুন gist.github.com/PasanBhanu/730a32a9eeb180ec2950c172d54bb06a
আরিক

@ গোখনআরিক সাহায্যের জন্য ধন্যবাদ .. আমি স্রেফ আমার উত্তর আপডেট করেছি এবং এপিআই ব্যবহার প্রসারিত করেছি, প্লিজ আপনি যদি কোনও বাগ লক্ষ্য করেন তবে আমাকে জানান
জেইন

4

আপনার নেটওয়ার্ক ইন্টারনেটের সাথে সংযুক্ত কিনা তা যাচাই করা ভাল:

@Suppress("DEPRECATION")
fun isNetworkAvailable(context: Context): Boolean {
    try {
        val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        return if (Build.VERSION.SDK_INT > 22) {
            val an = cm.activeNetwork ?: return false
            val capabilities = cm.getNetworkCapabilities(an) ?: return false
            capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        } else {
            val a = cm.activeNetworkInfo ?: return false
            a.isConnected && (a.type == ConnectivityManager.TYPE_WIFI || a.type == ConnectivityManager.TYPE_MOBILE)
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
    return false
}

আপনিও চেক করতে চাইতে পারেন NetworkCapabilities.NET_CAPABILITY_VALIDATED
জেজেডি

3

কোটলিন সংস্করণ:

fun isInternetOn(context: Context): Boolean {
   val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager
   val activeNetwork = cm?.activeNetworkInfo
   return activeNetwork != null && activeNetwork.isConnected
}

3

হিসাবে পনির রুটি প্রস্তাব , ব্যবহার getActiveNetworkInfo ()

getActiveNetworkInfo

এপিআই স্তর 1 এ যুক্ত হয়েছে

অ্যাক্টিভ নেট নেটওয়ার্ড ইনফো ()

বর্তমানে সক্রিয় ডিফল্ট ডেটা নেটওয়ার্ক সম্পর্কে বিশদ বিবরণ দেয়। সংযুক্ত থাকা অবস্থায়, এই নেটওয়ার্কটি বহির্গামী সংযোগগুলির জন্য ডিফল্ট রুট। নেটওয়ার্ক ট্র্যাফিক শুরু করার আগে আপনার সর্বদা আইস কানেক্টেড () পরীক্ষা করা উচিত। কোনও ডিফল্ট নেটওয়ার্ক না থাকলে এটি শূন্য হতে পারে। এই পদ্ধতিটির জন্য কলারের অনুমতি ACCESS_NETWORK_STATE রাখা দরকার। বর্তমান ডিফল্ট নেটওয়ার্কের জন্য নেটওয়ার্কআইএনফো অবজেক্টটি নেটওয়ার্কইনফোর ফেরত দেয় বা কোনও ডিফল্ট নেটওয়ার্ক বর্তমানে সক্রিয় না হলে নালকে দেয়।

তথ্যসূত্র: অ্যান্ড্রয়েড স্টুডিও

 public final boolean isInternetOn() {

    // get Connectivity Manager object to check connection
    ConnectivityManager connec =
            (ConnectivityManager)getSystemService(getBaseContext().CONNECTIVITY_SERVICE);

    // Check for network connections
    if ( connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.CONNECTED ||
            connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.CONNECTING ) {

        // if connected with internet

        Toast.makeText(this, connec.getActiveNetworkInfo().getTypeName(), Toast.LENGTH_LONG).show();
        return true;

    } else if (
            connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.DISCONNECTED ||
                    connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.DISCONNECTED  ) {

        Toast.makeText(this, " Not Connected ", Toast.LENGTH_LONG).show();
        return false;
    }
    return false;
}

নিরাপদ ব্যবহারের জন্য এখন পদ্ধতিটি কল করুন catch

try {
    if (isInternetOn()) { /* connected actions */ }
    else { /* not connected actions */ }
} catch (Exception e){
  Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}

এবং যোগ করতে ভুলবেন না:

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

ধন্যবাদ এটি দরকারী। যখন আমরা নেটওয়ার্কের স্থিতি পরীক্ষা করি এবং যদি ওয়াইফাই এবং ডেটা উভয়ই অফ থাকে - সেই সময়ের অ্যাপ ক্রাশ হয় তবে সমস্যাটি সমাধান করার চেষ্টা করুন ..
রুচা ভট্ট জোশী

তবে আমি যদি নির্দিষ্ট ধরণের নেটওয়ার্ক উপস্থিত থাকে তা উপস্থিত সমস্ত নেটওয়ার্ককে গণনা করে কিনা তা পরীক্ষা করতে চাইলে এটি কাজ করে না, যেমনgetNetworkInfo(ConnectivityManager.TYPE_ETHERNET).isAvailable
m0skit0

3
getState () অবমূল্যায়িত!
দিয়েগো ভেনসিঁইও

বেশ কয়েকটি অবহেলা নির্দেশ!
স্কট বিগস

2

নিরাপদে থাকার জন্য, আমি এছাড়াও পদ্ধতিটি ব্যবহার করার পরামর্শ দেব

NetworkInfo.isConnected ()

পুরো পদ্ধতিটি নীচের মতো হতে পারে:

/**
 * Checking whether network is connected
 * @param context Context to get {@link ConnectivityManager}
 * @return true if Network is connected, else false
 */
public static boolean isConnected(Context context){
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    if (activeNetwork != null && activeNetwork.isConnected()) {
        int networkType = activeNetwork.getType();
        return networkType == ConnectivityManager.TYPE_WIFI || networkType == ConnectivityManager.TYPE_MOBILE;
    } else {
        return false;
    }
}

9
activeNetwork.getType()অবহেলা ও ConnectivityManager.TYPE_WIFI অবহেলা করা হয়েছে
গডউইন

2

বর্তমান নেটওয়ার্কটি সর্বাধিক অ্যান্ড্রয়েড সংস্করণগুলিতে সেলুলার ব্যবহার করছে কিনা তা আমি এখানে যাচ্ছি তা এখানে দেখুন:

val isCellular: Boolean get() {
    val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        cm.getNetworkCapabilities(cm.activeNetwork).hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
    } else {
        cm.activeNetworkInfo?.type == ConnectivityManager.TYPE_MOBILE
    }
}

2

(প্রায়) সমস্ত উত্তর অ্যান্ড্রয়েড পি-তে অবমূল্যায়ন করা হয়েছে, সুতরাং এখানে C#সমাধান ( যা জাভা বিকাশকারীদের জন্য অনুসরণ করা সহজ )

public bool IsOnline(Context context)
{
    var cm = (ConnectivityManager)context.GetSystemService(Context.ConnectivityService);

    if (cm == null) return false;

    if (Build.VERSION.SdkInt < BuildVersionCodes.M)
    {
        var ni = cm.ActiveNetworkInfo;

        if (ni == null) return false;

        return ni.IsConnected && (ni.Type == ConnectivityType.Wifi || ni.Type == ConnectivityType.Mobile);
    }

    return cm.GetNetworkCapabilities(cm.ActiveNetwork).HasTransport(Android.Net.TransportType.Wifi)
        || cm.GetNetworkCapabilities(cm.ActiveNetwork).HasTransport(Android.Net.TransportType.Cellular);
}   

এখানে চাবি Android.Net.TransportType


এএএনএএনএনডিডিডিএডি এভারটিং অব ডিপ্রাইসড!
প্রেসকোট চারটিয়ার

@ প্রেসকোটচ্যারিয়ার কোন সংস্করণে?
মেহেদী দেহঘানি

2

আমাদের একাধিকবার ইন্টারনেট সংযোগ পরীক্ষা করতে হবে check সুতরাং আমরা যদি একটি এক্সটেনশন পদ্ধতিতে কোড ব্লকটি লিখি তবে এটি আমাদের পক্ষে সহজ হবে Context। নীচে আমার সাহায্যকারী এক্সটেনশানগুলি হল Contextএবং Fragment

ইন্টারনেট সংযোগ পরীক্ষা করা হচ্ছে

fun Context.hasInternet(): Boolean {
    val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    return if (Build.VERSION.SDK_INT < 23) {
        val activeNetworkInfo = connectivityManager.activeNetworkInfo
        activeNetworkInfo != null && activeNetworkInfo.isConnected
    } else {
        val nc = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
        if (nc == null) {
            false
        } else {
            nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ||
                    nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
        }
    }
}

অন্যান্য এক্সটেনশনগুলি

fun Context.hasInternet(notifyNoInternet: Boolean = true, trueFunc: (internet: Boolean) -> Unit) {
    if (hasInternet()) {
        trueFunc(true)
    } else if (notifyNoInternet) {
        Toast.makeText(this, "No Internet Connection!", Toast.LENGTH_SHORT).show()
    }
}

fun Context.hasInternet(
    trueFunc: (internet: Boolean) -> Unit,
    falseFunc: (internet: Boolean) -> Unit
) {
    if (hasInternet()) {
        trueFunc(true)
    } else {
        falseFunc(true)
    }
}

fun Fragment.hasInternet(): Boolean = context!!.hasInternet()

fun Fragment.hasInternet(notifyNoInternet: Boolean = true, trueFunc: (internet: Boolean) -> Unit) =
    context!!.hasInternet(notifyNoInternet, trueFunc)

fun Fragment.hasInternet(
    trueFunc: (internet: Boolean) -> Unit, falseFunc: (internet: Boolean) -> Unit
) = context!!.hasInternet(trueFunc, falseFunc)

2

ইন্টারনেট উপলব্ধ কিনা তা পরীক্ষা করে দেখুন

@RequiresPermission(allOf = [
    Manifest.permission.ACCESS_NETWORK_STATE, 
    Manifest.permission.INTERNET
])
fun isInternetAvailable(context: Context): Boolean {
    val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
    val activeNetworkInfo = connectivityManager!!.activeNetworkInfo
    return activeNetworkInfo != null && activeNetworkInfo.isConnected
}

2

কানেক্টিভিটিম্যানেজ.জেটএকটিভনেটওয়ার্ক () অ্যান্ড্রয়েড এম (এপিআই 28) এর নীচে পাওয়া যায় না। networkInfo.getState () অ্যান্ড্রয়েড এল এর উপরে অবচয় করা হয়েছে is

সুতরাং, চূড়ান্ত উত্তরটি হ'ল:

public static boolean isConnectingToInternet(Context mContext) {
    if (mContext == null) return false;

    ConnectivityManager connectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivityManager != null) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            final Network network = connectivityManager.getActiveNetwork();
            if (network != null) {
                final NetworkCapabilities nc = connectivityManager.getNetworkCapabilities(network);

                return (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ||
                        nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI));
            }
        } else {
            NetworkInfo[] networkInfos = connectivityManager.getAllNetworkInfo();
            for (NetworkInfo tempNetworkInfo : networkInfos) {
                if (tempNetworkInfo.isConnected()) {
                    return true;
                }
            }
        }
    }
    return false;
}

1
আপনি বলছেন getActiveNetwork () এম এর নীচে অ্যান্ড্রয়েডে পাওয়া যায় নি, তবে আপনার কোডটি এটি ললিপপে ব্যবহার করে !?
3c71

2

অনেক উত্তর এখনও 23 এর নীচে getNetworkType ব্যবহার করে যা অবনতিহীন ; ডিভাইসে কোনও ইন্টারনেট সংযোগ রয়েছে কিনা তা পরীক্ষা করতে নীচের কোডটি ব্যবহার করুন।

public static boolean isNetworkConnected(Context context) {

    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    if (cm != null) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
            return capabilities != null && (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR));
        } else {
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            return activeNetwork != null && activeNetwork.isConnected();
        }
    }

    return false;
}

..

এবং, ম্যানিফেস্টে এই লাইনটি যুক্ত করতে ভুলবেন না

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

1

যেহেতু পোস্ট করা উত্তরগুলি কেবলমাত্র সক্রিয় নেটওয়ার্ককে জিজ্ঞাসা করার অনুমতি দেয় NetworkInfo, কেবল কোনও সক্রিয় নেটওয়ার্ক নয় (উদাহরণস্বরূপ ওয়াইফাই নেটওয়ার্ক) (দুঃখিত, কোটলিন কোড এগিয়ে)

(getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).run {
    allNetworks.find { getNetworkInfo(it).type == ConnectivityManager.TYPE_WIFI }?.let { network -> getNetworkInfo(network) }
//    getNetworkInfo(ConnectivityManager.TYPE_WIFI).isAvailable // This is the deprecated API pre-21
}

এর জন্য এপিআই 21 বা ততোধিকতর এবং অনুমতি প্রয়োজন android.permission.ACCESS_NETWORK_STATE


1
currentNetwork.getType () এবং ConnectivityManager.TYPE_WIFI উভয় এপিআই 28. উঠিয়ে হয়
Abushawish

@ আবুশাবিশ এপিআই 28 এর প্রস্তাবিত সমাধান কী?
tmm1

প্রতিস্থাপন এখনcm.getNetworkCapabilities(cm.activeNetwork).hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
tmm1

1

NetManager আপনার সাথে Android এর উপর ইন্টারনেট সংযোগ পরীক্ষা করুন করার জন্য ব্যবহার করতে পারে Kotlin

আপনি যদি minSdkVersion> = 23 ব্যবহার করেন

class NetManager @Inject constructor(var applicationContext: Context) {
    val isConnectedToInternet: Boolean?
        get() = with(
            applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE)
                    as ConnectivityManager
        ) {
            isConnectedToInternet()
        }
}

fun ConnectivityManager.isConnectedToInternet() = isConnected(getNetworkCapabilities(activeNetwork))

fun isConnected(networkCapabilities: NetworkCapabilities?): Boolean {
    return when (networkCapabilities) {
        null -> false
        else -> with(networkCapabilities) { hasTransport(TRANSPORT_CELLULAR) || hasTransport(TRANSPORT_WIFI) }
    }
}

আপনি যদি minSdkVersion <23 ব্যবহার করেন

class NetManager @Inject constructor(var applicationContext: Context) {
    val isConnectedToInternet: Boolean?
        get() = with(
            applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE)
                    as ConnectivityManager
        ) {
            isConnectedToInternet()
        }
}

fun ConnectivityManager.isConnectedToInternet(): Boolean = if (Build.VERSION.SDK_INT < 23) {
    isConnected(activeNetworkInfo)
} else {
    isConnected(getNetworkCapabilities(activeNetwork))
}


fun isConnected(network: NetworkInfo?): Boolean {
    return when (network) {
        null -> false
        else -> with(network) { isConnected && (type == TYPE_WIFI || type == TYPE_MOBILE) }
    }
}

fun isConnected(networkCapabilities: NetworkCapabilities?): Boolean {
    return when (networkCapabilities) {
        null -> false
        else -> with(networkCapabilities) { hasTransport(TRANSPORT_CELLULAR) || hasTransport(TRANSPORT_WIFI) }
    }
}

1

https://www.agnosticdev.com/content/how-detect-network-connectivity-android

দয়া করে এই টিউটোরিয়ালটি অনুসরণ করুন এটি যে কেউ উত্তর খুঁজছেন তাদের সহায়তা করা উচিত।

নোট নেটওয়ার্কআইএনফোকে অবচয় করা হয়েছে সুতরাং এটি প্রয়োগ করুন নীচে @ বিধি উত্তরের সাথে getApplicationContext () পরামিতি হিসাবে উত্তীর্ণ

  public static boolean isNetworkReacheable(Context context) {
    boolean result = false;
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (cm != null) {
            NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
            if (capabilities != null) {
                if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                    result = true;
                } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                    result = true;
                }
            }
        }
    } else {
        if (cm != null) {
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            if (activeNetwork != null) {
                // connected to the internet
                if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
                    result = true;
                } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                    result = true;
                }
            }
        }
    }
    return result;
}

0
public boolean isConnectedToWifi(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivityManager == null) {
        return false;
    }

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        Network network = connectivityManager.getActiveNetwork();
        NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
        if (capabilities == null) {
            return false;
        }
        return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
    } else {
        NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        if (networkInfo == null) {
            return false;
        }
        return networkInfo.isConnected();
    }
}

0

কোটলিনে এটি আমার জন্য কাজ করে। অনেকগুলি এপিআই নেটওয়ার্ক ম্যানেজার শ্রেণিতে অবহিত করা হয়েছে সুতরাং নীচে উত্তরগুলি সমস্ত এপিআই সমর্থনটি কভার করে।

fun isNetworkAvailable(context: Context): Boolean {
    var result = false
    (context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).apply {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                result = isCapableNetwork(this,this.activeNetwork)
            } else {
                val networkInfos = this.allNetworks
                for (tempNetworkInfo in networkInfos) {
                    if(isCapableNetwork(this,tempNetworkInfo))
                        result =  true
                }
            }
        }

    return result
}

fun isCapableNetwork(cm: ConnectivityManager,network: Network?): Boolean{
     cm.getNetworkCapabilities(network)?.also {
        if (it.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
            return true
        } else if (it.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
            return true
        }
    }
    return false
}

আপনি নীচে যুক্ত করুন

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

0

নীচের কোডটি সমস্ত এপিআইতে কাজ করে Kot (কোটলিন)

তবে, getActiveNetworkInfo () কেবলমাত্র এপিআই 29-এ অবনতিযুক্ত এবং সমস্ত এপিআইতে কাজ করে, তাই আমরা এটি 29 এর নীচে সমস্ত এপিতে ব্যবহার করতে পারি

fun isInternetAvailable(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 {
                connectivityManager.run {
                    connectivityManager.activeNetworkInfo?.run {
                        result = when (type) {
                            ConnectivityManager.TYPE_WIFI -> true
                            ConnectivityManager.TYPE_MOBILE -> true
                            ConnectivityManager.TYPE_ETHERNET -> true
                            else -> false
                        }

                    }
                }
            }

            return result
        }

0

এটার মতো কিছু:

public boolean hasConnection(final Context context){
    ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNW = cm.getActiveNetworkInfo();
    if (activeNW != null && activeNW.isConnected())
    {
        return true;
    }
    return false;
}

এবং মূল প্রোগ্রামের প্রধান অংশে:

if(hasConnection(this)) {
    Toast.makeText(this, "Active networks OK ", Toast.LENGTH_LONG).show();
    getAccountData(token, tel);
}
else  Toast.makeText(this, "No active networks... ", Toast.LENGTH_LONG).show();

0

এটি অ্যান্ড্রয়েড 10-তেও কাজ করবে। এটি যদি ইন্টারনেটের সাথে সংযুক্ত থাকে তবে সত্যই ফিরে আসবে অন্যথায় মিথ্যা ফেরত আসবে।

private fun isOnline(): Boolean {
        val connectivityManager =
                getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val capabilities =
                connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
        if (capabilities != null) {
            when {
                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
                    Log.i("Internet", "NetworkCapabilities.TRANSPORT_CELLULAR")
                    return true
                }
                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
                    Log.i("Internet", "NetworkCapabilities.TRANSPORT_WIFI")
                    return true
                }
                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> {
                    Log.i("Internet", "NetworkCapabilities.TRANSPORT_ETHERNET")
                    return true
                }
            }
        }
        return false
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.