با سلام به همه دوستان و همراهان Itpro.ir در این مطلب قصد دارم که کارکردن با شبکه بیسیم در دستگاه های اندرویدی را شرح بدهم. اندروید به کاربران این امکان را می دهد که به وضعیت ارتباطات Wifi به صورت سطح پایین دسترسی داشته باشند. برنامه ها تقریبا می توانند به همه اطلاعات ارتباطات بیسیم Wifi دسترسی داشته باشند. این اطلاعات شامل سرعت شبکه ایجاد شده، آدرس IP، وضعیت negotiation و بسیاری اطلاعات دیگر می باشد. اعمالی که برنامه ها می توانند روی ارتباطات wifi انجام دهند عبارت است از: اسکن، حذف، اضافه، اتصال و یا ارتباط Wifi. اندروید برای مدیریت ارتباطات wifi از یک API به نام WifiManager استفاده می کند. برای این که از این API یک نمونه بسازیم باید از متد getSystemService استفاده کنیم که کد آن به شکل زیر خواهد بود.
WifiManager mainWifiObj; mainWifiObj = (WifiManager) getSystemService(Context.WIFI_SERVICE);
برای این که لیستی از شبکه های بیسیم را پیدا کنید باید BroadcastReceiver خود را ثبت کنید. که این عمل ثبت کردن با استفاده از متد registerReceiver انجام می شود که به عنوان پارامتر ورودی شی receiver شما را دریافت می کند. سینتکس این کد به شکل زیر خواهد بود.
class WifiScanReceiver extends BroadcastReceiver { public void onReceive(Context c, Intent intent) { } } WifiScanReceiver wifiReciever = new WifiScanReceiver(); registerReceiver(wifiReciever, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
عمل اسکن کردن شبکه های بیسیم با استفاده از متد startScan شروع می شود. که در کلاس WifiManager وجود دارد. این متد لیستی از اشیا از کلاس ScanResult برای ما برمی گرداند. نحوه نوشتن کد اسکن به شکل زیر است.
List<ScanResult> wifiScanList = mainWifiObj.getScanResults(); String data = wifiScanList.get(0).toString();
علاوه بر عمل اسکن کردن شما می توانید کنترل بیشتری روی wifi داشته باشید. این کار را می توانید با استفاده از متدهای موجود در کلاس WifiManager انجام دهید. که چند تا از آن متدها را در زیر مشاهده می کنید.
در ادامه برنامه ای می نویسیم که با استفاده از توابع گفته شده بتواند لیست شبکه های wifi را به دست بیاورد و بتوان از داخل برنامه شبکه wifi را خاموش و یا روشن نمود. برای این کار یک پروژه جدید ایجاد می کنیم. دقت داشته باشید که کلیه کارها و اعمال گفته شده در این مطلب در محیط Android Studio انجام شده است. بعد از این که پروژه را ایجاد کردیم یک پروژه به نام MainActivity باید داشته باشیم. که به همان تناظر باید یک layout به نام activity_main.xml باید در برنامه داشته باشیم که به عنوان layout اصلی برنامه است. ما در layout برنامه یک textView برای نمایش داریم که در آن فقط کلمه Wifi را نوشته ایم. و یک checkBox داریم که برای خاموش و یا روشن کردن wifi استفاده می شود و همچنین یک لیست داریم که لیست شبکه های موجود را با جزئیات نمایش می دهد. که کد layout به شک زیر است:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:text="Wifi" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/textview" android:textSize="35sp" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" /> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/wifiChecker" android:text="EnableWifi" /> <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/listView" android:background="#fff5d376" android:layout_below="@+id/textview" android:layout_centerHorizontal="true" android:layout_marginTop="87dp"/> </RelativeLayout>
کد activity ما به شکل زیر خواهد بود که همه اعمال register و unregister را در آن نشان می دهد.
package tosinso.com.myapplication; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.wifi.ScanResult; import android.net.wifi.WifiManager; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ListView; import java.util.List; public class MainActivity extends ActionBarActivity { ListView lv; WifiManager wifi; String wifis[]; WifiScanReceiver wifiReciever; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.listView); wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); wifiReciever = new WifiScanReceiver(); wifi.startScan(); CheckBox wifiCheck = (CheckBox) findViewById(R.id.wifiChecker); wifiCheck.setChecked(wifi.isWifiEnabled()); wifiCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { wifi.setWifiEnabled(isChecked); } }); } @Override protected void onPause() { unregisterReceiver(wifiReciever); super.onPause(); } @Override protected void onPostResume() { registerReceiver(wifiReciever, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); super.onPostResume(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } private class WifiScanReceiver extends BroadcastReceiver { public void onReceive(Context c, Intent intent) { List<ScanResult> wifiScanList = wifi.getScanResults(); wifis = new String[wifiScanList.size()]; for (int i = 0; i < wifiScanList.size(); i++) { wifis[i] = ((wifiScanList.get(i)).toString()); } lv.setAdapter(new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, wifis)); } } }
برای این که بتوانیم به wifi در برنامه دسترسی داشته باشیم باید مجوز های آن را گرفته باشیم. که برای این کار ما از دو مجوز CHANGEWIFISTATE و ACCESSWIFISTATE استفاده می کنیم. به شکل کلی کد manifest به شکل زیر خواهد بود:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="tosinso.com.myapplication" > <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
دقت کنید که با اجرا کردن برنامه روشن یا خاموش بودن wifi بررسی شده و checkBox موجود طبق آن علامت دار یا بی علامت است. همچنین در لیست موجود نام و جزئیات شبکه های wifi موجود نشان داده می شود. Itpro باشید
نویسنده : مهدی عادلی فر
منبع :انجمن تخصصی فناوری اطلاعات ایران
هر گونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.
بنیانگذار توسینسو و برنامه نویس
مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.
زمان پاسخ گویی روز های شنبه الی چهارشنبه ساعت 9 الی 18
فقط به موضوعات مربوط به محصولات آموزشی و فروش پاسخ داده می شود