Перейти к содержанию
Fire Monkey от А до Я
  • 0

Android: сканирование и подключение к WiFi


UFO 007

Вопрос

Доброго всем времени суток.

Перевожу на Pascal такое:

 WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();
    builder.setSsid("wifi-ap-ssid");
    builder.setWpa2Passphrase("wifi-ap-password");

    WifiNetworkSpecifier wifiNetworkSpecifier = builder.build();

    NetworkRequest.Builder networkRequestBuilder1 = new NetworkRequest.Builder();
    networkRequestBuilder1.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
    networkRequestBuilder1.setNetworkSpecifier(wifiNetworkSpecifier);

    NetworkRequest nr = networkRequestBuilder1.build();
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    cm.requestNetwork(nr, callback);

И уже вродь-как начало сростаться, но упёрся вот в какую штуку:

TRANSPORT_WIFI.thumb.jpg.52a2584e814746bffd0fcb401cc6775a.jpg

в выпадающем списке доступных методов и свойств напрочь отсутствуют след. св-ва: TRANSPORT_BLUETOOTH, TRANSPORT_CELLULAR, TRANSPORT_ETHERNET, TRANSPORT_VPN, TRANSPORT_WIFI и TRANSPORT_WIFI_AWARE... Но если суслика не видно, то он - есть:

  JNetworkCapabilitiesClass = interface(JObjectClass)
    ['{E908BEFD-1FFE-4DBA-B9F3-48CE1E205BDE}']
    {class} function _GetCREATOR: JParcelable_Creator; cdecl;
	....
    {class} function _GetTRANSPORT_BLUETOOTH: Integer; cdecl;
    {class} function _GetTRANSPORT_CELLULAR: Integer; cdecl;
    {class} function _GetTRANSPORT_ETHERNET: Integer; cdecl;
    {class} function _GetTRANSPORT_VPN: Integer; cdecl;
    {class} function _GetTRANSPORT_WIFI: Integer; cdecl;
    {class} function _GetTRANSPORT_WIFI_AWARE: Integer; cdecl;
	....
    {class} property TRANSPORT_BLUETOOTH: Integer read _GetTRANSPORT_BLUETOOTH;
    {class} property TRANSPORT_CELLULAR: Integer read _GetTRANSPORT_CELLULAR;
    {class} property TRANSPORT_ETHERNET: Integer read _GetTRANSPORT_ETHERNET;
    {class} property TRANSPORT_VPN: Integer read _GetTRANSPORT_VPN;
    {class} property TRANSPORT_WIFI: Integer read _GetTRANSPORT_WIFI;
    {class} property TRANSPORT_WIFI_AWARE: Integer read _GetTRANSPORT_WIFI_AWARE;
  end;

  [JavaSignature('android/net/NetworkCapabilities')]
  JNetworkCapabilities = interface(JObject)
    ['{E9EBA97B-F82A-41BA-8170-537E131E0533}']
    function describeContents: Integer; cdecl;
    function equals(obj: JObject): Boolean; cdecl;
    function getLinkDownstreamBandwidthKbps: Integer; cdecl;
    function getLinkUpstreamBandwidthKbps: Integer; cdecl;
    function hasCapability(capability: Integer): Boolean; cdecl;
    function hasTransport(transportType: Integer): Boolean; cdecl;
    function hashCode: Integer; cdecl;
    function toString: JString; cdecl;
    procedure writeToParcel(dest: JParcel; flags: Integer); cdecl;
  end;
      
  TJNetworkCapabilities = class(TJavaGenericImport<JNetworkCapabilitiesClass, JNetworkCapabilities>) end;
 

вместе с троеточиями = 70 строк и всё это в файле Androidapi.JNI.Net.pas. На картинке мы видим то, чем богат интерфейс JObject-а JNetworkCapabilities, а вот как (объясните, пожалуйста, чайнику) вытащить свойства из интерфейса JNetworkCapabilitiesClass?

