অ্যান্ড্রয়েডে ইন্টারনেট অ্যাক্সেস কীভাবে চেক করবেন? ইনডএড্রেস কখনই শেষ হয় না


657

আমি একটি পেয়েছি AsyncTaskযা একটি হোস্ট নামের নেটওয়ার্কের অ্যাক্সেস যাচাই করার কথা। তবে doInBackground()সময়টি কখনই শেষ হয় না। কারও কি কোনও ক্লু আছে?

public class HostAvailabilityTask extends AsyncTask<String, Void, Boolean> {

    private Main main;

    public HostAvailabilityTask(Main main) {
        this.main = main;
    }

    protected Boolean doInBackground(String... params) {
        Main.Log("doInBackground() isHostAvailable():"+params[0]);

        try {
            return InetAddress.getByName(params[0]).isReachable(30); 
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;       
    }

    protected void onPostExecute(Boolean... result) {
        Main.Log("onPostExecute()");

        if(result[0] == false) {
            main.setContentView(R.layout.splash);
            return;
        }

        main.continueAfterHostCheck();
    }   
}

5
একটি ইন্টারনেট সংযোগ পরীক্ষা করার জন্য, সম্ভবত সবচেয়ে নির্ভরযোগ্য উপায় হ'ল অন্যতম প্রধান নাম সার্ভারের পিং করা, উদাহরণস্বরূপ এটি করা যেতে পারে if(Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8").waitFor()==0) ...। এর উত্তম প্রয়োগের জন্য আমার উত্তর দেখুন । বিটিডব্লিউ গৃহীত উত্তরটি (এবং আরও অনেকে এখানে) কেবল ইন্টারনেট সংযোগ নয়, একটি নেটওয়ার্ক সংযোগের জন্য পরীক্ষা করে দেখুন।
লেবীয়


4
পিং পদ্ধতিটি ব্যবহার করবেন না, পরিবর্তে একটি HTTP চেক ব্যবহার করুন। আইসিএমপি কিছু নেটওয়ার্কে অবরুদ্ধ, তাই পিং কাজ করবে না। উদাহরণস্বরূপ: এটি আমার হোম ওয়াইফাইতে পুরোপুরি কাজ করে, তবে ভোডাফোনের নেটওয়ার্কে (হাঙ্গেরিতে) মোবাইল ডেটা ব্যবহার করার সময় এটি হয় না not অথবা 2 টি পদ্ধতিকে একটি ফ্যালব্যাক হিসাবে একত্রিত করুন তবে সাবধান থাকুন কারণ ওয়েটফোর () -W বা -W ব্যবহার করা হলেও প্রায় 20 সেকেন্ড অপেক্ষা করবে।
তামাস বলভুরি

: এই পরীক্ষা করে দেখুন stackoverflow.com/a/39766506/3806413
0xAliHn

@ ট্যামস বলভারি: টিসিপি স্তরে এটি মোকাবেলা করা আরও ভাল। যা আপনাকে কোনও এইচটিপি অনুরোধের নির্ভরযোগ্যতার সাথে আইসিএমপি গতির কাছাকাছি পেতে পারে। আমি সেই অনুযায়ী "পিং উত্তর" সম্পাদনা করেছি।
লেবীয়

উত্তর:


551

নেটওয়ার্ক সংযোগ / ইন্টারনেট অ্যাক্সেস

  • isConnectedOrConnecting()(বেশিরভাগ উত্তরে ব্যবহৃত) কোনও নেটওয়ার্ক সংযোগের জন্য পরীক্ষা করে
  • এই নেটওয়ার্কগুলির যে কোনও একটিতে ইন্টারনেট অ্যাক্সেস রয়েছে কিনা তা জানতে , নিম্নলিখিতগুলির মধ্যে একটি ব্যবহার করুন

ক) একটি সার্ভার পিং করুন (সহজ)

// ICMP 
public boolean isOnline() {
    Runtime runtime = Runtime.getRuntime();
    try {
        Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
        int     exitValue = ipProcess.waitFor();
        return (exitValue == 0);
    }
    catch (IOException e)          { e.printStackTrace(); }
    catch (InterruptedException e) { e.printStackTrace(); }

    return false;
}

+ মূল থ্রেড চালাতে পারে

- কিছু পুরানো ডিভাইসে (গ্যালাই এস 3 ইত্যাদি) কাজ করে না, ইন্টারনেট না পাওয়া গেলে এটি কিছুক্ষণ অবরুদ্ধ করে।

খ) ইন্টারনেটে সকেটের সাথে সংযুক্ত (উন্নত)

// TCP/HTTP/DNS (depending on the port, 53=DNS, 80=HTTP, etc.)
public boolean isOnline() {
    try {
        int timeoutMs = 1500;
        Socket sock = new Socket();
        SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);

        sock.connect(sockaddr, timeoutMs);
        sock.close();

        return true;
    } catch (IOException e) { return false; }
}

+খুব দ্রুত (যে কোনও উপায়ে), সমস্ত ডিভাইসে কাজ করে, খুব নির্ভরযোগ্য

- ইউআই থ্রেডে চলতে পারে না

এটি প্রতিটি ডিভাইসে খুব নির্ভরযোগ্যভাবে কাজ করে এবং খুব দ্রুত। যদিও এটি (যেমন ScheduledExecutorServiceবা AsyncTask) পৃথক টাস্কে চালানো দরকার ।

সম্ভাব্য প্রশ্ন

  • এটি কি আসলেই যথেষ্ট দ্রুত?

    হ্যাঁ, খুব দ্রুত ;-)

  • ইন্টারনেটে কোনও কিছুর পরীক্ষা ব্যতীত ইন্টারনেট চেক করার কোনও নির্ভরযোগ্য উপায় নেই?

    আমি যতদূর জানি না, তবে আমাকে জানান, এবং আমি আমার উত্তরটি সম্পাদনা করব।

  • ডিএনএস নিচে থাকলে কী হবে?

    গুগল ডিএনএস (উদাঃ 8.8.8.8) বিশ্বের বৃহত্তম পাবলিক ডিএনএস। ২০১৩ পর্যন্ত এটি একদিনে ১৩০ বিলিয়ন আবেদন করে। কেবলমাত্র এটি বলতে দিন, আপনার অ্যাপটি সম্ভবত সেই দিনের আলোচনার বিষয় নয়।

  • কোন অনুমতি প্রয়োজন?

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

    শুধু ইন্টারনেট অ্যাক্সেস - আশ্চর্য ^^ (বিটিডব্লিউ আপনি কি কখনও ভেবে দেখেছেন, কীভাবে এখানে প্রস্তাবিত কিছু পদ্ধতিতে এই অনুমতি ব্যতীত ইন্টারনেট অ্যাক্সেস সম্পর্কে দূরবর্তী আঠা থাকতে পারে?)

 

অতিরিক্ত: ওয়ান-শট AsyncTaskউদাহরণ

class InternetCheck extends AsyncTask<Void,Void,Boolean> {

    private Consumer mConsumer;
    public  interface Consumer { void accept(Boolean internet); }

    public  InternetCheck(Consumer consumer) { mConsumer = consumer; execute(); }

