使用 Delphi XE5 连接到特定 Wifi 网络以进行 Android 应用程序开发

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

我真正需要的是知道是否可以使用 Delphi XE5 从我的 Android 应用程序连接到特定的 Wifi 网络。

我做了一些研究以获得答案,但还没有找到如何做的线索。

最接近的问题在这里 Create WifiConfiguration with Delphi XE5 for Android,但它不是同一个问题,虽然没有回答。我的问题与 link 中的问题的区别在于 link 中的问题是指通用 Wifi 配置,但我的问题更具体。其实我想知道link问题中提到的程序或函数是否可以解决我的问题。

问题是:如何在开发 Android 应用程序时使用库、class 或 Delphi XE5 中的方法连接到 Wifi 网络。

我还没有编写自己的代码,因为到目前为止我还没有想到我所找到的东西的起点。

我是否缺少解决此问题的好方法?

您将需要使用 JNI 调用本机 Java(Android SDK)函数来连接到您的网络。

This tutorial 向您展示如何从 Delphi.

使用 JNI

This SO question 向您展示了如何以编程方式从 Java 端连接到 Wifi SSID。

基本上,您需要创建一个连接到您的网络的 Java 函数:

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;
        }           
    }
}

之后,通过调用 JNI 从 Delphi 端调用此函数(参见上面的 link):

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;

希望我有所帮助。