2
votes

Android Wifi DPP (connexion Wi-Fi facile)

Étant donné qu'Android 10+ ne vous permet plus de vous connecter aux réseaux wifi par programmation (vous ne pouvez que suggérer / ajouter des réseaux à la liste, mais ils risquent de ne jamais se connecter si vous avez une connexion wifi existante), j'aimerais utiliser WiFi Easy Connect ( https://source.android.com/devices/tech/connect/wifi-easy-connect) Je suppose que c'est essentiellement ce qu'est l'option d'analyse de code qr, accessible à partir des paramètres wifi.

La documentation indique que vous devez vérifier si elle est prise en charge:

 <activity
    android:name=".wifi.dpp.WifiDppConfiguratorActivity">
    <intent-filter>
        <action android:name="android.settings.WIFI_DPP_CONFIGURATOR_QR_CODE_SCANNER"/>
        <action android:name="android.settings.WIFI_DPP_CONFIGURATOR_QR_CODE_GENERATOR"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
    <intent-filter>
        <action android:name="android.settings.PROCESS_WIFI_EASY_CONNECT_URI"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="DPP"/>
    </intent-filter>
</activity>

<activity
    android:name=".wifi.dpp.WifiDppEnrolleeActivity">
    <intent-filter>
        <action android:name="android.settings.WIFI_DPP_ENROLLEE_QR_CODE_SCANNER"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

Ce que j'ai fait comme:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: xxx, PID: 8498
    android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.settings.PROCESS_WIFI_EASY_CONNECT_URI }

Cependant, cela se bloque car l'activité n'est pas trouvée (j'ai testé sur un Pixel 4XL et un émulateur exécutant tous deux R):

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
    {
        val wifiManager = getSystemService(Context.WIFI_SERVICE) as WifiManager
        if (wifiManager.isEasyConnectSupported)
        {
            startActivityForResult(Intent(android.provider.Settings.ACTION_PROCESS_WIFI_EASY_CONNECT_URI), 1237)
        }
    }

Est-ce possible d'être utilisé par des applications? Existe-t-il un autre moyen de se connecter de manière fiable à un réseau wifi? Est-ce la bonne approche? ou existe-t-il un moyen de lancer directement l'écran de réglage?

Je les ai trouvés dans un manifeste Android mais je ne trouve pas de moyen de les lancer:

Public APIs are available in Android 10 for use by apps:

    WifiManager#isEasyConnectSupported: Queries the framework to determine whether the device supports Wi-Fi Easy Connect.
    Activity#startActivityForResult(ACTION_PROCESS_WIFI_EASY_CONNECT_URI): Allows apps to integrate Wi-Fi Easy Connect into their onboarding/setup flow.


0 commentaires

3 Réponses :


0
votes

Il semble que vous manquiez la chaîne URI DPP, qui devrait être définie dans la documentation

Voici à quoi cela devrait ressembler:

// Valid Wi-Fi DPP QR code & it's parameters
private static final String VALID_WIFI_DPP_QR_CODE = "DPP:I:SN=4774LH2b4044;M:010203040506;K:"
        + "MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgADURzxmttZoIRIPWGoQMV00XHWCAQIhXruVWOz0NjlkIA=;;";

Je l'ai pris ici

Vous pouvez consulter les spécifications du protocole pour créer votre propre URI DPP.

J'espère que cela vous aidera à poursuivre l'enquête. Je suis toujours dans ce problème. Alors, s'il vous plaît, partagez les mises à jour.


0 commentaires

0
votes

Il semble que les Uri DPP ne soient pris en charge que lors du lancement de cette activité. Ces Uri DPP qui sont envoyés sont uniquement pour le bootstrap, pas pour échanger des informations sur l'authentification pour le réseau WiFi.

Pour se connecter aux réseaux WiFi sur Android 10, Google recommande leur méthode ConnectivityManager.requestNetwork . D'après mon expérience, cela se connecte au WiFi. Cependant, il le fait sans connexion Internet. Voir: https://developer.android.com/guide/topics/connectivity/wifi-bootstrap

Il y a aussi le WifiNetworkSuggestion, qui affiche une notification et suggère uniquement à un utilisateur de se connecter au WiFi, ce qui peut être un peu caché, surtout si votre application fonctionne en mode immersif. Voir: https://developer.android.com/guide/topics/connectivity/wifi-suggest

Android 11 (API 30) vous permettra d'ajouter WifiNetworkSuggestions à l'aide de l'intention android.provider.Settings.ACTION_WIFI_ADD_NETWORKS . Ce qui est similaire à l'ancienne API WifiManager.addNetwork . Voir: https://developer.android.com/guide/topics/connectivity/wifi-save-network-passpoint-config pour plus d'informations.

Pour l'instant, la meilleure option pour Android 10 semble demander à l'utilisateur de se connecter manuellement via les paramètres WiFi, soit en scannant un code QR, soit en entrant les détails WiFi. Ou en utilisant l'API WifiNetworkSuggestion .


0 commentaires

1
votes

Si vous souhaitez vous connecter au Wifi à l'aide du scanner de code QR, le code suivant fonctionnera correctement

J'ai trouvé le code suivant dans packages / apps / Settings / AndroidManifest.xml:

        <activity
            android:name=".wifi.dpp.WifiDppEnrolleeActivity">
            <intent-filter>
                <action android:name="android.settings.WIFI_DPP_ENROLLEE_QR_CODE_SCANNER"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
@RequiresApi(api = Build.VERSION_CODES.Q)
private void startWifiQRCodeScanner(Context context)
{
    final String INTENT_ACTION_WIFI_QR_SCANNER = "android.settings.WIFI_DPP_ENROLLEE_QR_CODE_SCANNER"; 
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

    if(wifiManager.isEasyConnectSupported())
    {
        final Intent intent = new Intent(INTENT_ACTION_WIFI_QR_SCANNER);
        startActivityForResult(intent, 5000);
    }
}


0 commentaires