    @Override protected Boolean doInBackground(Void... voids) { try {
        Socket sock = new Socket();
        sock.connect(new InetSocketAddress("8.8.8.8", 53), 1500);
        sock.close();
        return true;
    } catch (IOException e) { return false; } }

    @Override protected void onPostExecute(Boolean internet) { mConsumer.accept(internet); }
}

///////////////////////////////////////////////////////////////////////////////////
// Usage

    new InternetCheck(internet -> { /* do something with boolean response */ });

অতিরিক্ত: ওয়ান-শট RxJava/RxAndroidউদাহরণ (কোটলিন)

fun hasInternetConnection(): Single<Boolean> {
  return Single.fromCallable {
    try {
      // Connect to Google DNS to check for connection
      val timeoutMs = 1500
      val socket = Socket()
      val socketAddress = InetSocketAddress("8.8.8.8", 53)

      socket.connect(socketAddress, timeoutMs)
      socket.close()

      true
    } catch (e: IOException) {
      false
    }
  }
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
}

///////////////////////////////////////////////////////////////////////////////////
    // Usage

    hasInternetConnection().subscribe { hasInternet -> /* do something */}

22
এই কোডের মহান শান্তি! আমি প্রিপেইড কার্ড ব্যবহার করে এমন ডিভাইসে এটি খুব দরকারী বলে মনে করেছি! যখন তারা অর্থ শেষ হয়ে যায়, তাদের কাছে ইন্টারনেট অ্যাক্সেস পাওয়া যায় তবে কোনও ইন্টারনেট নেই। সুতরাং কেবল সংযোগের জন্য যাচাই করা তা করবে না। ধন্যবাদ!
ব্লেজার

10
মনে রাখবেন এই পদ্ধতির একটি অবরোধ এক যাতে আপনি UI 'তে therad এটা চালানো না একটি
Sergii

36
@ লিভিট এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। উপরের উত্তরের জন্য কেবল নেটওয়ার্ক সংযোগ এবং ইন্টারনেট সংযোগ নয় । এবং হ্যাঁ এটি খুব দ্রুত। ধন্যবাদ। অতএব upvote।
রুন 13

9
এই সমাধানটি সমস্ত ডিভাইসের জন্য কাজ করছে না। কিছু কিছু ডিভাইস সর্বদা 2 সালমানের বিবরণ হিসাবে ফিরে আসছেন। আমি যে ডিভাইসগুলি পরীক্ষা করেছি সেগুলির ইন্টারনেট সংযোগ ছিল এবং পিং টার্গেট হ'ল গুগল ডিএনএস সার্ভার - যা পিংয়ের অনুরোধগুলিতে সাড়া দিচ্ছে। আমি মনে করি কিছু বিক্রেতারা পিংয়ের অনুরোধের অনুমতি দিচ্ছেন না। উদাহরণস্বরূপ, আমি একটি স্যামসুং 10.1 ট্যাবলেট (4.3) দিয়ে পরীক্ষা করেছি, এবং সমাধানটি কাজ করছে না। আমি যখন কমান্ড লাইন ইউটিলিটির মাধ্যমে পিং কমান্ডটি চালিত করি তখন আমি একটি অনুমতি ত্রুটি পাই। কমান্ডটি এমুলেটরগুলিতেও কাজ করছে না। এই সমাধানটি ব্যবহার করে সতর্কতা অবলম্বন করুন।
ইরেন ইলমাজ

9
এই পদ্ধতিটি সমস্ত ফোনে কাজ করে না। এটি স্যামসাং গ্যালাক্সি এস 3-তে উদাহরণস্বরূপ ব্যর্থ হয়। এখানে দেখুন: কেন পিং কিছু ডিভাইসে কাজ করে অন্যকে না?
আদিল হুসেন

1032

ডিভাইসটি যদি বিমান মোডে থাকে (বা সম্ভবত অন্যান্য পরিস্থিতিতে যেখানে কোনও উপলভ্য নেটওয়ার্ক নেই) cm.getActiveNetworkInfo()তবে এটি হবে null, সুতরাং আপনার একটি nullচেক যুক্ত করা দরকার ।

নীচে পরিবর্তিত ( এডির সমাধান ):

public boolean isOnline() {
    ConnectivityManager cm =
        (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    return netInfo != null && netInfo.isConnectedOrConnecting();
}

নিম্নলিখিত অনুমতিটি এতে যুক্ত করুন AndroidManifest.xml:

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

অন্য একটি ছোট পয়েন্ট, যদি আপনার সময় মতো নির্দিষ্ট সময়ে নেটওয়ার্ক সংযোগের প্রয়োজন হয় তবে netInfo.isConnected()তার চেয়ে বরং ব্যবহার করা ভাল netInfo.isConnectedOrConnecting। আমার ধারণা এটি অবশ্য ব্যক্তিগত ব্যবহারের ক্ষেত্রে।


109
imo আপনার এখনও হওয়া উচিত এবং HTTP টাইমআউট ব্যতিক্রমগুলি পরীক্ষা করা উচিত কারণ কোনও নেটওয়ার্ক সংযুক্ত থাকলেও এমন পরিস্থিতিতে থাকতে পারে তবে সত্যিকারের কোনও ইন্টারনেট সংযোগ থাকবে না কারণ এটি অ্যাক্সেসের একমাত্র উপায় হ'ল উদাহরণস্বরূপ, ভিপিএন - আপনার এই পথে, উদাহরণস্বরূপ, WI-FI সংযোগ কিন্তু কোনও প্রকৃত ইন্টারনেট ট্র্যাফিক নেই। আর একটি পরিস্থিতি হ'ল একটি সার্ভার। এটি 2 টি সমস্যা যা আমি সম্প্রতি চালিয়েছি এবং সংযোগ পরিচালক সেখানে সাহায্য করবে না help
রাত্রে

21
আমি মধ্যরাত এবং পিন্টুর সাথে একমত, এই উত্তরটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয়, আপনি ইন্টারনেটে থাকছেন কিনা তা পরীক্ষা করার সাথে এর কোনও যোগসূত্র নেই। উদাহরণস্বরূপ, যদি ফোনটি কোনও হোটেলের মতো ক্যাপটিভ পোর্টালের সাথে একটি ওয়াইফাই নেটওয়ার্কের সাথে সংযুক্ত থাকে, তবে এই ফাংশনটি ভুলভাবে সত্যটিতে ফিরে আসবে। সঠিক উত্তরটি পাবলিক ইন্টারনেটে একটি সার্ভারের পিং করা।
মিগুয়েল

9
যখন আমার রাউটারের জন্য কোনও কার্যনির্বাহী ইন্টারনেট নেই, আমি যদি ওয়াইফাইয়ের মাধ্যমে রাউটারের সাথে সংযোগ করি, তবে উপরের কোডটি সত্যই ফিরে আসবে। কিন্তু, এটা ঠিক হওয়ার কথা না? আপনি কি আমাকে সহায়তা করতে পারেন
MoHaN K RaJ

5
আমাকে প্রসঙ্গটি যুক্ত করতে হয়েছিল, context.getSystemServiceএটিতে বা কাজ করে না। আমি এখানে আমার ক্লু পেয়েছি androidhive.info/2012/07/…
ফ্রান্সিসকো

1
নেটওয়ার্কের উপলভ্যতা যাচাই করার দুর্দান্ত উপায়। কিন্তু কিভাবে ইন্টারনেট অ্যাক্সেস চেক করবেন?
তামাস বলভুরি

296

জটিল হওয়ার দরকার নেই। সবচেয়ে সহজ এবং ফ্রেমওয়ার্ক পদ্ধতি হ'ল ACCESS_NETWORK_STATEঅনুমতি ব্যবহার করা এবং কেবল একটি সংযুক্ত পদ্ধতি তৈরি করা

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

    return cm.getActiveNetworkInfo() != null && 
       cm.getActiveNetworkInfo().isConnectedOrConnecting();
}

