کنترل و چک کردن اتصالات اینترنت و شبکه از طریق 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 دیدگاه