کنترل و چک کردن اتصالات اینترنت و شبکه از طریق BroadCastReciever در اندروید

منتشرشده توسط حامد قنبری در تاریخ

 

اندروید اجازه اتصال به اینترنت یا هر شبکه محلی دیگری را  به برنامه شما می دهد، همچنین به شما اجازه می دهد تا عملیات مرتبط با شبکه را در برنامه خودتان داشته باشید  .از این رو یک دستگاه به وسیله برنامه شما می تواند به انواع مختلفی از اتصالات شبکه دسترسی پیدا کند. اگر برنامه شما نیاز به اتصال به اینترنت دارد یا شما نیاز به اتصال به اینترنت در کل برنامه خود دارید، بهتر است قبل از هر هر نوع اتصالی برای جلوگیری از خطا های پیش بینی نشده وضعیت اتصال به اینترنت را چک کنید.

بررسی اتصال شبکه

قبل از اینکه  بخواهید  در برنامه خودتان هرگونه عملیات شبکه انجام دهید، ابتدا باید بررسی کنید که آیا شما به آن شبکه یا اینترنت متصل هستید. برای این کار اندروید کلاس ConnectivityManager را معرفی کرده است. شما باید با استفاده از متد () getSystemService یک object از این کلاس را ایجاد کنید نحو  برنامه نویسی آن در زیر آورده شده است :

ConnectivityManager connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);

هنگامی که شما آبجکتی از کلاس ConnectivityManager را ایجاد می کنید می توانید از طریق متدهای getAllNetworkInfo () یا getActiveNetworkInfo ()  به اطلاعات مربوط به اتصالات شبکه اندروید دسترسی پیدا و اطلاعات مربوط به تمام شبکه های فعال یا غیرفعال را دریافت کنید. در متد اول یک آرایه از NetworkInfo را بازمی گرداند و متد دوم اطلاعات مربوط به شبکه فعال را بازمیگرداند. شما می توانید از سورس زیر استفاده کنید.

NetworkInfo[] info = check.getAllNetworkInfo();//All network info

NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();//Active network info

آخرین چیزی که باید انجام دهید این است که وضعیت اتصال شبکه را بررسی کنید. نحو ه برنامه نویسی آن در زیر آورده شده است :

  for (int i = 0; i<info.length; i++){
            if (info!= null && info[i].getState() == NetworkInfo.State.CONNECTED){
                Toast.makeText(context, "Internet is connected
                        Toast.LENGTH_SHORT).show();
            }
        }

//Active network info
        if (networkInfo != null && networkInfo.isConnected()) {
            Toast.makeText(context, "Internet is connected
                    Toast.LENGTH_SHORT).show();

        }

 

به غیر از این وضعیت های اتصال ، وضعیت های دیگری که شبکه می توانند به آن دست یابد وجود داردکه در زیر لیست شده اند:

 

Connecting.

Disconnected.

Disconnecting.

Suspended.

Unknown.

در حال حاضر، از آنجا که ما با استفاده از BroadCastReciever برای تشخیص اتصال به اینترنت استفاده می کنیم لازم در این خصوص اطلاعاتی مختصری خدمت دوستان ارائه کنم.

BroadCastReciever  مکانیزمی برای ثبت واکنش های لازم به هنگام رویدادهای  خاص در دستگاه اندروید است که ممکن است این رویدادها  توسط خود دستگاه یا برنامه های دیگر ایجاد شده باشد. به عنوان مثال، می توان برنامه ای نوشت که  با ثبت یک BroadCastReciever  به وضعیت مختلف باتری گوشی اندروید حساس باشد و به هنگام شارژ کامل گوشی یا خالی شدن باتری پیامی را به کاربر در مورد وضعیت باتری نشان دهد .بنابراین این گBroadCastReciever است که این وضعیت  را رهگیری می کند و اقدام مناسب را آغاز می کند.

اگر در داخل برنامه اکلیپس یا اندروید استودیو قرار دارید پروژه جدیدی را  ایجاد کنید

اکلیپس :File ⇒ New Android ⇒ Application Project

اندروید استودیو :File ⇒ New  ⇒ New Project

اما اگر هنوز برنامه خود را باز نکرده اید یکی از برنامه های فوق را باز نموده و بعد از تعیین مشخصات(نامگذاری) ، تعیین حداقل sdk  و نوع اکتیویتی (blank  یا Empty) ، نام اکتیویتی ابتدایی و اصلی خود  را همان MainActivity قرار دهید.

پس از ساخت پروژه، دومین چیزی که ما باید انجام دهیم این است که مجوزهای خاصی را برای فایل Manifest برای دسترسی به حالت شبکه اضافه کنیم.

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

پس از اعطای مجوز، ما باید گیرنده خود را نیز در پرونده مانیفست با intet filter ها تعریف کنیم تا از ین طریق مطمئن شویم که آن را فعال کرده ایم.

<receiver
    android:name=".InternetConnector_Receiver"
    android:enabled="true" >
    <intent-filter>

        <!-- Intent filters for broadcast receiver -->
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
        <action android:name="android.net.wifi.STATE_CHANGE" />
    </intent-filter>