requestRouteToHostআপনার যদি কোনও পার্টিক্যুয়ালার হোস্ট এবং সংযোগের ধরণ (ওয়াইফাই / মোবাইল) থাকে তবে আপনি এটি ব্যবহার করতে পারেন।

আপনার এছাড়াও প্রয়োজন হবে:

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

আপনার অ্যান্ড্রয়েড ম্যানিফেস্টে


82
যদি কোনও সক্রিয় নেটওয়ার্ক না পাওয়া যায় তবে সেমি.জেটএকটিভ নেটওয়ার্কইনফো () স্তরে নাল চেক করা ভাল।
স্যামুয়েল

দেখতে stackoverflow.com/a/11691676/1979773 requestRouteToHost () সম্পর্কে গভীর exaplanation জন্য
Spartako

আমাকে প্রসঙ্গটি যুক্ত করতে হয়েছিল, context.getSystemServiceএটিতে বা কাজ করে না। আমি এখানে আমার ক্লু পেয়েছি androidhive.info/2012/07/…
ফ্রান্সিসকো

9
আপনি যদি একটি ওয়াইফাই হটস্পটের সাথে সংযুক্ত থাকেন তবে এই হটস্পটে ইন্টারনেট সংযোগ না থাকলেও এই সমাধানটি সত্য হবে।
জোশ


63

getActiveNetworkInfo()কাজ পেতে আপনাকে ম্যানিফেস্টে নিম্নলিখিতটি যুক্ত করতে হবে।

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

এই উত্তরটি অবশ্যই সঠিক উত্তরের অধীনে থাকা উচিত (নরক কী কী তা আবিষ্কার করতে খুব বেশি সময় নষ্ট করা)।
ইন্দ্রেেক কিউ

2
এজেন্টের প্রয়োজন নেই, কেবলমাত্র ACCESS_NETWORK_STATE। আপনি কেবলমাত্র দূরবর্তী অবস্থানগুলিতে সংযোগ স্থাপন করে, ডিভাইসের রেডিওর অবস্থা জিজ্ঞাসাবাদ না করাতে কেবল ইন্টারনেটের প্রয়োজন হয়।
টম

3
আপনার উত্তরটি বর্তমানে সত্যই কোনও উত্তর নয়, এটি অন্যান্য উত্তরের তুলনায় কেবল অপেক্ষাকৃত ছোটখাটো সংযোজন। অন্য সমস্ত উত্তর যদি এখানে না থাকে তবে আপনার উত্তরটি কী অর্থযুক্ত হবে? আসলে তা না. কারণ যদি তা আপনার উত্তরটি কীভাবে ব্যবহার করা যায় তার কোড সহ প্রসারিত করা বা আপনার উত্তরটি সরিয়ে আরও অন্য উত্তরে তথ্য যুক্ত করা ভাল (আপনি কোনও খ্যাতি হারাবেন না)
টিম

সাবধান থাকবেন getActiveNetworkInfo()এপিআই স্তর 29 মধ্যে অবচিত
স্ট্যাক ওভারফ্লো

46

কানেক্টিভিটি ম্যানেজার ক্লাসটি একবার দেখুন। আপনি এই ক্লাসটি কোনও হোস্টের সক্রিয় সংযোগগুলির তথ্য পেতে ব্যবহার করতে পারেন। http://developer.android.com/reference/android/net/ConnectivityManager.html

সম্পাদনা: আপনি ব্যবহার করতে পারেন

Context.getSystemService(Context.CONNECTIVITY_SERVICE)
    .getNetworkInfo(ConnectivityManager.TYPE_MOBILE) 

অথবা

Context.getSystemService(Context.CONNECTIVITY_SERVICE)
    .getNetworkInfo(ConnectivityManager.TYPE_WIFI) 

এবং ফিরে আসা নেটওয়ার্কআইনফোর অবজেক্টের বিশদ স্টেট এনামকে বিশ্লেষণ করুন

সম্পাদনা সম্পাদনা: আপনি কোনও হোস্ট অ্যাক্সেস করতে পারবেন কিনা তা জানতে, আপনি ব্যবহার করতে পারেন

Context.getSystemService(Context.CONNECTIVITY_SERVICE)
    .requestRouteToHost(TYPE_WIFI, int hostAddress)

স্পষ্টতই, আমি বলার জন্য প্রক্সি হিসাবে কনটেক্সট.জেটসিসটেম সার্ভিস (প্রসঙ্গ।

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

নিশ্চিত নয়, তবে বর্তমানে কোন ধরণের নেটওয়ার্ক সংযোগ রয়েছে তা পরীক্ষা করার জন্য কোডটি মনে হচ্ছে। যেমন ওয়াইফাইতে, আপনার বাড়ির ওয়াইফাই রাউটার ইন্টারনেটের সাথে সংযুক্ত রয়েছে তার কোনও গ্যারান্টি নেই ... ইন্টারনেট
সার্ভারের

1
সম্পাদনা সম্পাদনা বিভাগে একটি ত্রুটি ছিল, আমি অনুরোধটি রউট টোহোস্ট () কলটি ছেড়ে দিয়েছি উত্তরটি এখনই পুনরায় পড়ুন :)
চিন্ময় কাঞ্চি

অনুরোধআরউটোস্টেস্টকে অবমূল্যায়ন করা হয়েছে।
জাহাজিল

46

এই কোডটি পরীক্ষা করুন ... এটি আমার জন্য কাজ করেছে :)

public static void isNetworkAvailable(final Handler handler, final int timeout) {
    // ask fo message '0' (not connected) or '1' (connected) on 'handler'
    // the answer must be send before before within the 'timeout' (in milliseconds)

    new Thread() {
        private boolean responded = false;   
        @Override
        public void run() { 
            // set 'responded' to TRUE if is able to connect with google mobile (responds fast) 
            new Thread() {      
                @Override
                public void run() {
                    HttpGet requestForTest = new HttpGet("http://m.google.com");
                    try {
                        new DefaultHttpClient().execute(requestForTest); // can last...
                        responded = true;
                    } 
                    catch (Exception e) {
                    }
                } 
            }.start();

            try {
                int waited = 0;
                while(!responded && (waited < timeout)) {
                    sleep(100);
                    if(!responded ) { 
                        waited += 100;
                    }
                }
            } 
            catch(InterruptedException e) {} // do nothing 
            finally { 
                if (!responded) { handler.sendEmptyMessage(0); } 
                else { handler.sendEmptyMessage(1); }
            }
        }
    }.start();
}

