Search code examples
androiddelphinetwork-programmingwifidelphi-xe5

Connecting to specific Wifi Network using Delphi XE5 for Android App Development


What I exactly need is to know if there is there is a way to connect to a specific Wifi Network from my Android App using Delphi XE5.

I have made some research in order to get an answer but haven´t found a clue on how to do it.

The closest question is here Create WifiConfiguration with Delphi XE5 for Android, but it is not the same question and it´s not answered though. The difference between my question and the one in the link, is that the one in the link refers to the general purpose Wifi Configuration, but my question is more specific. In fact, I would like to know if any of the procedures or functions mentioned on the question in the link can solve my question.

The question is: how can connect to a Wifi Network using a library, class or method within Delphi XE5 while developing an Android App.

I have not written my own code yet because there is no starting point that I have thought with what I have found until now.

Am I missing a good alternative on how to solve this problem?


Solution

  • You will need to use the JNI to call native Java (Android SDK) functions to connect to your network.

    This tutorial shows you how to JNI from Delphi.

    This SO question shows you how to programatically connect to a Wifi SSID from the Java side.

    Basically, you need to create a Java function that connects to your network:

    void connectToWifi()
    {
        String networkSSID = "test";
        String networkPass = "pass";
    
        WifiConfiguration conf = new WifiConfiguration();
        conf.SSID = "\"" + networkSSID + "\"";
    
        WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); 
        wifiManager.addNetwork(conf);
    
        List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
        for( WifiConfiguration i : list ) {
            if(i.SSID != null && i.SSID.equals("\"" + networkSSID + "\"")) {
                 wifiManager.disconnect();
                 wifiManager.enableNetwork(i.networkId, true);
                 wifiManager.reconnect();               
    
                 break;
            }           
        }
    }
    

    After that, call this function from the Delphi side by invoking the JNI (see the link above):

    try
    
      // Create the JVM (using a wrapper class)
    JavaVM := TJavaVM.Create;
    
      // Set the options for the VM
    Options[0].optionString := '-Djava.class.path=.';
    VM_args.version := JNI_VERSION_1_2;
    VM_args.options := @Options;
    VM_args.nOptions := 1;
    
      // Load the VM
    Errcode := JavaVM.LoadVM(VM_args);
    if Errcode < 0 then
    begin
      WriteLn(Format('Error loading JavaVM, error code = %d', [Errcode]));
      Exit;
    end;
    
      // Create a Java environment from the JVM's Env (another wrapper class)
    JNIEnv := TJNIEnv.Create(JavaVM.Env);
    
      // Find the class in the file system. This is why we added
      // the current directory to the Java classpath above.
    Cls := JNIEnv.FindClass('YOUR_CLASS');
    if Cls = nil then
    begin
      WriteLn('Can''t find class: YOUR_CLASS');
      Exit;
    end;
    
      // Find the static method 'connectToWifi' within the YOUR_CLASS class
    Mid := JNIEnv.GetStaticMethodID(Cls, 'connectToWifi', '()V');
    if Mid = nil then
    begin
      WriteLn('Can''t find method: connectToWifi');
      Exit;
    end;
    
      // Call the static method
    JNIEnv.CallStaticVoidMethod(Cls, Mid, []);
    
    except
      on E : Exception do
        WriteLn('Error: ' + E.Message);
    end;
    

    Hope I helped.