برنامه نویسی اپلیکیشن اسکنر وای فای برای اندروید — از صفر تا صد
SDK اندروید قابلیتهای هیجانانگیزی برای توسعهدهندگان عرضه کرده است. API وایفای ارائه شده در این SDK واقعاً جذاب است. در این راهنما قصد داریم با بهرهگیری از اندروید استودیو یک اپلیکیشن اسکنر WiFi برای اندروید بنویسیم. بدین ترتیب با شیوه اسکن کردن شبکههای WiFi موجود روی گوشی یا تبلت اندرویدیتان آشنا میشوید.
توجه کنید که ما در این راهنما مجوزها را مدیریت نمیکنیم، زیرا تمرکزمان روی API وایفای است. اما برای این که اپلیکیشن اندروید بتواند روی فروشگاه گوگل پلی منتشر شود، باید Android SDK 27 را تارگت کنید و مجوزهای اندروید را نیز مدیریت نمایید.
افزودن مجوزها
نخستین گام افزودن مجوزهای صحیح در مانیفیست اپلیکیشن اندروید است. ما باید مجوز ACCESS_WIFI_STATE را اضافه کنیم. این مجوز امکان دسترسی به اطلاعاتی در مورد شبکههای وایفای را فراهم میکند.
فایل AndroidManifest.xml
1<?xml version="1.0" encoding="utf-8"?>
2<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="com.ssaurel.scanwifi">
4
5 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
6
7 <application
8 android:allowBackup="true"
9 android:icon="@mipmap/ic_launcher"
10 android:label="@string/app_name"
11 android:roundIcon="@mipmap/ic_launcher_round"
12 android:supportsRtl="true"
13 android:theme="@style/AppTheme">
14 <activity android:name=".WiFiScannerActivity">
15 <intent-filter>
16 <action android:name="android.intent.action.MAIN" />
17
18 <category android:name="android.intent.category.LAUNCHER" />
19 </intent-filter>
20 </activity>
21 </application>
22
23</manifest>
ایجاد رابط کاربری
گام بعدی ساختن رابط کاربری اپلیکیشن اسکنر WiFi است. این یک رابط کاربری ساده با یک ListView و یک Button است. در لیست مربوطه شبکههای وایفای تشخیص داده شده از سوی گوشی هوشمند یا تبلت را نمایش میدهیم. دکمه نیز به کاربر امکان شروع فرایند اسکن کردن وایفای را میدهد.
فایل activity_main.xml
1<?xml version="1.0" encoding="utf-8"?>
2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:orientation="vertical"
4 android:padding="10dp"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent">
7
8 <ListView
9 android:id="@+id/wifiList"
10 android:layout_width="match_parent"
11 android:layout_height="312dp"
12 android:layout_weight="0.97"/>
13
14 <Button
15 android:id="@+id/scanBtn"
16 android:layout_width="match_parent"
17 android:layout_height="50dp"
18 android:layout_gravity="bottom"
19 android:layout_margin="15dp"
20 android:background="@android:color/holo_red_light"
21 android:text="Scan WiFi"/>
22
23</LinearLayout>
نوشتن کد جاوا
اینک زمان آن رسیده است که کد جاوا را درون اکتیویتی اصلی بنویسیم. در SDK اندروید، API وایفای از طریق یک سرویس سیستمی به نام WifiManager در دسترس ما قرار دارد. زمانی که وهلهای از سرویس WifiManager به دست بیاوریم، باید بررسی کنیم که آیا وایفای دستگاه فعال شده است یا نه. اگر چنین نباشد آن را با فراخوانی متد setWifiEnabled و پارامتر true فعال میکنیم:
فایل enable_wifi.java
1if (!wifiManager.isWifiEnabled()) {
2 Toast.makeText(this, "WiFi is disabled ... We need to enable it", Toast.LENGTH_LONG).show();
3 wifiManager.setWifiEnabled(true);
4}
سپس میتوانیم شروع به اسکن کردن شبکههای وایفای پیرامونی بکنیم. به این منظور باید از BroadcastReceiver که با اینتنت زیر ثبت شده است بهره بگیریم:
WifiManager.SCAN_RESULTS_AVAILABLE_ACTION
زمانی که BroadcastReceiver ثبت شد، میتوانیم شروع به اسکن کردن شبکههای وایفای با فراخوانی متد startScan در سرویس WifiManager بکنیم.
فایل ScanWifi.java
1private void scanWifi() {
2 arrayList.clear();
3 registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
4 wifiManager.startScan();
5 Toast.makeText(this, "Scanning WiFi ...", Toast.LENGTH_SHORT).show();
6}
زمانی که اسکن کردن پایان یافت، متد onReceive پیادهسازی BroadcastReceiver ما فراخوانی میشود. باید متد getScanResults سرویس WifiManager را فراخوانی کنیم تا نتایج را به دست آوریم. همچنین فراموش نکنید که BroadcastReceiver را از حالت ثبت خارج کنید تا باتری دستگاه به هدر نرود.
آخرین گام تعریف حلقهای برای تکرار روی لیست نتایج به وسیله متد getScanResults است:
فایل BroadcastReceiver.java
1BroadcastReceiver wifiReceiver = new BroadcastReceiver() {
2 @Override
3 public void onReceive(Context context, Intent intent) {
4 results = wifiManager.getScanResults();
5 unregisterReceiver(this);
6
7 for (ScanResult scanResult : results) {
8 arrayList.add(scanResult.SSID + " - " + scanResult.capabilities);
9 adapter.notifyDataSetChanged();
10 }
11 };
12}
بدین ترتیب کد فایل اکتیوتی اصلی به صورت زیر درمیآید:
1package com.ssaurel.scanwifi;
2
3import android.content.BroadcastReceiver;
4import android.content.Context;
5import android.content.Intent;
6import android.content.IntentFilter;
7import android.net.wifi.ScanResult;
8import android.net.wifi.WifiManager;
9import android.os.Bundle;
10import android.support.v7.app.AppCompatActivity;
11import android.view.View;
12import android.widget.ArrayAdapter;
13import android.widget.Button;
14import android.widget.ListView;
15import android.widget.Toast;
16
17import java.util.ArrayList;
18import java.util.List;
19
20public class WiFiScannerActivity extends AppCompatActivity{
21
22 private WifiManager wifiManager;
23 private ListView listView;
24 private Button buttonScan;
25 private int size = 0;
26 private List<ScanResult> results;
27 private ArrayList<String> arrayList = new ArrayList<>();
28 private ArrayAdapter adapter;
29
30 @Override
31 public void onCreate(Bundle savedInstanceState) {
32 super.onCreate(savedInstanceState);
33 setContentView(R.layout.activity_main);
34 buttonScan = findViewById(R.id.scanBtn);
35 buttonScan.setOnClickListener(new View.OnClickListener() {
36 @Override
37 public void onClick(View view) {
38 scanWifi();
39 }
40 });
41
42 listView = findViewById(R.id.wifiList);
43 wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
44
45 if (!wifiManager.isWifiEnabled()) {
46 Toast.makeText(this, "WiFi is disabled ... We need to enable it", Toast.LENGTH_LONG).show();
47 wifiManager.setWifiEnabled(true);
48 }
49
50 adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, arrayList);
51 listView.setAdapter(adapter);
52 scanWifi();
53 }
54
55 private void scanWifi() {
56 arrayList.clear();
57 registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
58 wifiManager.startScan();
59 Toast.makeText(this, "Scanning WiFi ...", Toast.LENGTH_SHORT).show();
60 }
61
62 BroadcastReceiver wifiReceiver = new BroadcastReceiver() {
63 @Override
64 public void onReceive(Context context, Intent intent) {
65 results = wifiManager.getScanResults();
66 unregisterReceiver(this);
67
68 for (ScanResult scanResult : results) {
69 arrayList.add(scanResult.SSID + " - " + scanResult.capabilities);
70 adapter.notifyDataSetChanged();
71 }
72 };
73 }
74}
استفاده عملی از اپلیکیشن اسکنر وای فای
اکنون میتوانیم اپلیکیشن اسکنر وای فای خود را تست کنیم.
با اجرا کردن آن روی دستگاه با نتیجه زیر مواجه میشویم:
به این ترتیب به پایان این راهنما میرسیم. هر گونه دیدگاه یا پیشنهاد خود را میتوانید در بخش نظرات این نوشته با ما و دیگر خوانندگان مجله فرادرس در میان بگذارید.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای پروژهمحور برنامهنویسی اندروید
- مجموعه آموزشهای برنامهنویسی
- گنجینه برنامه نویسی اندروید (Android)
- ساخت اپلیکیشن لانچر اندروید — به زبان ساده
- اپلیکیشن آنی اندروید (Android Instant App) چیست؟ — از صفر تا صد
==