তারপরে, আমি হ্যান্ডলারটি সংজ্ঞায়িত করছি:

Handler h = new Handler() {
    @Override
    public void handleMessage(Message msg) {

        if (msg.what != 1) { // code if not connected

        } else { // code if connected

        }   
    }
};

... এবং পরীক্ষাটি চালু করুন:

isNetworkAvailable(h,2000); // get the answser within 2000 ms

3
গুগল কি ডাউন? এর জন্যও ইন্টারনেটের অনুমতি প্রয়োজন, যা প্রদত্ত কাজটির জন্য অপ্রয়োজনীয়। শেষ অবধি, এটি ডেটা গ্রাস করে (এমনকি তুচ্ছ হলেও)। এটি ঠিক যেমন একটি ক্লেজ মত মনে হয়।
টম

28
@ টম ফেয়ার হতে, সম্ভবত এটিই সঠিক উত্তর। অন্যান্য উদাহরণগুলি কেবল কোনও নেটওয়ার্ক সংযোগ উপলব্ধ কিনা এবং / অথবা যদি সেই নেটওয়ার্কের সাথে কোনও সংযোগ রয়েছে তা দেখায় তবে সেই নেটওয়ার্কটি আসলে একটি দূরবর্তী সংযোগও করতে পারে (উদাহরণস্বরূপ কোনও ওয়েবসাইটের জন্য) তবে প্রশ্নের উত্তর দিবেন না । সুতরাং এই পোস্টার কিউ উত্তর দেয়, এবং অন্যান্য উত্তর দেয় না
slinden77

2
@ ডিএমএইচ, হ্যাঁ, আমি অ্যান্ড্রয়েড API গুলি দিয়ে যা দেখেছি তা থেকে দুর্ভাগ্যজনকভাবে সত্য। সম্ভবত একটি সাধারণ পিং আরও ভাল হতে পারে, stackoverflow.com/questions/3905358/… । আপনি যদি সত্যিই উদ্বিগ্ন থাকেন তবে আপনি আইপিগুলির তালিকা পিংয়ের মধ্যেও অন্তর্ভুক্ত করতে পারেন, কারণ গুগল যখন খুব কম সুযোগ পাবে তখনও গুগল, বিং, এবং ইয়াহু একই দিনে ডাউন হয়ে যাওয়ার সম্ভাবনা রয়েছে smaller । শুধু আমার চিন্তা।
টম

10
এই চেকটি করার কোনও মানে নেই। আপনি যদি গুগলে সংযোগ করার জন্য যদি সিস্টেমের সময় এবং নেটওয়ার্ক সংস্থানগুলিতে ব্যয় করতে চলেছেন তবে আপনি যে সম্পদটি সত্যই যত্নবান সেটির সাথে সংযোগ স্থাপনের পরিবর্তে আপনি সেগুলি ব্যয় করতে পারতেন।
বেনজামিন

16
চীনে গুগল অবরুদ্ধ ছিল !!
অ্যান্টোন

26

এই লিঙ্ক থেকে পাওয়া এবং সংশোধিত (!) :

আপনার ম্যানিফেস্ট ফাইলটিতে কমপক্ষে যুক্ত করুন:

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

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

private boolean checkInternetConnection() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    // test for connection
    if (cm.getActiveNetworkInfo() != null
            && cm.getActiveNetworkInfo().isAvailable()
            && cm.getActiveNetworkInfo().isConnected()) {
        return true;
    } else {
        Log.v(TAG, "Internet Connection Not Present");
        return false;
    }
}

18

আমি এই কোডটি তৈরি করেছি, এটি সবচেয়ে সহজ এবং এটি কেবল একটি বুলিয়ান। জিজ্ঞাসা করেif(isOnline()){

কোনও সংযোগ থাকলে এবং এটি কোনও পৃষ্ঠায় স্থিতি কোড 200(স্থিতিশীল সংযোগ) এর সাথে সংযোগ করতে পারলে আপনি পান ।

সঠিক INTERNETএবং ACCESS_NETWORK_STATEঅনুমতি যোগ করার বিষয়টি নিশ্চিত করুন ।

public boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnected()) {
        try {
            URL url = new URL("http://www.google.com");
            HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
            urlc.setConnectTimeout(3000);
            urlc.connect();
            if (urlc.getResponseCode() == 200) {
                return new Boolean(true);
            }
        } catch (MalformedURLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    return false;
}

6
হতে পারে আপনার এইচটিপিআরএল সংযোগ দ্বারা 200 প্রতিস্থাপন করা উচিত H এইচটিটিপি_ও
যশ

5
গুগল ডাউন থাকলে কী হবে?
ইওরাউ গাদাব 14 '26

12

এটি আমার পক্ষে কাজ করে:

নেটওয়ার্ক উপলব্ধতা যাচাই করতে:

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

ইন্টারনেট অ্যাক্সেস যাচাই করতে:

public Boolean isOnline() {
    try {
        Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
        int returnVal = p1.waitFor();
        boolean reachable = (returnVal==0);
        return reachable;
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return false;
}

এটি কোনও সার্ভার সত্যই ঠিক আছে কিনা তা যাচাই করার জন্য দুর্দান্ত সমাধান। ধন্যবাদ!
উইলিউউ

1
আইসনলাইনটি () মূল থ্রেডে মোটেই চলবে না, যেন Wi-Fi সংকেত রয়েছে তবে কোনও ইন্টারনেট এটি খুব বেশি সময় নিবে এবং মূল থ্রেডটি ব্লক করবে।
হামাজ করা হয়েছে

9

একাধিক উপায় আছে

প্রথম, সবচেয়ে সংক্ষিপ্ত তবে অপ্রয়োজনীয় উপায়

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

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

তারপরে এই পদ্ধতিটি,

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

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

        return isConnected;

    }

উত্তরে যেমন দেখা যায় ConnectivityManagerএটি একটি সমাধান, আমি কেবল এটি একটি পদ্ধতির মধ্যে এটিকে যুক্ত করেছি এটি একটি সরলিকৃত পদ্ধতি যা যদি ব্যবহার করা হয়
ConnectivityManagerতবে কোনও ইন্টারনেট অ্যাক্সেস নয় এমন কোনও নেটওয়ার্ক অ্যাক্সেস রয়েছে তবে এটি ব্যবহার করা সত্য, যদি আপনার ওয়াইফাই কোনও রাউটারের সাথে সংযুক্ত থাকে তবে রাউটারের কোনও ইন্টারনেট নেই means সত্য ফিরে আসে, এটি সংযোগ উপলব্ধতা পরীক্ষা করে

দ্বিতীয়, দক্ষ উপায়

নেটওয়ার্ক স্টেট এবং ইন্টারনেট অনুমতি প্রয়োজন

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

তাহলে এই ক্লাস,

 public class CheckInternetAsyncTask extends AsyncTask<Void, Integer, Boolean> {

        private Context context;

        public CheckInternetAsyncTask(Context context) {
            this.context = context;
        }

        @Override
        protected Boolean doInBackground(Void... params) {

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

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


            if (isConnected) {
                try {
                    HttpURLConnection urlc = (HttpURLConnection)
                            (new URL("http://clients3.google.com/generate_204")
                                    .openConnection());
                    urlc.setRequestProperty("User-Agent", "Android");
                    urlc.setRequestProperty("Connection", "close");
                    urlc.setConnectTimeout(1500);
                    urlc.connect();
                    if (urlc.getResponseCode() == 204 &&
                            urlc.getContentLength() == 0)
                        return true;

                } catch (IOException e) {
                    Log.e("TAG", "Error checking internet connection", e);
                    return false;
                }
            } else {
                Log.d("TAG", "No network available!");
                return false;
            }


            return null;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);
            Log.d("TAG", "result" + result);

            if(result){
                // do ur code
            }

        }


    }