З.Ы. И на закуску (мож не по теме) - чем отличается конструкция:

      NetworkSpecifierObj:= TAndroidHelper.Context.getSystemService(TJContext.JavaClass.CONNECTIVITY_SERVICE);
      NetworkSpecifier:= TJNetworkSpecifier.Wrap((NetworkSpecifierObj as ILocalObject).GetObjectID);

от

      NetworkSpecifier:= TJNetworkSpecifier.Create;

Заранее благодарен.

З.Ы. З.Ы. Среда - Delphi 10.4.2

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
 WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();
    builder.setSsid("wifi-ap-ssid");
    builder.setWpa2Passphrase("wifi-ap-password");

Вот это добавлено только для API 29 и выше

 NetworkSpecifierObj:= TAndroidHelper.Context.getSystemService(TJContext.JavaClass.CONNECTIVITY_SERVICE);
      NetworkSpecifier:= TJNetworkSpecifier.Wrap((NetworkSpecifierObj as ILocalObject).GetObjectID);

Чушь полная, вы запрашиваете сервис соединений ConnectivityManager, а NetworkSpecifier это абстрактный класс он не создается вообще его получают от другого API. WifiNetworkSpecifier и NetworkSpecifier это разные вещи, вам нужен именно WifiNetworkSpecifier.

     

 

  var
  ConnectivityManagerNative: JObject;
  ConnectivityManager: JConnectivityManager;
  NetworkRequest_Builder: JNetworkRequest_Builder;
  NetworkRequest: JNetworkRequest;
  WifiNetworkSpecifier: JWifiNetworkSpecifier;
  WifiNetworkSpecifier_Builder: JWifiNetworkSpecifier_Builder;

  begin

  WifiNetworkSpecifie_Builder:= TJWifiNetworkSpecifier.JavaClass.init;
  WifiNetworkSpecifie_Builder.setSsid("wifi-ap-ssid");
  WifiNetworkSpecifie_Builder.setWpa2Passphrase("wifi-ap-password");
  WifiNetworkSpecifier := WifiNetworkSpecifie_Builder.build;

  NetworkRequest_Builder := TJNetworkRequest_Builder.JavaClass.init;
  NetworkRequest_Builder.addTransportType(TJNetworkCapabilities.JavaClass.TRANSPORT_WIFI);
  NetworkRequest_Builder.setNetworkSpecifier(wifiNetworkSpecifier);
  NetworkRequest := NetworkRequest_Builder.build;

  ConnectivityManagerNative := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.CONNECTIVITY_SERVICE);
  connectivityManager := TJConnectivityManager.Wrap((ConnectivityManagerNative as ILocalObject).GetObjectID);
  connectivityManager.requestNetwork(NetworkRequest, callback);

 

Ссылка на комментарий
  • 0

Спасибо Огромное!!!

Ну, допустим, Manager у меня "завёрнут" более-или-менее симпотЯШно:

function GetConnectivityManager: JConnectivityManager;
var
  ConnectivityServiceNative: JObject;
begin                           
  ConnectivityServiceNative := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.CONNECTIVITY_SERVICE);
  if not Assigned(ConnectivityServiceNative) then
    raise Exception.Create('Could not locate Connectivity Service');
  Result := TJConnectivityManager.Wrap((ConnectivityServiceNative as ILocalObject).GetObjectID);
  if not Assigned(Result) then
    raise Exception.Create('Could not access Connectivity Manager');
end;

а за остальное - нижайший поклон. А по поводу

1 час назад, OnePeople сказал:

Чушь полная ....

как раз и хотел бы разобраться (т. е. понять для себя) - какая разница между .Create, и .Wrap (где можно/НЕможно-нужно/НЕнужно применять или в такой-то ситуации необходимо .Create, а в такой-то только .Wrap) а из Ваших подсказок вытекает, что ещё и .Init существует... Я к тому, что в VCL ничего кроме Create не существовало, а в fmx - в какой ситуации и кого из этой троицы задействовать?

 

Спасибо.

Ссылка на комментарий
  • 0

Здесь все зависит от того, как сделано в android. Следовательно вам всегда в первую очередь нужно смотреть справку developer.android.com.

Все что ниже это то как делаю я, не истина, так как мне для хобби достаточно. На примере 

 

