Le Tutoriel de Android Wifi Scanning
1. Android Wi-Fi
Sous Android, Wi-Fi est un protocole de réseau sans fil (Wireless Network Protocol), qui permet aux appareils de se connecter à Internet ou de connecter des appareils pour échanger des données.
Plus précisément, Android fournit Wi-Fi API, des applications qui peuvent utiliser cette API pour gérer tous les aspects liés à la connectivité Wifi, comme la recherche de réseaux Wifi actuels, l'ajout, Enregistrez, supprimez les connexions Wifi et gérez les données échangées entre les appareils.
En utilisant Wi-Fi API dans votre application, vous pouvez exécuter les fonctions suivantes:
- Scannez (scan) pour rechercher les réseaux Wifi disponibles dans une plage.
- Autorisez l'appareil à se connecter à Internet.
- Connectez-vous à d'autres appareils via Service Discovery (Explorez les services).
- Gérez la liste des réseaux configurés.
- Gérez plusieurs connexions.
À partir d'Android 10.0 (API Level 29), vous ne pouvez pas utiliser Wi-Fi API pour activer / désactiver (enable/disable) le Wifi du système, ce qui signifie que si vous souhaitez activer / désactiver le Wifi, vous devez utiliser la fonction disponibilité du système d'exploitation.
La politique de confidentialité relative à l'utilisation de Wi-Fi API pour activer / désactiver le Wifi a changé plusieurs fois sur différentes versions d'Android. Détail:
Android Level | Politique de confidentialité |
Level 1 ==> Level 22
(Android < 6.0) | android.permission.CHANGE_WIFI_STATE doit être ajouté à AndroidManifest.xml. |
Level 23 ==> Level 28
(Android 6.0 - 9.x) | Android.permission.CHANGE_WIFI_STATE doit être ajouté à AndroidManifest.xml, et votre application doit demander à l'utilisateur la permission d'activer / désactiver le Wifi du système. |
Level 29+
(Android 10.0+) | Interdisez l'utilisation de Wi-Fi API pour activer / désactiver le Wifi du système. |
* AndroidManifest.xml *
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
WifiManager wifiManager = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(true); // Enable Wifi
wifiManager.setWifiEnabled(false); // Disable Wifi
Dans Android 10+ (API Level 29+), la méthode setWifiEnabled(boolean) ne fonctionne plus.
Pour obtenir l'état de Wifi, vous devez ajouter android.permission.ACCESS_WIFI_STATE à AndroidManifest.xml:
* AndroidManifest.xml *
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
WifiManager wifiManager = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
int state = wifiManager.getWifiState();
String statusInfo = "Unknown";
switch (state) {
case WifiManager.WIFI_STATE_DISABLING:
statusInfo = "Disabling";
break;
case WifiManager.WIFI_STATE_DISABLED:
statusInfo = "Disabled";
break;
case WifiManager.WIFI_STATE_ENABLING:
statusInfo = "Enabling";
break;
case WifiManager.WIFI_STATE_ENABLED:
statusInfo = "Enabled";
break;
case WifiManager.WIFI_STATE_UNKNOWN:
statusInfo = "Unknown";
break;
default:
statusInfo = "Unknown";
break;
}
Scannez (scan) pour rechercher les réseaux actuels:
WifiManager wifiManager = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
// Get List of Available Wifi Networks
List<ScanResult> availNetworks = wifiManager.getScanResults();
if (availNetworks.size() > 0) {
// Get Each network detail
for (int i=0; i< availNetworks.size();i++) {
// ...
}
}
La politique de confidentialité actuelle pour scanner des réseaux actuels varie également d'une version Android à l'autre:
Android API Level | La politique de confidentialité |
Level 1 ==> Level 22
(Android < 6.0) | android.permission.ACCESS_COARSE_LOCATION doit être ajouté à AndroidManifest.xml. |
Level 23+
(Android 6.0+) | android.permission.ACCESS_COARSE_LOCATION doit être ajouté à AndroidManifest.xml,dans le même temps, votre application doit demander à l'utilisateur la permission de scanner (scan) les réseaux actuels. |
* AndroidManifest.xml *
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
- Le Tutoriel de Android Wifi Direct P2P
2. Example de WifiManager
Dans cet exemple, je vais vous guider pour utiliser WifiManager pour récupérer l'état de Wifi, scanner le réseau actuel, noter les détails de chaque réseau trouvé et vous connecter à un certain réseau dans la liste.
Exemple d'aperçu:
Sur Android Studio, créez un nouveau project:
- File > New > New Project > Empty Activity
- Name: WifiManagerExample
- Package name: org.o7planning.wifimanagerexample
- Language: Java
Ajoutez les autorisations (permission) à l'application:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.o7planning.wifimanagerexample">
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
L'interface de l'exemple d'application:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button_state"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:text="Show Wifi State"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button_scan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:text="Scan Wifi"
app:layout_constraintStart_toEndOf="@+id/button_state"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/editText_password"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:ems="10"
android:inputType="textPersonName"
android:text="12345678"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button_state" />
<ScrollView
android:id="@+id/scrollView"
android:layout_width="0dp"
android:layout_height="143dp"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:background="#F3F4EB"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editText_password">
<LinearLayout
android:id="@+id/linearLayout_scanResults"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5sp"
android:layout_marginTop="5sp"
android:layout_marginRight="5sp"
android:layout_marginBottom="5sp"
android:orientation="vertical" />
</ScrollView>
<TextView
android:id="@+id/textView_scanResults"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="16dp"
android:background="#F1F3E7"
android:inputType="textMultiLine"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/scrollView" />
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java
package org.o7planning.wifimanagerexample;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private static final String LOG_TAG = "AndroidExample";
private static final int MY_REQUEST_CODE = 123;
private WifiManager wifiManager;
private Button buttonState;
private Button buttonScan;
private EditText editTextPassword;
private LinearLayout linearLayoutScanResults;
private TextView textViewScanResults;
private WifiBroadcastReceiver wifiReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.wifiManager = (WifiManager) this.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
// Instantiate broadcast receiver
this.wifiReceiver = new WifiBroadcastReceiver();
// Register the receiver
registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
//
this.buttonState = (Button) this.findViewById(R.id.button_state);
this.buttonScan = (Button) this.findViewById(R.id.button_scan);
this.editTextPassword = (EditText) this.findViewById(R.id.editText_password);
this.textViewScanResults = (TextView) this.findViewById(R.id.textView_scanResults);
this.linearLayoutScanResults = (LinearLayout) this.findViewById(R.id.linearLayout_scanResults);
this.buttonState.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
showWifiState();
}
});
this.buttonScan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
askAndStartScanWifi();
}
});
}
private void askAndStartScanWifi() {
// With Android Level >= 23, you have to ask the user
// for permission to Call.
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { // 23
int permission1 = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION);
// Check for permissions
if (permission1 != PackageManager.PERMISSION_GRANTED) {
Log.d(LOG_TAG, "Requesting Permissions");
// Request permissions
ActivityCompat.requestPermissions(this,
new String[] {
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_WIFI_STATE,
Manifest.permission.ACCESS_NETWORK_STATE
}, MY_REQUEST_CODE);
return;
}
Log.d(LOG_TAG, "Permissions Already Granted");
}
this.doStartScanWifi();
}
private void doStartScanWifi() {
this.wifiManager.startScan();
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
Log.d(LOG_TAG, "onRequestPermissionsResult");
switch (requestCode) {
case MY_REQUEST_CODE: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted
Log.d(LOG_TAG, "Permission Granted: " + permissions[0]);
// Start Scan Wifi.
this.doStartScanWifi();
} else {
// Permission denied, boo! Disable the
// functionality that depends on this permission.
Log.d(LOG_TAG, "Permission Denied: " + permissions[0]);
}
break;
}
// Other 'case' lines to check for other
// permissions this app might request.
}
}
private void showWifiState() {
int state = this.wifiManager.getWifiState();
String statusInfo = "Unknown";
switch (state) {
case WifiManager.WIFI_STATE_DISABLING:
statusInfo = "Disabling";
break;
case WifiManager.WIFI_STATE_DISABLED:
statusInfo = "Disabled";
break;
case WifiManager.WIFI_STATE_ENABLING:
statusInfo = "Enabling";
break;
case WifiManager.WIFI_STATE_ENABLED:
statusInfo = "Enabled";
break;
case WifiManager.WIFI_STATE_UNKNOWN:
statusInfo = "Unknown";
break;
default:
statusInfo = "Unknown";
break;
}
Toast.makeText(this, "Wifi Status: " + statusInfo, Toast.LENGTH_LONG).show();
}
@Override
protected void onStop() {
this.unregisterReceiver(this.wifiReceiver);
super.onStop();
}
// Define class to listen to broadcasts
class WifiBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(LOG_TAG, "onReceive()");
Toast.makeText(MainActivity.this, "Scan Complete!", Toast.LENGTH_SHORT).show();
boolean ok = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false);
if (ok) {
Log.d(LOG_TAG, "Scan OK");
List<ScanResult> list = wifiManager.getScanResults();
MainActivity.this.showNetworks(list);
MainActivity.this.showNetworksDetails(list);
} else {
Log.d(LOG_TAG, "Scan not OK");
}
}
}
private void showNetworks(List<ScanResult> results) {
this.linearLayoutScanResults.removeAllViews();
for( final ScanResult result: results) {
final String networkCapabilities = result.capabilities;
final String networkSSID = result.SSID; // Network Name.
//
Button button = new Button(this );
button.setText(networkSSID + " ("+networkCapabilities+")");
this.linearLayoutScanResults.addView(button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String networkCapabilities = result.capabilities;
connectToNetwork(networkCapabilities, networkSSID);
}
});
}
}
private void showNetworksDetails(List<ScanResult> results) {
this.textViewScanResults.setText("");
StringBuilder sb = new StringBuilder();
sb.append("Result Count: " + results.size());
for(int i = 0; i < results.size(); i++ ) {
ScanResult result = results.get(i);
sb.append("\n\n --------- Network " + i + "/" + results.size() + " ---------");
sb.append("\n result.capabilities: " + result.capabilities);
sb.append("\n result.SSID: " + result.SSID); // Network Name.
sb.append("\n result.BSSID: " + result.BSSID);
sb.append("\n result.frequency: " + result.frequency);
sb.append("\n result.level: " + result.level);
sb.append("\n result.describeContents(): " + result.describeContents());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { // Level 17, Android 4.2
sb.append("\n result.timestamp: " + result.timestamp);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // Level 23, Android 6.0
sb.append("\n result.centerFreq0: " + result.centerFreq0);
sb.append("\n result.centerFreq1: " + result.centerFreq1);
sb.append("\n result.venueName: " + result.venueName);
sb.append("\n result.operatorFriendlyName: " + result.operatorFriendlyName);
sb.append("\n result.channelWidth: " + result.channelWidth);
sb.append("\n result.is80211mcResponder(): " + result.is80211mcResponder());
sb.append("\n result.isPasspointNetwork(): " + result.isPasspointNetwork() );
}
}
this.textViewScanResults.setText(sb.toString());
}
private void connectToNetwork(String networkCapabilities, String networkSSID) {
Toast.makeText(this, "Connecting to network: "+ networkSSID, Toast.LENGTH_SHORT).show();
String networkPass = this.editTextPassword.getText().toString();
//
WifiConfiguration wifiConfig = new WifiConfiguration();
wifiConfig.SSID = "\"" + networkSSID + "\"";
if(networkCapabilities.toUpperCase().contains("WEP")) { // WEP Network.
Toast.makeText(this, "WEP Network", Toast.LENGTH_SHORT).show();
wifiConfig.wepKeys[0] = "\"" + networkPass + "\"";
wifiConfig.wepTxKeyIndex = 0;
wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
} else if(networkCapabilities.toUpperCase().contains("WPA")) { // WPA Network
Toast.makeText(this, "WPA Network", Toast.LENGTH_SHORT).show();
wifiConfig.preSharedKey = "\""+ networkPass +"\"";
} else { // OPEN Network.
Toast.makeText(this, "OPEN Network", Toast.LENGTH_SHORT).show();
wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
}
this.wifiManager.addNetwork(wifiConfig);
List<WifiConfiguration> list = this.wifiManager.getConfiguredNetworks();
for( WifiConfiguration config : list ) {
if(config.SSID != null && config.SSID.equals("\"" + networkSSID + "\"")) {
this.wifiManager.disconnect();
this. wifiManager.enableNetwork(config.networkId, true);
this.wifiManager.reconnect();
break;
}
}
}
}
Tutoriels de programmation Android
- Configurer Android Emulator en Android Studio
- Le Tutoriel de Android ToggleButton
- Créer un File Finder Dialog simple dans Android
- Le Tutoriel de Android TimePickerDialog
- Le Tutoriel de Android DatePickerDialog
- De quoi avez-vous besoin pour démarrer avec Android?
- Installer Android Studio sur Windows
- Installer Intel® HAXM pour Android Studio
- Le Tutoriel de Android AsyncTask
- Le Tutoriel de Android AsyncTaskLoader
- Tutoriel Android pour débutant - Exemples de base
- Comment connaître le numéro de téléphone d'Android Emulator et le changer?
- Le Tutoriel de Android TextInputLayout
- Le Tutoriel de Android CardView
- Le Tutoriel de Android ViewPager2
- Obtenir un numéro de téléphone dans Android à l'aide de TelephonyManager
- Le Tutoriel de Android Phone Call
- Le Tutoriel de Android Wifi Scanning
- Le Tutoriel de programmation de jeux Android 2D pour débutant
- Le Tutoriel de Android DialogFragment
- Le Tutoriel de Android CharacterPickerDialog
- Le Tutoriel Android pour débutant - Hello Android
- Utiliser Android Device File Explorer
- Activer USB Debugging sur un appareil Android
- Le Tutoriel de Android UI Layouts
- Le Tutoriel de Android SMS
- Le Tutoriel de Android et SQLite Database
- Le Tutoriel de Google Maps Android API
- Le Tutoriel de texte pour parler dans Android
- Le Tutoriel de Android Space
- Le Tutoriel de Android Toast
- Créer un Android Toast personnalisé
- Le Tutoriel de Android SnackBar
- Le Tutoriel de Android TextView
- Le Tutoriel de Android TextClock
- Le Tutoriel de Android EditText
- Le Tutoriel de Android TextWatcher
- Formater le numéro de carte de crédit avec Android TextWatcher
- Le Tutoriel de Android Clipboard
- Créer un File Chooser simple dans Android
- Le Tutoriel de Android AutoCompleteTextView et MultiAutoCompleteTextView
- Le Tutoriel de Android ImageView
- Le Tutoriel de Android ImageSwitcher
- Le Tutoriel de Android ScrollView et HorizontalScrollView
- Le Tutoriel de Android WebView
- Le Tutoriel de Android SeekBar
- Le Tutoriel de Android Dialog
- Le Tutoriel de Android AlertDialog
- Tutoriel Android RatingBar
- Le Tutoriel de Android ProgressBar
- Le Tutoriel de Android Spinner
- Le Tutoriel de Android Button
- Le Tutoriel de Android Switch
- Le Tutoriel de Android ImageButton
- Le Tutoriel de Android FloatingActionButton
- Le Tutoriel de Android CheckBox
- Le Tutoriel de Android RadioGroup et RadioButton
- Le Tutoriel de Android Chip et ChipGroup
- Utilisation des Image assets et des Icon assets d'Android Studio
- Configuration de la Carte SD pour Android Emulator
- Exemple ChipGroup et Chip Entry
- Comment ajouter des bibliothèques externes à Android Project dans Android Studio?
- Comment désactiver les autorisations déjà accordées à l'application Android?
- Comment supprimer des applications de Android Emulator?
- Le Tutoriel de Android LinearLayout
- Le Tutoriel de Android TableLayout
- Le Tutoriel de Android FrameLayout
- Le Tutoriel de Android QuickContactBadge
- Le Tutoriel de Android StackView
- Le Tutoriel de Android Camera
- Le Tutoriel de Android MediaPlayer
- Le Tutoriel de Android VideoView
- Jouer des effets sonores dans Android avec SoundPool
- Le Tutoriel de Android Networking
- Analyser JSON dans Android
- Le Tutoriel de Android SharedPreferences
- Le Tutorial de stockage interne Android (Internal Storage)
- Le Tutoriel de Android External Storage
- Le Tutoriel de Android Intents
- Exemple d'une Android Intent explicite, appelant une autre Intent
- Exemple de Android Intent implicite, ouvrez une URL, envoyez un email
- Le Tutoriel de Android Service
- Le Tutoriel Android Notifications
- Le Tutoriel de Android DatePicker
- Le Tutoriel de Android TimePicker
- Le Tutoriel de Android Chronometer
- Le Tutoriel de Android OptionMenu
- Le Tutoriel de Android ContextMenu
- Le Tutoriel de Android PopupMenu
- Le Tutoriel de Android Fragment
- Le Tutoriel de Android ListView
- Android ListView avec Checkbox en utilisant ArrayAdapter
- Le Tutoriel de Android GridView
Show More