কল CheckInternetAsyncTask

new CheckInternetAsyncTask(getApplicationContext()).execute();

কিছু ব্যাখ্যা: -

  • আপনাকে ইন্টারনেট চেক AsyncTaskকরতে হবে, অন্যথায় এটি android.os.NetworkOnMainThreadExceptionকিছু ক্ষেত্রে ফেলে দিতে পারে

  • ConnectivityManager সত্যিকারের অনুরোধ (পিং) প্রেরণ করা থাকলে নেটওয়ার্ক অ্যাক্সেস পরীক্ষা করতে ব্যবহৃত হয়

  • রাখার জন্য অনুরোধ পাঠানো http://clients3.google.com/generate_204, এই সুপরিচিত URL টি পরিচিত হয় একটি HTTP স্থিতি 204 সহ একটি খালি পেজ দেখায় এই দ্রুত ও আরও কার্যকর চেয়ে http://www.google.comপড়তে এই । আপনার যদি ওয়েবসাইট থাকে তবে গুগলের পরিবর্তে আপনাকে ওয়েবসাইট স্থাপন করা পছন্দ করে, কেবলমাত্র আপনি যদি অ্যাপ্লিকেশনটিতে এটি ব্যবহার করেন

  • সময়সীমা পরিবর্তন করা যেতে পারে (20 মিমি -> 2000 মিমি), 1500 মিমি সাধারণত ব্যবহৃত হয় commonly


2
দুর্দান্ত প্রশ্ন, এটির জন্য দুঃখজনক যে আপনার আরও পয়েন্ট নেই। এটি অবশ্যই সঠিক উত্তর হবে।
ঝন ফ্রেডি ট্রুজিলো ওরতেগা

আমি অ্যান্ড্রয়েডে নতুন। যদিও এটি ভাল উত্তরটি আচ্ছাদিত এবং এটি আরও মনোযোগ পেয়েছে @ 7569106
মাজন এম্বেবি

1
সেরা এবং সম্পূর্ণ উত্তর, আপনাকে ধন্যবাদ। কারও কাছে যদি কোনও ওয়েবসাইটের নোটিশ থাকে যে শর্তটি অবশ্যই এই urlc.getResponseCode () == 200 পছন্দ করে এবং urlc.getContentLength () == 0
AREF

আপনার দ্বিতীয় বিকল্পটি ক্র্যাশ হয়ে যায় আমি কেন জানি না
নাফিজ

এটি অ্যাপ্লিকেশনকে
হিমশীতল

8

আমি এখন পর্যন্ত যা দেখলাম তার মধ্যে সবচেয়ে স্বল্পতম এবং পরিষ্কার উপায় হওয়া উচিত:

public final static boolean isConnected( Context context )
{   
   final ConnectivityManager connectivityManager = 
         (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE );  
   final NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();    
   return networkInfo != null && networkInfo.isConnected();
}

পিএস: এটি কোনও হোস্টকে পিং করে না, এটি কেবল কানেকশনস্ট্যাটাসটি পরীক্ষা করে, তাই যদি আপনার রাউটারের কোনও ইন্টারনেট সংযোগ না থাকে এবং আপনার ডিভাইস এটির সাথে সংযুক্ত থাকে তবে আপনার কাছে ইন্টারনেট না থাকলেও এই পদ্ধতিটি সত্য হয়ে যাবে ।
প্রকৃত পরীক্ষার জন্য আমি এইচটিটিপিএইড অনুরোধটি (যেমন www.google.com তে) কার্যকর করার সুপারিশ করব এবং এর 200 টি ঠিক আছে যদি সবকিছু ঠিক আছে এবং আপনার ডিভাইসে একটি ইন্টারনেট সংযোগ আছে তবে স্থিতিটি পরীক্ষা করব ।


আমি এই পদ্ধতিটি একটি বিশ্বব্যাপী ক্লাসে রাখতে চেয়েছিলাম তাই আমাকে এই সংস্করণটি ব্যবহার করতে হবে যাতে আমি যে কার্যকলাপ থেকে কল করছি তার থেকে প্রসঙ্গটি পাস করতে পারি। ধন্যবাদ!
RyanG

8

আমি যে পদ্ধতিটি ব্যবহার করি তা এখানে:

public boolean isNetworkAvailable(final Context context) {
    return ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo() != null;
}

আরও ভাল, এটি "সংযুক্ত" আছে কিনা তা পরীক্ষা করে দেখুন:

public boolean isNetworkAvailable(final Context context) {
    final ConnectivityManager connectivityManager = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE));
    return connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected();
}

পদ্ধতিটি কীভাবে ব্যবহার করবেন তা এখানে:

if (isNetworkAvailable(context)) {
    // code here
} else {
    // code
}

অনুমতি প্রয়োজন:

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

https://stackoverflow.com/a/16124915/950427


7

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

/*
 * Not Thread safe. Blocking thread. Returns true if it
 * can connect to URL, false and exception is logged.
 */
public boolean checkConnectionHttps(String url){
    boolean responded = false;
    HttpGet requestTest = new HttpGet(url);
    HttpParams params = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(params, 3000);
    HttpConnectionParams.setSoTimeout(params, 5000);
    DefaultHttpClient client = new DefaultHttpClient(params);
    try {
        client.execute(requestTest);
        responded = true;
    } catch (ClientProtocolException e) {
        Log.w(MainActivity.TAG,"Unable to connect to " + url + " " + e.toString());
    } catch (IOException e) {
        Log.w(MainActivity.TAG,"Unable to connect to " + url + " " + e.toString());
        e.printStackTrace();
    }
    return responded;
}

