Anda dapat menggunakan kemampuan pemindaian Wi-Fi yang disediakan oleh WifiManager API untuk mendapatkan daftar titik akses Wi-Fi yang terlihat dari perangkat.
Proses pemindaian Wi-Fi
Ada tiga langkah untuk proses pemindaian:
Daftarkan pemroses siaran untuk
SCAN_RESULTS_AVAILABLE_ACTION, yang dikirim saat permintaan pemindaian selesai, yang memberikan status berhasil atau gagal. Untuk perangkat yang menjalankan Android (API level 29) dan yang lebih tinggi, siaran ini akan dikirim untuk pemindaian Wi-Fi penuh yang dilakukan pada perangkat oleh platform atau aplikasi lain. Aplikasi dapat secara pasif mendengarkan semua pemindaian pada perangkat menggunakan siaran tanpa mengeluarkan pemindaiannya sendiri.Minta pemindaian menggunakan
WifiManager.startScan(). Pastikan untuk memeriksa status yang ditampilkan metode, karena panggilan mungkin gagal karena salah satu alasan berikut:- Permintaan pemindaian mungkin dibatasi karena terlalu banyak pemindaian dalam waktu singkat.
- Perangkat menganggur dan pemindaian dinonaktifkan.
- Perangkat keras Wi-Fi melaporkan kegagalan pemindaian.
Dapatkan hasil pemindaian menggunakan
WifiManager.getScanResults(). Hasil pemindaian yang ditampilkan adalah hasil yang terakhir diperbarui, yang mungkin berasal dari pemindaian sebelumnya jika pemindaian Anda saat ini belum selesai atau berhasil. Artinya, Anda mungkin mendapatkan hasil pemindaian yang lebih lama jika memanggil metode ini sebelum menerima siaranSCAN_RESULTS_AVAILABLE_ACTIONyang berhasil.
Kode berikut memberikan contoh cara menerapkan langkah-langkah ini:
Kotlin
val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager
val wifiScanReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)
if (success) {
scanSuccess()
} else {
scanFailure()
}
}
}
val intentFilter = IntentFilter()
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
context.registerReceiver(wifiScanReceiver, intentFilter)
val success = wifiManager.startScan()
if (!success) {
// scan failure handling
scanFailure()
}
....
private fun scanSuccess() {
val results = wifiManager.scanResults
... use new scan results ...
}
private fun scanFailure() {
// handle failure: new scan did NOT succeed
// consider using old scan results: these are the OLD results!
val results = wifiManager.scanResults
... potentially use older scan results ...
}
Java
WifiManager wifiManager = (WifiManager)
context.getSystemService(Context.WIFI_SERVICE);
BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context c, Intent intent) {
boolean success = intent.getBooleanExtra(
WifiManager.EXTRA_RESULTS_UPDATED, false);
if (success) {
scanSuccess();
} else {
// scan failure handling
scanFailure();
}
}
};
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
context.registerReceiver(wifiScanReceiver, intentFilter);
boolean success = wifiManager.startScan();
if (!success) {
// scan failure handling
scanFailure();
}
....
private void scanSuccess() {
List<ScanResult> results = wifiManager.getScanResults();
... use new scan results ...
}
private void scanFailure() {
// handle failure: new scan did NOT succeed
// consider using old scan results: these are the OLD results!
List<ScanResult> results = wifiManager.getScanResults();
... potentially use older scan results ...
}
Batasan
Android 8.0 (API level 26) memperkenalkan batasan terkait izin dan frekuensi pemindaian Wi-Fi yang diizinkan.
Untuk menyempurnakan performa jaringan, keamanan, dan masa pakai baterai, Android 9 (level 28) memperketat persyaratan izin dan makin membatasi frekuensi pemindaian Wi-Fi.
Izin
Android 8.0 (level API 26) dan Android 8.1 (level API 27):
Panggilan yang berhasil ke WifiManager.getScanResults() memerlukan salah satu izin berikut:
Jika aplikasi panggilan tidak memiliki izin ini, panggilan gagal dengan SecurityException.
Atau, di perangkat yang menjalankan Android 8.0 (level API 26) dan yang lebih tinggi, Anda dapat menggunakan CompanionDeviceManager untuk melakukan pemindaian perangkat pendamping di sekitar atas nama aplikasi Anda tanpa memerlukan izin akses lokasi. Untuk mengetahui informasi selengkapnya tentang
opsi ini, lihat Penyambungan perangkat pendamping.
Android 9 (level API 28):
Panggilan yang berhasil ke WifiManager.startScan() mengharuskan semua kondisi berikut
terpenuhi:
- Aplikasi Anda memiliki izin
ACCESS_FINE_LOCATIONatauACCESS_COARSE_LOCATION. - Aplikasi Anda memiliki izin
CHANGE_WIFI_STATE. - Layanan lokasi diaktifkan pada perangkat (dalam Setelan > Lokasi).
Android 10 (level API 29) dan yang lebih tinggi:
Panggilan yang berhasil ke WifiManager.startScan() mengharuskan semua kondisi berikut
terpenuhi:
- Jika aplikasi Anda menargetkan SDK Android 10 (API level 29) atau yang lebih tinggi, aplikasi Anda memiliki izin
ACCESS_FINE_LOCATION. - Jika aplikasi Anda menargetkan SDK lebih rendah dari Android 10 (API level 29), aplikasi Anda memiliki izin
ACCESS_COARSE_LOCATIONatauACCESS_FINE_LOCATION. - Aplikasi Anda memiliki izin
CHANGE_WIFI_STATE. - Layanan lokasi diaktifkan pada perangkat (dalam Setelan > Lokasi).
Agar berhasil memanggil WifiManager.getScanResults(), pastikan semua kondisi berikut terpenuhi:
- Jika aplikasi Anda menargetkan SDK Android 10 (API level 29) atau yang lebih tinggi, aplikasi Anda memiliki izin
ACCESS_FINE_LOCATION. - Jika aplikasi Anda menargetkan SDK lebih rendah dari Android 10 (API level 29), aplikasi Anda memiliki izin
ACCESS_COARSE_LOCATIONatauACCESS_FINE_LOCATION. - Aplikasi Anda memiliki izin
ACCESS_WIFI_STATE. - Layanan lokasi diaktifkan pada perangkat (dalam Setelan > Lokasi).
Jika aplikasi panggilan tidak memenuhi semua persyaratan ini, panggilan akan gagal dengan
SecurityException.
Throttling
Batasan berikut berlaku untuk frekuensi pemindaian menggunakan WifiManager.startScan().
Android 8.0 dan Android 8.1:
Setiap aplikasi latar belakang dapat memindai satu kali dalam periode 30 menit.
Android 9:
Setiap aplikasi latar depan dapat memindai empat kali dalam periode 2 menit. Ini memungkinkan pemindaian dalam waktu singkat.
Semua aplikasi latar belakang yang digabungkan dapat memindai satu kali dalam periode 30 menit.
Android 10 dan yang lebih tinggi:
Berlaku batas throttling yang sama dari Android 9. Ada opsi developer baru untuk menonaktifkan throttling untuk pengujian lokal (di bagian Opsi Developer > Jaringan > Throttling pemindaian Wi-Fi).