</receiver>

در نهایت فایل AndroidManfest.xml  ما به شکل زیر خواهد بود:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="examples.psrd.ir.myapplication">
 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <receiver
                android:name=".InternetConnector_Receiver"
                android:enabled="true" >
                <intent-filter>
                    <!-- Intent filters for broadcast receiver -->
                    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                    <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
                    <action android:name="android.net.wifi.STATE_CHANGE" />
                </intent-filter>
            </receiver>
        </activity>
    </application>

</manifest>

 

در مسیر res ⇒layout لایه متناظر اکتیوتی اصلی یعنی activity_main را پیدا نمود و کدهای مندرج و پیش فرض آن را پاک کرده و کدهای xml  زیر را به آن اضافه کنید:

 

<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
xmlns:tools=”http://schemas.android.com/tools”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:gravity=”center” >

<TextView
android:id=”@+id/internet_status”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:gravity=”center”
android:textSize=”20sp”
android:textStyle=”bold” />

</RelativeLayout>

این کلاس برای بررسی اینکه آیا اکتیویتی قابل مشاهده است یا خیر استفاده می شود و در صورت قابل مشاهده بودن اکتیویتی broadCastReciever را فعال می کند.

package examples.psrd.ir.myapplication;


        import android.app.Application;

public class MyApplication extends Application {

    

    public static boolean activityVisible; 
    

    public static boolean isActivityVisible() {
        return activityVisible;
    }

    public static void activityResumed() {
        activityVisible = true;

    }

    public static void activityPaused() {
        activityVisible = false;

    }

}

 

 

حالا یک کلاس دیگری برای برادکاست رسیور با نام CheckConnectionReciever.java ایجاد کرده و آن را به نوع BroadcastReceiver  گسترش می دهیم. در این کلاس مقدار boolean را از کلاس MyApplication دریافت می کنیم تا ببینیم آیا اکتیویتی قابل مشاهده است یا خیر و همچنین وضعیت شبکه را بررسی می کنیم اگر اکتیویتی دیگری نیز قابل مشاهده باشد هیچ کاری را انجام نمی دهد.

package examples.psrd.ir.myapplication;


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

public class CheckConnectionReciever extends BroadcastReceiver {
    public CheckConnectionReciever() {
    }

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

            boolean isVisible = MyApplication.isActivityVisible();
          
            if (isVisible == true) {
                ConnectivityManager connectivityManager = (ConnectivityManager) context
                        .getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo networkInfo = connectivityManager
                        .getActiveNetworkInfo();

            
                if (networkInfo != null && networkInfo.isConnected()) {

                    new MainActivity().CheckStatusConnection(true);
                } else {
                    new MainActivity().CheckStatusConnection(false);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

 

 

نهایتاً آنچه در  MainActivity.java  آورده می شود    ابتدا برنامه شروع به چک کردن وضعیت اتصال اینترنت می کند و وضعیت آن را در TextView نشان می دهد. این کار از طریق  متد  CheckStatusConnectionصورت می گیرد که به همین منظور نوشته شده است و برای تغییر وضعیت TextView با توجه به ارزش بولین دریافت شده نوع متن را تغییر می دهد.همچنین ما  با استخراج مقدار true  و false  بودن متغیر بولین در MyApplication متد ()onPause  و  ()onResume  اکتیویتی را تنظیم می کنیم.

package examples.psrd.ir.myapplication;

        import android.content.Context;
        import android.graphics.Color;
        import android.net.ConnectivityManager;
        import android.net.NetworkInfo;
        import android.os.Bundle;
        import android.support.v7.app.AppCompatActivity;
        import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private static TextView internetStatus;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        internetStatus = (TextView) findViewById(R.id.internet_status);

        
        ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) {
            CheckStatusConnection(true);
        } else {
            CheckStatusConnection(false);
        }

    }

 
    public void CheckStatusConnection(boolean isConnected) {

     
        if (isConnected) {
            internetStatus.setText("اینترنت در وضعیت اتصال");
            internetStatus.setTextColor(Color.parseColor("#00ff00"));
        } else {
            internetStatus.setText("اتصال اینترنتی وجود ندارد");
            internetStatus.setTextColor(Color.parseColor("#ff0000"));
        }
    }

    @Override
    protected void onPause() {

        super.onPause();
        MyApplication.activityPaused();
    }

    @Override
    protected void onResume() {

        super.onResume();
        MyApplication.activityResumed();
    }

}

حال پروژه را اجرا کرده و از آن در آموزش هر چه بیشتر خود استفاده کنید. اگر مشکلی در اجرای کدها وجود دارد یا سوال مشخصی از نویسنده سایت دارید سوالات خود را در قسمت دیدگاه ها بیان کنید.

کپی برداری از محتوای سایت psrd، ممنوع بوده و پیگرد قانونی دارد. (تنها استفاده شخصی کاربران ، مجاز است) (کپی برداری توسط سایر وب سایت ها  غیرقانونی بوده و در صورت رویت به ستادسازماندهی اطلاع داده خواهد شد.

موفق و پیروز باشید.

 


0 دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

-- بارگیری کد امنیتی --