3
প্রকৃতপক্ষে শেষ থেকে শেষের সংযোগটি পরীক্ষা করার জন্য +1। "ক্যাপটিভ পোর্টাল" পরিস্থিতিটির জন্য, তবে আমি খুঁজে পেয়েছি যে সাইন ইন না করেও অনেকে উপরের পরীক্ষায় উত্তীর্ণ হবে - আপনি লগইন পৃষ্ঠা এবং 200 টি প্রতিক্রিয়া পাবেন আপনি যেই url চাইবেন না কেন। সুতরাং আমি আমার নিজের ডোমেনের একটি পৃষ্ঠা হিট করার চেষ্টা করি যা আমি জানি যে এর অস্তিত্ব নেই এবং আমি নিশ্চিত হয়েছি যে আমি একটি 404 পেয়েছি tern পর্যায়ক্রমে, আপনি একটি বিদ্যমান বিদ্যমান পৃষ্ঠায় আঘাত করতে পারেন, আপনি 200 টি পেয়েছেন তা নিশ্চিত করতে পারেন এবং সামগ্রীটি যাচাই করেছেন এটি আপনার প্রত্যাশা যা তা নিশ্চিত করে ফিরে আসে।
গ্রেইয়ার্ডেডজিক

6

আপনি সমস্ত নেটওয়ার্ক সংযোগে পুনরাবৃত্তি করতে পারেন এবং কমপক্ষে একটি উপলভ্য সংযোগ রয়েছে কিনা তা চেক করতে পারেন:

public boolean isConnected() {
    boolean connected = false;

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

    if (cm != null) {
        NetworkInfo[] netInfo = cm.getAllNetworkInfo();

        for (NetworkInfo ni : netInfo) {
            if ((ni.getTypeName().equalsIgnoreCase("WIFI")
                    || ni.getTypeName().equalsIgnoreCase("MOBILE"))
                    && ni.isConnected() && ni.isAvailable()) {
                connected = true;
            }

        }
    }

    return connected;
}

6

আমার জন্য ক্রিয়াকলাপ শ্রেণিতে সংযোগের অবস্থাটি পরীক্ষা করা ভাল অভ্যাস ছিল না, কারণ

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

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

JSONObject jObj = null;
Boolean responded = false;
HttpGet requestForTest = new HttpGet("http://myserver.com");
try {
    new DefaultHttpClient().execute(requestForTest);
    responded = true;
} catch (UnknownHostException e) {
    jObj = new JSONObject();
    try {
        jObj.put("answer_code", 1);
        jObj.put("answer_text", "No available connection");
    } catch (Exception e1) {}
    return jObj;
} catch (IOException e) {
    e.printStackTrace();
}

এইভাবে আমি একই বর্গের অন্যান্য কেসগুলির সাথে এই কেসটি পরিচালনা করতে পারি (আমার সার্ভার সর্বদা জেসন স্ট্রিং দিয়ে প্রতিক্রিয়া জানায়)


6

এটা আমার জন্য কাজ করে। চেষ্টা কর.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    try {
        URL url = new URL("http://stackoverflow.com/posts/11642475/edit" );
        //URL url = new URL("http://www.nofoundwebsite.com/" );
        executeReq(url);
        Toast.makeText(getApplicationContext(), "Webpage is available!", Toast.LENGTH_SHORT).show();
    }
    catch(Exception e) {
        Toast.makeText(getApplicationContext(), "oops! webpage is not available!", Toast.LENGTH_SHORT).show();
    }
}

private void executeReq(URL urlObject) throws IOException
{
    HttpURLConnection conn = null;
    conn = (HttpURLConnection) urlObject.openConnection();
    conn.setReadTimeout(30000);//milliseconds
    conn.setConnectTimeout(3500);//milliseconds
    conn.setRequestMethod("GET");
    conn.setDoInput(true);

    // Start connect
    conn.connect();
    InputStream response =conn.getInputStream();
    Log.d("Response:", response.toString());
}}

এই উত্তরটি এখনই কাজ করতে পারে না, যেহেতু আমরা এখন মূল থ্রেডে নেটওয়ার্ক অ্যাক্সেস করতে পারি না।
白 布鞋

1
আমার অর্থ এপিআই স্তর 11 থেকে, এটি কাজ করে না। কারণ: বিকাশকারী.অ্যান্ড্রয়েড . com/references/android/ os/… । যদি এটি আপনার পক্ষে কাজ করে তবে এর অর্থ আপনি এই কোডটি পুরানো অ্যান্ড্রয়েড ডিভাইসে চালাচ্ছেন। (গিগাবাইটের পূর্বে)
白 布鞋

স্ট্রিক্টমোড.থ্রেডপলিসি নীতি = নতুন স্ট্রাইকডমড.থ্রেডপলিসি.বিল্ডার () .permitAll ()। Build (); StrictMode.setThreadPolicy (নীতি); নেটওয়ার্কের মূল থ্রেড ব্যতিক্রম এড়ানোর জন্য এই দুটি লাইন দুটি আপনার প্রোগ্রাম যুক্ত করুন
সেলভা_পোল্লাচি

ঠিক আছে, আমি এটি ব্যবহার করতে পারি না বলার অপেক্ষা রাখে না, আমার বলা উচিত এটি কাজ করতে পারে (টার্গেট পুরানো সংস্করণ বা স্ট্রাইকমোড সেটআপ দ্বারা) তবে নিরুৎসাহিত করা হয়েছে। এটি সহজেই এএনআর হতে পারে। (Httpslconnication এ এত উচ্চ টাইমআউট কনফিগারেশন সহ)
白 布鞋

হ্যাঁ..আপনি ঠিক বলেছেন .. ঠিক আমি এটাই রেখেছি কারণ এটিও অন্যতম উপায়।
সেলভা_পোল্লাচি

6

এই পদ্ধতিটি আপনাকে সত্যিকারের দ্রুত পদ্ধতির (রিয়েল টাইম প্রতিক্রিয়ার জন্য) বা একটি ধীর পদ্ধতির বিকল্প দেয় (যাচাইয়ের জন্য নির্ভরযোগ্যতার প্রয়োজন হয়)

public boolean isNetworkAvailable(bool SlowButMoreReliable) {
    bool Result = false; 
    try {
        if(SlowButMoreReliable){
            ConnectivityManager MyConnectivityManager = null;
            MyConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo MyNetworkInfo = null;
            MyNetworkInfo = MyConnectivityManager.getActiveNetworkInfo();

            Result = MyNetworkInfo != null && MyNetworkInfo.isConnected();

        } else
        {
            Runtime runtime = Runtime.getRuntime();
            Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");

            int i = ipProcess.waitFor();

            Result = i== 0;

        }

    } catch(Exception ex)
    {
        //Common.Exception(ex); //This method is one you should have that displays exceptions in your log
    }
    return Result;
}

5