1. JConnectivityManager. 

Захожу в справку, ищу JConnectivityManager, открываю пример работы с API.

Вижу код:

 

ConnectivityManager cm =
        (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

Начинаю переписывать на Delphi (паскале, не считаю) и вижу что getSystemService возвращает JObject. Если мы получаем не определенный объект то нам нужно сопоставить его с определенным классом, так сказать объект обернуть в класс 

НАШКЛАСС.ОБЕРНУТЬ(ИД_ОБЪЕКТА)

TJConnectivityManager.Wrap((ConnectivityServiceNative as ILocalObject).GetObjectID);

Если же объект создается методом new, тогда мы можем просто использовать init, create. (В чем разница я не знаю

            AudioFocusRequest:=TJAudioFocusRequest_Builder.JavaClass.init(TJAudioManager.JavaClass.AUDIOFOCUS_GAIN);

            AudioFocusRequest:=TJAudioFocusRequest_Builder(TJAudioManager.JavaClass.AUDIOFOCUS_GAIN).Create;

Я пользуюсь обоими видами конструкцию, но предпочитаю init

)

 

2.Захожу в справку, ищу JWifiNetworkSpecifier, вижу

Apps should use the WifiNetworkSpecifier.Builder class to create an instance.

Соответственно Network specifier object создается строителем, перехожу дальше в WifiNetworkSpecifier.Builder, смотрю там и так далее.

 

Есть всякие костыли и идеи людей решающие многие проблемы, но я вам так скажу у вас не будет проблем если вы будете делать так как вам советует гугл, а если и будут, то на китайских устройствах где по какой то причине китайцы просто что то сломали в системе и заменили это своим хламом не отвечающим требованиям гугл(Обычно телефон и BT). Единственная помарка, в Delphi бывает отсутствует все API, и некоторые вещи, вообще не реализованы, но их очень мало и они очень специфические.

 

.

 

Ссылка на комментарий
  • 0
3 часа назад, OnePeople сказал:

некоторые вещи, вообще не реализованы

TJWifiNetworkSpecifier и его Буилдер: 

[DCC Error] wifi_sdk.pas(81): E2003 Undeclared identifier: 'JWifiNetworkSpecifier_Builder' как быть? в файле Androidapi.JNI.Net.pas. прописал

  JWiFiNetworkSpecifierClass = interface(JObjectClass)
    ['{09C5C88A-A950-4C2F-B0F0-E03989C16220}']
  end;

  [JavaSignature('android/net/WiFiNetworkSpecifier')]
  JWiFiNetworkSpecifier = interface(JObject)
   ['{04D0A623-E880-404E-8E1D-8CC4DDB8DCAF}']
  end;
  TJWiFiNetworkSpecifier = class(TJavaGenericImport<JWiFiNetworkSpecifierClass, JWiFiNetworkSpecifier>) end;

и всёрно Е2003...:( :( 

Ссылка на комментарий
  • 0
22 часа назад, OnePeople сказал:

НАШКЛАСС.ОБЕРНУТЬ(ИД_ОБЪЕКТА)

Если я правильно усёк, то это там, где 

context.getSystemService

а там, где ... = New ... => по-нашему будет .Create. А по поводу 

 

22 часа назад, OnePeople сказал:

некоторые вещи, вообще не реализованы,

это - к Ярославу Бровину (если не изменяет память) или (точнее) к его конторе (Ембаркадеро)... Ну, или кто поумнее(пограмотней) моего подскажет где (в каком файле) и что нужно прописать чтобы к нативному (явовскому) JWifiNetworkSpecifier-у приинтерфейситься правильно...

Ссылка на комментарий
  • 0

https://delphifmandroid.blogspot.com/2014/07/java.html

здесь все написанно в конце статьи пример, написал бы вам pas, да компьютера под рукой нет;)

Изменено пользователем OnePeople
Ссылка на комментарий
  • 0

И иСЧё раз огромнейшее СПАСИБО!!! И, пардон, но Ефимовский Androidapi.JNI.net.wifi.pas прикручен был ещё к Dxe8 (где я успешно написал и откатал прогу, но... для API 23 а проблемы "несостыковки" начались с появлением у мя Honor 8A [API 28] и RedMI 9T[API 29]) а вот то, что в нём может оказаться искомый специфер - ет протормозил (ещё раз Мерси).  Ну и само-собой:

if TJBuild_VERSION.JavaClass.SDK_INT < 29 then
	WiFiManger
else
	Specifiers

 

Ссылка на комментарий
  • 0

[DCC Error] wifi_sdk.pas(167): E2250 There is no overloaded version of 'setNetworkSpecifier' that can be called with these arguments

В Androidapi.JNI.Net прописано:

  [JavaSignature('android/net/NetworkRequest$Builder')]
  JNetworkRequest_Builder = interface(JObject)
    ['{AA7B1C54-8947-4A75-AEAB-8983141D28A7}']
    function addCapability(capability: Integer): JNetworkRequest_Builder; cdecl;
...
    function setNetworkSpecifier(networkSpecifier: JString): JNetworkRequest_Builder; cdecl; overload;
    function setNetworkSpecifier(networkSpecifier: JNetworkSpecifier): JNetworkRequest_Builder; cdecl; overload;
  end;

и добавление 

    function setNetworkSpecifier(networkSpecifier: JWiFiNetworkSpecifier): JNetworkRequest_Builder; cdecl; overload;

ситуЁвину не выправляет - а ведь нативный (Явовский) Буилдер (точнее его setNetworkSpecifier) принимает параметр именно типа WiFiNetworkSpecifier - как ето дело объегорить?

Ссылка на комментарий
  • 0

Выкопал в силиконовой долине следующее:

public abstract class NetworkSpecifier
extends Object

java.lang.Объект
спецификация android.net.networks
Известные прямые подклассы
 
ну, а раз уж WifiNetworkSpecifier есть подкласс NetworkSpecifier, то должно быть что-то типа иерархии:
type
	JWifiNetworkSpecifier = class(TJNetworkSpecifier)
...
end;

наследник-то будет вродь-как совместимого типа...

После ребута Дэлфей выглядеть стало поприятней

JWifiNetworkSpecifier.thumb.jpg.cd41cc34207c1dabdcf7c083edd14b2a.jpg

но красное подчёркивание говорит, что нет такой перегрузки

 

Изменено пользователем UFO 007
Ссылка на комментарий
  • 0

... подчёркивание пропало, компилится - норм, но тел упорно пишет "Not Connected"... Вот весь код:

procedure TForm1.Button1Click(Sender: TObject);
var
  ts: TStringList;
begin
  BuildCode:= TJBuild_VERSION.JavaClass.SDK_INT;
  memo1.Lines.Add(inttostr(BuildCode));
//  ts:= TStringList.Create;
//  WIfiScan('ESP-007', ts);
//  memo1.Lines.AddStrings(ts);
  WIfiConnect('ESP-007.1M');
  if IsWiFiConnected then   memo1.Lines.Add('Connected')
  else   memo1.Lines.Add('Not Connected');
end;

Function TForm1.WIfiConnect(SSIDtoConnect: string): boolean;
Var
{$IfDEF ANDROID}
  conf: JWIfiConfiguration;
  list: JList;
  iter: JIterator;
  Capabilities: JNetworkCapabilities;
  ConnectivityManager: JConnectivityManager;
  Callback: JConnectivityManager_NetWorkCallback;
  NetworkRequest_Builder: JNetworkRequest_Builder;
  NetworkRequest: JNetworkRequest;
  WifiNetworkSpecifier: JWifiNetworkSpecifier;
  WifiNetworkSpecifier_Builder: JWifiNetworkSpecifier_Builder;
{$EndIf}
Begin
  SSIDtoConnect:= '"'+SSIDtoConnect+'"';
  Try
    if BuildCode < 29 then
    Begin            // SharedActivityContext
      WIfiManagerObj := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.WIfI_SERVICE);
      WIfiManager := TJWIfiManager.Wrap((WIfiManagerObj as ILocalObject).GetObjectID);
      conf:= TJWIfiConfiguration.JavaClass.init;
      conf.SSID:= StringToJString(SSIDtoConnect);//'"ESP-007.1"');
      conf.allowedKeyManagement.&set(TJWIfiConfiguration_KeyMgmt.JavaClass.NONE);
      netID:= WIfiManager.addNetwork(conf);// добавляем внаглую - не мешало бы проверить может она уже есть в ConfiguredNetworks?
      list:= wIfiManager.getConfiguredNetworks;
      iter := list.iterator;
      While (iter.hasNext) Do
      Begin
        conf := TJWIfiConfiguration.Wrap((iter.next as ILocalObject).GetObjectID);
        If JStringToString(Conf.SSID)  = SSIDtoConnect Then// '"ESP-007.1"'
        Begin
          wIfiManager.disconnect;
          wIfiManager.enableNetwork(Conf.networkId, true);
          wIfiManager.reconnect;
  //      Result:=   Sleep(1500);
        End;
      End;
    End
    Else  // BuildCode >= 29
    Begin
      WifiNetworkSpecifier_Builder:= TJWifiNetworkSpecifier_Builder.JavaClass.init;
      WifiNetworkSpecifier_Builder.setSsid(StringToJString(SSIDtoConnect));//'"'+'wifi-ap-ssid'+'"'
      WifiNetworkSpecifier_Builder.setWpa2Passphrase(StringToJString('')); // wifi-ap-password
      WifiNetworkSpecifier := WifiNetworkSpecifier_Builder.build;
memo1.Lines.Add('NetworkSpecifier'+JStringToString(WifiNetworkSpecifier.toString));
      NetworkRequest_Builder:= TJNetworkRequest_Builder.JavaClass.init;
      NetworkRequest_Builder.addTransportType(TJNetworkCapabilities.JavaClass.TRANSPORT_WIFI);
      NetworkRequest_Builder.addCapability(TJNetworkCapabilities.JavaClass.NET_CAPABILITY_INTERNET);
      NetworkRequest_Builder.setNetworkSpecifier(WifiNetworkSpecifier);//  as JNetworkSpecifier
      NetworkRequest := NetworkRequest_Builder.build;
memo1.Lines.Add('NetworkRequest'+JStringToString(NetworkRequest.toString));
      ConnectivityManager:= GetConnectivityManager;
      Callback:= TJConnectivityManager_NetWorkCallback.JavaClass.init;//.Create;
      if ConnectivityManager <> nil then
      ConnectivityManager.requestNetwork(NetworkRequest, Callback);
      Callback.onAvailable(ConnectivityManager.getActiveNetwork);
    End;
    Result:= IsWiFiConnected;
  Except
    on E: EJNIException do
    ShowMessage('Произошла ошибка класса: ' +#13 +#10 + E.ClassName +#13 +#10 +
    'c сообщением: ' +#13 +#10 + E.Message);
  End;
//  If Result Then
//  MyShwMsg('Подключение: связь с устройством' + #10 + #13 + SSIDtoConnect
//              + #10 + #13 + ' установлена.');
End;

тел точку доступа видит, но... мож дело в setWpa2Passphrase - т.д. открытая: ВайВайМанагер через TJWIfiConfiguration_KeyMgmt.JavaClass.NONE подключался (правда в АПИ23) на "Ура"...

Ссылка на комментарий
  • 0
21 минуту назад, UFO 007 сказал:
WifiNetworkSpecifier_Builder.setWpa2Passphrase(StringToJString(''));

заменил на

WifiNetworkSpecifier_Builder.setIsEnhancedOpen(false);

и хоть (true), хоть (false) т.е. расширенная/нерасширенная, но открытая (мож и здесь неправильно понимаю), всёрно  "Not Connected". (ЕСПэха только в списке доступных)... А мож КэлБэк виноват? (тут, если честно, вообще не догоняю - КэлБэк: это событие, прерывание, или ... ??? когда наступает/происходит и как работает? Если можно, плз, в трёх словах) Заполнил чем под руки попало.

Изменено пользователем UFO 007
Ссылка на комментарий
  • 0

RedMi_4Pro(АПИ_23) хоть и пишет  "Not Connected", но при удержании значка ВайВай (что в "шторке") - ESP-007.1M подключено без доступа в интернет (даже после удаления этой сети из списка сохранённых)... Стало быть глючит:

function IsWiFiConnected: Boolean;
var
  ConnectivityManager: JConnectivityManager;
  WiFiNetwork: JNetworkInfo;
begin
  ConnectivityManager := GetConnectivityManager;
  WiFiNetwork := ConnectivityManager.getNetworkInfo(TJConnectivityManager.JavaClass.TYPE_WIFI);
  Result := WiFiNetwork.IsConnected;
end;

а под хе8 пахала на "ура"...

Ссылка на комментарий
  • 0

Base class for NetworkRequest callbacks. Used for notifications about network changes. Should be extended by applications wanting notifications. A NetworkCallback is registered by calling

Соответственно это класс. Соответственно здесь вы и увидете что происходит с этой сетью вай фай в зависимости от процедур объявленных в этом классе

 

 

Ссылка на комментарий
  • 0
5 часов назад, OnePeople сказал:

deprecated in API level 29.

дык брешет-то с АПИ 23, но подключает (что очень для меня неожиданно т.к. как часы работало только из-под хе8, а 10.3.3 Рио и 10.4.1 Сидней - трассируй/не трассируй не подключалось и что повлияло: Сидней 10.4.или (скорее) ветвление по БуилдВерсион)? а на РедМи 9Т (АПИ 29) в настройках ВайВай (удержание значка в "шторке") - ЕСПха только в списке доступных...

А по поводу КэлБэк - как на Паскале реализовать такое:

1:		networkCallback = new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                manager.bindProcessToNetwork(network);
            } else {
                //This method was deprecated in API level 23
                ConnectivityManager.setProcessDefaultNetwork(network);
            }
            try {
                //do a callback or something else to alert your code that it's ok to send the message through socket now
            } catch (Exception e) {
                e.printStackTrace();
            }
            manager.unregisterNetworkCallback(this);
        }
    });

