J'ai le code suivant qui fonctionnait bien avant Android 10. Mais il ne peut pas activer le wifi sur les appareils Android 10.
<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/> <uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/> <uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/> <uses-permission android:name=\"android.permission.INTERNET\"/> <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>
Voici mes autorisations dans AndroidManifest.xml
WifiManager wifiMgr = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); boolean res = wifiMgr.setWifiEnabled(true); //res value is set to false above because setWifiEnabled returns false on Android 10
Je demande même dynamiquement ces autorisations. Mais cela ne semble pas non plus aider.
Question:
Quelque chose a-t-il changé sur Android 10? Dois-je faire quelque chose de plus pour activer le wifi par programme à partir de mon application?
4 Réponses :
public boolean setWifiEnabled (boolean activé)
Cette méthode est obsolète au niveau de l'API 29. À partir de Build.VERSION_CODES # Q, les applications ne sont pas autorisées à activer / désactiver le Wi-Fi.
Note de compatibilité: pour les applications ciblant Build.VERSION_CODES.Q ou supérieur, cette API retournera toujours false et n'aura aucun effet.
Si les applications ciblent un SDK plus ancien (Build.VERSION_CODES.P ou inférieur), elles peuvent continuer à utiliser cette API.
Selon la documentation, les Apps
ne pourront plus activer Wi-Fi OFF/ON
partir de l' Android-10 API level 29
[ jusqu'à ce que Google propose une solution alternative ].
Pour plus d'informations, consultez la documentation officielle .
Et il y a un problème 128554616 a été créé dans google issuetracker
à ce sujet.
Merci beaucoup pour l'info. Pouvez-vous s'il vous plaît être assez aimable pour indiquer également l'API de remplacement qui devrait être utilisée pour activer le wifi?
Comment activer le wifi sur Android 10? Essayer de comprendre le document que vous avez indiqué. Ce serait génial si vous pouviez faire allusion à quelque chose dans votre réponse elle-même
J'ai posé une question de suivi sur stackoverflow.com/questions/58075918/… . Si vous souhaitez y répondre également.
N'est-il pas possible d'activer le wifi par programmation du tout sur Android 10+ (SDK 29)?
Bien expliqué
Comme nous sommes conscients que le suivi des problèmes de Google mentionné ci-dessus mentionne que nous n'avons pas d'API de remplacement pour le setWiFiEnabled obsolète, je suppose que nous devons rechercher des alternatives et j'utilise donc InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("svc wifi enable"));
ou InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("svc wifi disable"));
lors de l'exécution de tests pour activer le WiFi sur les appareils dotés de l'API 29 ou supérieure.
Comment l'utiliser? Lorsque j'utilise votre suggestion, cela ne fonctionne pas. Merci beaucoup.
Pour les tests d'espresso, j'utilise la méthode mentionnée ci-dessous. Une méthode est créée en tant que setWifiEnabled()
et ressemble à: setWifiEnabled () { try { //Attempting toggling WiFi using WiFiManager } catch() { //Re-attempting toggling WiFi using svc shell command as mentioned above } }
Cela aide ? Sinon, pouvez-vous fournir plus d'informations sur votre cas d'utilisation?
Ensuite, cela ne peut être utilisé que pour les tests? N'est-ce pas pour les utilisateurs finaux?
Oui, je ne recommanderai aucune de ces solutions de contournement pour l'implémentation de cela pour les utilisateurs finaux et nous pouvons simplement exprimer notre voix sur issuetracker.google.com/issues/128554616 pour informer Google que nous avons besoin de ces API / alternatives de basculement WiFi.
Vous pouvez toujours utiliser l'ancienne API sur des appareils plus anciens (voir: documentation officielle ), alors voici ce que je fais:
val wifiMgr = this.applicationContext.getSystemService(WIFI_SERVICE) as WifiManager val alertDial: AlertDialog.Builder = AlertDialog.Builder(this) // //=============== Start Wi-Fi if needed ==================== // Check Wi-Fi state: 1=disabled WIFI_STATE_DISABLED if (wifiMgr.wifiState == 1) { alertDial.setMessage(R.string.wifi) .setCancelable(false) .setPositiveButton(R.string.yes) { _, _ -> // Enable wifi if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { val panelIntent = Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY) startActivityForResult(panelIntent, 0) } else { wifiMgr.isWifiEnabled = true } } .setNegativeButton(R.string.no) { _, _ -> // Disable wifi if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { val panelIntent = Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY) startActivityForResult(panelIntent, 0) } else { wifiMgr.isWifiEnabled = false } } alertDial.show() } }
Le "wifiMgr.isWifiEnabled" est marqué comme obsolète, mais fonctionne toujours sur les appareils plus anciens.
Merci d'avoir pris soin d'y répondre avec une perspective différente
Je ne sais pas où est le problème, car Google y répond déjà:
Si les applications ciblent un SDK plus ancien (Build.VERSION_CODES.P ou inférieur), elles peuvent continuer à utiliser cette API.
Changez donc votre SDK cible sur 28 et cela fonctionne correctement sur Android Q.
Ou si vous avez besoin de changer l'état du WiFi par une seconde application comme Tasker ou Automate:
... wifi.setWifiEnabled(false); // true or false to activate/deactivate wifi ... Toast toast = Toast.makeText(getApplicationContext(), "WiFi off", ...
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.p1apps.wifion"> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <application android:allowBackup="true" ...
compileSdkVersion 30 buildToolsVersion "30.0.2" defaultConfig { applicationId "com.stackoverflow.example" minSdkVersion 28 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" }
Utilisez Android Studio pour l'installer sur votre téléphone.
Créez un nouveau projet comme dans 3. et nommez-le WiFiOff et répétez toutes les étapes avec les lignes modifiées dans MainActivity:
import androidx.appcompat.app.AppCompatActivity; import android.net.wifi.WifiManager; import android.content.Context; import android.os.Bundle; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Add WiFi On Part WifiManager wifi = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); wifi.setWifiEnabled(true); // true or false to activate/deactivate wifi // Add Toast if you want to Toast toast = Toast.makeText(getApplicationContext(), "WiFi on", Toast.LENGTH_SHORT); toast.show(); // Add Close Activity immediatelly finish(); } }