আমি ইনটাএড্রেসের পরিবর্তে এই কোডটি ব্যবহার করছি:

    try {

        URL url = new URL("http://"+params[0]);

        HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
        urlc.setRequestProperty("User-Agent", "Android Application:"+Z.APP_VERSION);
        urlc.setRequestProperty("Connection", "close");
        urlc.setConnectTimeout(1000 * 30); // mTimeout is in seconds
        urlc.connect();
        if (urlc.getResponseCode() == 200) {
            Main.Log("getResponseCode == 200");
            return new Boolean(true);
        }
    } catch (MalformedURLException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

আইওএক্সেপশন মানে কোনও ইন্টারনেট সংযোগ নেই এবং এটি কতটা নির্ভরযোগ্য হতে পারে তা যদি আপনি স্পষ্ট করে থাকেন তবে দুর্দান্ত হবে।
মিলাদ.নোজারি

5

অ্যান্ড্রয়েড নেটওয়ার্ক / ইন্টারনেট সংযোগের স্থিতি পরীক্ষা করা জটিল নয়। নীচের DetectConnectionশ্রেণিটি আপনাকে এই স্থিতিটি পরীক্ষা করতে সহায়তা করবে:

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

public class DetectConnection {
    public static boolean checkInternetConnection(Context context) {
        ConnectivityManager con_manager = (ConnectivityManager) context
                                .getSystemService(Context.CONNECTIVITY_SERVICE);

        if (con_manager.getActiveNetworkInfo() != null
            && con_manager.getActiveNetworkInfo().isAvailable()
            && con_manager.getActiveNetworkInfo().isConnected()) {
                return true;
        } else {
            return false;
        }
    }
}

আরও তথ্যের জন্য অ্যান্ড্রয়েড নেটওয়ার্ক / ইন্টারনেট সংযোগের স্থিতি কীভাবে চেক করবেন তা দেখুন


5

সেরা পদ্ধতির:

public static boolean isOnline() {
    try {
    InetAddress.getByName("google.com").isReachable(3);

    return true;
    } catch (UnknownHostException e){
    return false;
    } catch (IOException e){
    return false;
    }
    }

1
আমি এই পদ্ধতির পছন্দ করি তবে আমাকে কিছু বিষয় উল্লেখ করতে হবে। isReachable () একটি বুলিয়ান দেয়, সুতরাং চেষ্টা বিভাগে সত্য ফিরে আসার পরিবর্তে, আপনি এটি বুলেয়ান সংযুক্ত = InetAddress.getByName ("google.com") এর মতো করতে পারেন is isReachable (3); তারপরে সংযুক্ত ফিরে আসুন। এছাড়াও, আইসেচিয়েবল আইওএক্সেপশন এবং ইলিজালআরগমেন্ট এক্সসেপশন ব্যতিক্রম ছুঁড়ে ফেলেছে, সুতরাং এটি অজানাহস্টএক্সেপশনকে ইলিজালআরগমেন্টএক্সসেপশন প্রতিস্থাপন এবং তৃতীয় ক্যাচ সহ: ক্যাচ (ব্যাতিকরণ E) সহ একটি ভাল ধারণা হবে।
যশ

2
তবে, isReachable ICMP ব্যবহার করে যার জন্য রুট সুবিধার দরকার হতে পারে এবং পোর্ট 7 ব্যবহার করে যা সর্বশেষ সিস্টেমে সাধারণত চলমান পরিষেবাদি নেই। সুতরাং কোনও অনলাইন পরিষেবাদির রুটটি চেক করার সর্বোত্তম উপায় হ'ল নিয়মিত টিসিপি; অতএব একটি ডাউন ভোট
যশ

5

নিম্নলিখিতটি আমার Utilsক্লাসের কোড :

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

5
public class Network {

Context context;

public Network(Context context){
    this.context = context;
}

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

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

}

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

5

নেটওয়ার্ক উপলভ্যতা সনাক্ত করতে আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন-

public static boolean isDeviceOnline(Context context) {
        boolean isConnectionAvail = false;
        try {
            ConnectivityManager cm = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            return netInfo.isConnected();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return isConnectionAvail;
    }

5

আমি @ লিভিট এবং তৈরি ফাংশন দ্বারা সরবরাহিত সমাধানটি প্রয়োগ করেছি যা অতিরিক্ত এইচটিপি অনুরোধকে কল করবে না।

এটি ত্রুটিটি সমাধান করবে Unable to Resolve Host

public static boolean isInternetAvailable(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    if (activeNetwork == null) return false;

    switch (activeNetwork.getType()) {
        case ConnectivityManager.TYPE_WIFI:
            if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED ||
                    activeNetwork.getState() == NetworkInfo.State.CONNECTING) &&
                    isInternet())
                return true;
            break;
        case ConnectivityManager.TYPE_MOBILE:
            if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED ||
                    activeNetwork.getState() == NetworkInfo.State.CONNECTING) &&
                    isInternet())
                return true;
            break;
        default:
            return false;
    }
    return false;
}

private static boolean isInternet() {

    Runtime runtime = Runtime.getRuntime();
    try {
        Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
        int exitValue = ipProcess.waitFor();
        Debug.i(exitValue + "");
        return (exitValue == 0);
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }

    return false;
}

এখন এটিকে কল করুন,

if (!isInternetAvailable(getActivity())) {
     //Show message
} else {
     //Perfoem the api request
}

4

এটি অ্যান্ড্রয়েড ডক্সে আচ্ছাদিত http://developer.android.com/training/monmitted-device-state/connectivity-monmitted.html


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

2
তথ্যের একটি লিঙ্ক পোস্ট করার চেয়ে প্রশ্নের উত্তর দেওয়া আরও ভাল। লিঙ্কটি মারা গেলে কী হবে? আমাদের কোন উত্তর হবে না।
হোসে ল্লাউসাস

4

আমি সমস্ত উত্তর দিয়েছি এবং আমি আমার নিজের উত্তর নিয়ে এসেছি যা প্রথমে ইন্টারনেট উপলব্ধ কিনা তা যাচাই করে এবং যদি ইন্টারনেট পাওয়া যায় তবে তা এটি সক্রিয় কিনা তা যাচাই করে।

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

NetworkUtils.class

public class NetworkUtils {

    public static final int STATUS_CONNECTED = 0 ;

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

    public static int isInternetActiveWithPing() {
        try {
            Runtime runtime = Runtime.getRuntime();
            Process process = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
            int exitValue = process.waitFor();
            return exitValue;
        } catch (Exception ex) {
            return -1;
        }
    }

    public static boolean isInternetActiveWithInetAddress() {
        try {
            InetAddress inetAddress = InetAddress.getByName("www.google.com");
            return inetAddress != null && !inetAddress.toString().equals("");
        } catch (Exception ex) {
            return false;
        }
    }

    public static void displayInternetConnectionMessage(Context ctx){
        Toast.makeText(ctx, "Check Internet Connection", Toast.LENGTH_SHORT).show();
    }
}

নীচের কোড ব্যবহার করে ইন্টারনেট সক্রিয় কিনা তা আপনি পরীক্ষা করতে পারেন:

 private void checkInternetConnection() {
        if (NetworkUtils.isInternetAvailable(this)) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    if (NetworkUtils.isInternetActiveWithPing() == NetworkUtils.STATUS_CONNECTED) {
                        performNetworkingOperations();
                    } else {
                        if (NetworkUtils.isInternetActiveWithInetAddress()) {
                            performNetworkingOperations();
                        } else {
                            displayConnectionMessage();
                        }
                    }
                }
            }).start();

        } else {
            displayConnectionMessage();
        }
    }

    private void performNetworkingOperations() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MainActivity.this, "Internet is Available", Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void displayConnectionMessage() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                NetworkUtils.displayInternetConnectionMessage(MainActivity.this);
            }
        });
    }