у меня получается:

      ConnectivityManager:= GetConnectivityManager;
      if ConnectivityManager <> nil then
      begin
1:      Callback:= TJConnectivityManager_NetWorkCallback.JavaClass.init;//.Create;
        ConnectivityManager.registerDefaultNetworkCallback(Callback);
        ConnectivityManager.requestNetwork(NetworkRequest, Callback);
        Callback.onAvailable(ConnectivityManager.getActiveNetwork);
      end
      else ShowMessage('Не удалось получить экземпляр менеджера подключений');

меня смущает то, что у нас метод onAvailable хочет один-единственный параметр (NetWork: JNetWork), а в Яве он разворачивается в целую процедуру (где можно накрапать ого-го-го)... Тем более - он процедура а не булева ф-ция: понять доступна или нет указанная сеть невозможно...

Ссылка на комментарий
  • 0

а в Яве он разворачивается в целую процедуру, какую процедуру!? Callback это ответный метод, вы так сказать подсоединяетесь к нему

 

Callback.onAvailable := NetworkonAvailable;

и каждый раз когда платформа подключается и объявляет новую сеть готовой к использованию(onAvailable) будет вызываться процедура, которую вам необходимо объявить и описать дальнейшие действия

 

procedure NetworkonAvailable(network: JNetwork);

