4
votes

L'activation du wifi à l'aide de WifiManager cesse de fonctionner sur Android 10

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?


0 commentaires

4 Réponses :


4
votes

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.


5 commentaires

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é



1
votes

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.


4 commentaires

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.



3
votes

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.


1 commentaires

Merci d'avoir pris soin d'y répondre avec une perspective différente



0
votes

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:

  1. Installez Android Studio
  2. Créer un nouveau projet namend WiFiOn avec activité vide et SDK 28
  3. Ajouter des lignes commentées:
...
        wifi.setWifiEnabled(false); // true or false to activate/deactivate wifi
...
        Toast toast = Toast.makeText(getApplicationContext(), "WiFi off",  
...
  1. Modifiez minSdkVersion et targetSdkVersion en 28 dans build.grade (: app)
<?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"
...
  1. Ajouter une autorisation à AndroidMAnifest.xml
    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"
    }
  1. Utilisez Android Studio pour l'installer sur votre téléphone.

  2. 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();

    }
}


0 commentaires