আপনার নেটওয়ার্ক ইউটিলে উন্নত প্যাক থ্রেডিং এবং অতএব বিকাশকারীকে আপনার পদ্ধতিটি ভুলভাবে ব্যবহার না করতে "চাপ দিন"
ইওকস

শর্ত থাকলে অতিরিক্ত একটি অপসারণ করতে। if ((NetworkUtils.isInternetActiveWithPing () == NetworkUtils.STATUS_CONNECTED) || NetworkUtils.isInternetActiveWithInetAddress ()) {// নেটওয়ার্ক অপারেশন করুন} অন্যথায় Error // ত্রুটি বার্তা}
জাওয়াদ জেব

4

IsAv উপলভ্য () এর সাথে আমাদের সংযোগ রয়েছে কিনা তা পরীক্ষা করা খুব গুরুত্বপূর্ণ এবং যদি সম্ভব হয় তবে এটি সংযোগযুক্ত () এর সাথে সংযোগ স্থাপন করতে পারে

private static ConnectivityManager manager;

public static boolean isOnline(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected();
}

এবং আপনি নেটওয়ার্ক সক্রিয় ওয়াইফাই ধরণের নির্ধারণ করতে পারেন :

public static boolean isConnectedWifi(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
}

বা মোবাইল মাভিল :

public static boolean isConnectedMobile(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
}

অনুমতিগুলি ভুলে যাবেন না:

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

ডিভাইস সংযোগের উপাদানগুলির দুর্দান্ত সংক্ষিপ্তসার, ক্র্যাশগুলি এড়ানোর জন্য কেবল তাদের চেষ্টা / ক্যাপচার স্টেটমেন্টে মোড়ানো প্রয়োজন। একইভাবে, কেবলমাত্র আপনার রুটিন এইচটিপিআরএল সংযোগ কলগুলি করুন, যতক্ষণ না তারা ত্রুটি পরিচালনায় জড়িত থাকে, আপনি শীঘ্রই জানতে পারবেন আপনার কোনও ইন্টারনেট সংযোগ রয়েছে কি না
রঙ্গী

4

কোটলিন এবং কর্টিনগুলি

আমি ফাংশনটি একটিতে রেখেছি ViewModel, যা আছে viewModelScope। একটি পর্যবেক্ষণযোগ্য ব্যবহার করে LiveDataআমি সংযোগ সম্পর্কে একটি ক্রিয়াকলাপকে অবহিত করি।

ViewModel

 fun checkInternetConnection() {
        viewModelScope.launch {
            withContext(Dispatchers.IO) {
                try {
                    val timeoutMs = 3000
                    val socket = Socket()
                    val socketAddress = InetSocketAddress("8.8.8.8", 53)

                    socket.connect(socketAddress, timeoutMs)
                    socket.close()

                    withContext(Dispatchers.Main) {
                        _connection.value = true
                    }
                }
                catch(ex: IOException) {
                    withContext(Main) {
                        _connection.value = false
                    }
                }
            }
        }
    }
 private val _connection = MutableLiveData<Boolean>()
 val connection: LiveData<Boolean> = _connection

কার্যকলাপ

 private fun checkInternetConnection() {
     viewModel.connection.observe(this) { hasInternet ->
         if(!hasInternet) {
             //hasn't connection
         }
         else {
            //has connection
         }
     }
  }

3

কেবলমাত্র নিম্নলিখিত ক্লাসটি তৈরি করুন যা একটি ইন্টারনেট সংযোগের জন্য পরীক্ষা করে:

public class ConnectionStatus {

    private Context _context;

    public ConnectionStatus(Context context) {
        this._context = context;
    }

    public boolean isConnectionAvailable() {
        ConnectivityManager connectivity = (ConnectivityManager) _context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity != null) {
            NetworkInfo[] info = connectivity.getAllNetworkInfo();
            if (info != null)
                for (int i = 0; i < info.length; i++)
                    if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                        return true;
                    }
        }
        return false;
    }
}

এই শ্রেণিতে কেবল একটি পদ্ধতি রয়েছে যা সংযোগের স্থিতির বুলিয়ান মান প্রদান করে। অতএব সহজ শর্তে, পদ্ধতিটি যদি ইন্টারনেটে একটি বৈধ সংযোগ খুঁজে পায়, তবে ফেরতের মানটি হয় true, অন্যথায় falseযদি কোনও বৈধ সংযোগ না পাওয়া যায়।

মেইনএ্যাকটিভিটির নিম্নলিখিত পদ্ধতিটি এরপরে বর্ণিত পদ্ধতি থেকে ফলাফলটি কল করে এবং ব্যবহারকারীকে সেই অনুযায়ী কাজ করতে অনুরোধ করে:

public void addListenerOnWifiButton() {
        Button btnWifi = (Button)findViewById(R.id.btnWifi);

        iia = new ConnectionStatus(getApplicationContext());

        isConnected = iia.isConnectionAvailable();
        if (!isConnected) {
            btnWifi.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
                    Toast.makeText(getBaseContext(), "Please connect to a hotspot",
                            Toast.LENGTH_SHORT).show();
                }
            });
        }
        else {
            btnWifi.setVisibility(4);
            warning.setText("This app may use your mobile data to update events and get their details.");
        }
    }

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


3

29/06/2015 আপডেট করুন আপনি যদি Xamarin.Android ব্যবহার করে থাকেন এবং সংযোগের জন্য যাচাই করতে চান, আপনি একটি নুগেট প্যাকেজ ব্যবহার করতে পারেন যা আপনাকে একাধিক প্ল্যাটফর্মে এই কার্যকারিতা দেয়। ভাল প্রার্থীরা এখানে এবং এখানে আছেন । [আপডেটের শেষ]

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

using Android.App;
using Android.Content;
using Android.Net;

namespace Leopard.Mobile.Hal.Android
{
    public class AndroidNetworkHelper
    {
        public static AndroidNetworkStatus GetWifiConnectivityStatus()
        {
            return GetConnectivityStatus(ConnectivityType.Wifi);
        }

        public static AndroidNetworkStatus GetMobileConnectivityStatus()
        {
            return GetConnectivityStatus(ConnectivityType.Mobile);
        }

        #region Implementation

        private static AndroidNetworkStatus GetConnectivityStatus(ConnectivityType connectivityType)
        {
            var connectivityManager = (ConnectivityManager)Application.Context.GetSystemService(Context.ConnectivityService);
            var wifiNetworkInfo = connectivityManager.GetNetworkInfo(connectivityType);
            var result = GetNetworkStatus(wifiNetworkInfo);
            return result;
        }

        private static AndroidNetworkStatus GetNetworkStatus(NetworkInfo wifiNetworkInfo)
        {
            var result = AndroidNetworkStatus.Unknown;
            if (wifiNetworkInfo != null)
            {
                if (wifiNetworkInfo.IsAvailable && wifiNetworkInfo.IsConnected)
                {
                    result = AndroidNetworkStatus.Connected;
                }
                else
                {
                    result = AndroidNetworkStatus.Disconnected;
                }
            }
            return result;
        } 

        #endregion
    }

    public enum AndroidNetworkStatus
    {
        Connected,
        Disconnected,
        Unknown
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.