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?
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.