【问题标题】:Connecting to specific Wifi Network using Delphi XE5 for Android App Development使用 Delphi XE5 连接到特定的 Wifi 网络以进行 Android 应用程序开发
【发布时间】:2015-05-08 20:13:08
【问题描述】:

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

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

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

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

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

我是否错过了解决此问题的好方法?

【问题讨论】:

  • 请澄清您的具体问题或添加其他详细信息以准确突出您的需要。正如目前所写的那样,很难准确地说出你在问什么。请参阅How to Ask 页面以获得澄清此问题的帮助。
  • 我已经编辑了,现在我认为我需要什么很清楚了。谢谢达莉娅。
  • 好的,现在我已经再次编辑了。如果您认为问题已经很清楚,请告诉我。
  • 嗨,Laureano,您先看一下android SDK 吗? developer.android.com/reference/android/net/wifi/… 您可以使用 wifimanager 类来使用它,因为它提供了 enableNetwork 方法,您可以指示它是否会禁用其他网络并连接到您想要的网络 ID。断开连接,等等。看看吧。
  • 非常感谢迭戈。我假设这意味着使用 JNI 将 Java 类实现到 Delphi XE5

标签: android delphi networking wifi delphi-xe5


【解决方案1】:

您需要使用 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 端调用此函数(参见上面的链接):

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;

希望我能帮上忙。

【讨论】:

  • 太好了,这个答案不仅对特定问题有很大帮助,而且对于使用 JNI 的一般目的也有很大帮助。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2020-12-26
  • 2016-05-02
  • 1970-01-01
  • 2019-02-07
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多