begin

//

end;

Изменено пользователем OnePeople
Ссылка на комментарий
  • 0

"... так вот ты какой, Северный Олень..." или "... а Ларчик открывался просто: ..." просто вместо открывания скобки надо присваивать (:=)...

OnePeopleспасибо Вам огромное за то, что якшаетесь со мной как с маленьким... Дело в том, что моё "портфолио" состоит из десятка-полтора VCL-програмулин (для Винды - соответственно и, как видите - у мя тож не ПРОФ, а хобби) а вот с Андрюхой - это мой первый опыт. Но позволю себе заметить:

В 21.11.2021 в 20:42, OnePeople сказал:

переписывать на Delphi (паскале, не считаю)

типа: по-библейски - "И был сначала Pascal, потом TurboPascal, потом всё это дело обросло формами, эвентами, мессагами... И лишь на 7-й день явилась Delphi-1..." А потом (которые я пользовал) D7, D2010, xe2, xe8... А потом погнала "Международная панорама": Берлин, Токио, Сиэтл, Рио, Сидней... Пардон - если мой тон показался резковатым.

З.Ы. иСЧё раз - огромное спасибо

Ссылка на комментарий
  • 0

Я, конечно дико извиняюсь, но сегодня - "не Ваш день": конструкция с присваиванием (мож по-Явовски так и можно, но... [я, кстати, наивно пытался заменить '{' после onAvailable на begin - так подчёркивало красным]) провалилась с треском (то же самое красное подчёркивание)... СитуЁВину вродь как выправило (убралось подчёркивание) такое:

