【发布时间】:2017-11-20 12:56:41
【问题描述】:
我在 Delphi Android 应用程序中编写了一个函数来确定是否启用了移动或 Wifi(或两者)。我使用了Checking internet connection in android using getActiveNetworkInfo 作为参考。
我一定是搞错了,因为该功能没有检测到 Wifi,即使在手机上启用了它!
function WhichNetwork: Integer; // 0 = none, 1 = wifi only, 2 = mobile only, 3 = both
var
obj: JObject;
cm: JConnectivityManager;
networks: TJavaObjectArray<JNetwork>;
i: Integer;
network: JNetworkInfo;
networktype: Integer;
networkname: String;
begin
Result := 0;
obj := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.CONNECTIVITY_SERVICE);
if Assigned(obj) then
begin
cm := TJConnectivityManager.Wrap((obj as ILocalObject).GetObjectID);
if Assigned(cm) then
begin
networks := cm.getAllNetworks;
if Assigned(networks) then
begin
for i := 0 to networks.Length - 1 do // this looks right!
begin
network := cm.getNetworkInfo(i);
networkname := JStringtoString(network.getTypeName); // for debug
networktype := network.gettype;
if networkType = TJConnectivityManager.JavaClass.TYPE_MOBILE then
begin
if network.isConnectedOrConnecting then
Result := Result + 2;
end
else if networkType = TJConnectivityManager.JavaClass.TYPE_WIFI then
begin
if network.isConnectedOrConnecting then
Result := Result + 1;
end;
end;
end;
end;
end;
end;
经过实验,我做了如下改动,果然奏效了!
for i := 0 to networks.Length do // now this works
但是,这不是 Delphi 通常的工作方式。有人可以解释为什么TJavaObjectArray 的Length 是从零开始的吗?
这是一个学术问题,我真的很想了解这一点。
【问题讨论】:
-
您链接的问题指出
getAllNetworkInfo已弃用,也许这是您的问题的一部分? -
我没有使用 getAllNetworkInfo!
-
哦,对不起。我在阅读您的代码时混淆了
getAllNetworks和getNetworkInfo。 -
getNetworkInfo (int networkType)也已被弃用。文档说明您应该改用getNetworkInfo (Network network)。所以我猜network := cm.getNetworkInfo(networks[I]);。如果你这样做了,通过一个看起来正确的循环,你会得到预期的结果吗? -
否,对阵列没有影响。您遍历
cm.getAllnetworks返回的数组,然后继续使用循环变量调用已弃用的函数 (cm.getNetworkInfo)。那时与阵列的连接在哪里?你甚至没有在你的循环中访问它。