Function NetworkonAvailable(network: JNetwork): JNetwork;

begin
  /// тут чё писать - уму не растяжимо: мож Хто подскажет???
end;

Function TForm1.WIfiConnect(SSIDtoConnect: string): boolean;
....
///
....
        Callback.onAvailable(NetworkonAvailable(ConnectivityManager.getActiveNetwork));
...
end

но "... меня терзают смутные сомнения ..." что мы с Вами изобретаем такой лИСАпед, который не то, что не взлетит (как должно), а даже - не поедет...

З.Ы. Сомнения обосновываются, как минимум, тем, что предка (родителя) WiFiNetworkSpecifier мы переопределили и Х-его-З в какую сторону (поможет это или только помешает???)... В общем - я на "измене" и в успех верится слабо...

Ссылка на комментарий
  • 0

по-библейски я знаю историю языка, но по мне он достаточно ушел по возможностям чтобы его называть Pascal'ем.

20 часов назад, UFO 007 сказал:

тут чё писать

Допустим

memo1.lines.add('connect');

Я ни каких велосипедов не изобретаю, поменяйте местами

Callback:= TJConnectivityManager_NetWorkCallback.JavaClass.init;//.Create;

Callback.onAvailable(ConnectivityManager.getActiveNetwork ;

ConnectivityManager.requestNetwork(NetworkRequest, Callback);

 

21 час назад, UFO 007 сказал:

Function NetworkonAvailable(network: JNetwork? JNetwork

Разве onAvailable функция??? Мне кажется что нет. 

procedure TForm1.NetworkonAvailable(network: JNetwork)

Вот этим можно просто зарегистрировать callback и его метод onAvailable будет каждый раз вызываться при подключении к сети.

ConnectivityManager.registerDefaultNetworkCallback(Callback)

А эта конструкция подключается к сети которая наиболее подходит к параметрам NetworkRequest и callback.onAvailable будет вызываться при подключении именно к этой сети.

ConnectivityManager.requestNetwork(NetworkRequest, Callback);

 

P.s читайте android developer, ищите ошибки у себя в коде, тестите, выводить в memo логи какие нибудь и смотрите что не работает

Ссылка на комментарий
  • 0
В 27.11.2021 в 18:27, OnePeople сказал:

что не работает

перегрузка

   function setNetworkSpecifier(networkSpecifier: JWifiNetworkSpecifier): JNetworkRequest_Builder; cdecl; overload;

тел пишет: Invoke error: method not found (а чего стоило ожидать?)... А ведь не зря я это (интуитивно) упоминал:

 

В 23.11.2021 в 21:54, UFO 007 сказал:
type
	JWifiNetworkSpecifier = class(TJNetworkSpecifier)
...
end;

 

оказывается (точнее - как Дэлфе объяснить?) что

public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parcelable {

моя конструкция кричит (что естественно) "несовместимые типы"... а что касается 

В 25.11.2021 в 22:51, OnePeople сказал:

procedure NetworkonAvailable(network: JNetwork);

 

В 25.11.2021 в 21:41, UFO 007 сказал:

onAvailable хочет один-единственный параметр (NetWork: JNetWork)

а процедура возвращает ЧТО? - правильно: void... вот поэтому и функция ИмяФункции(любые параметры):JNetwork;

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...