Перейти к содержанию
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

Так правильно, какая перегрузка метода, который берется с указанием директивы вызова процедур, его нет, а вы сами придумали.

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

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

Нашел времени немного, у себя сделал так, нахожу все сети, заполняю ими ListView, при нажатии на item вызываю ConnectToWifi(ssid, bsid, password: String) а вы какой хотите велосипед такой и изобретайте

1.JWifiNetworkSpecifier = interface(JObject) оставляем!

2.

procedure ConnectToWifi(ssid, bsid, password: String);
  var
    ConnectivityManagerNative: JObject;
    ConnectivityManager: JConnectivityManager;
    NetworkRequest_Builder: JNetworkRequest_Builder;
    NetworkRequest: JNetworkRequest;
    WifiNetworkSpecifier: JWifiNetworkSpecifier;
    WifiNetworkSpecifier_Builder: JWifiNetworkSpecifier_Builder;
    WiFicallback: JConnectivityManager_NetworkCallback;
  begin
  WifiNetworkSpecifier := TJWifiNetworkSpecifier_Builder.Create
                    .setSsidPattern(TJPatternMatcher.JavaClass.init(StringToJString(ssid), TJPatternMatcher.JavaClass.PATTERN_PREFIX))
                    .setBssid(TJMacAddress.JavaClass.fromString(StringToJString(bsid)))
                    .setWpa2Passphrase(StringToJString(password))
                    .build();

  NetworkRequest := TJNetworkRequest_Builder.Create
                    .addTransportType(TJNetworkCapabilities.JavaClass.TRANSPORT_WIFI)
                    .removeCapability(TJNetworkCapabilities.JavaClass.NET_CAPABILITY_INTERNET)
                    .setNetworkSpecifier( TJNetworkSpecifier.Wrap((WifiNetworkSpecifier as ILocalObject).GetObjectID))
                    .build();

  WiFicallback := TJConnectivityManager_NetworkCallback.JavaClass.init;

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

  connectivityManager.requestNetwork(NetworkRequest, WiFicallback);
end;

3. WiFiCallBack это обратный вызов - это класс Java, поэтому вам нужно создать потомка и реализовать необходимые методы. В настоящее время это невозможно сделать в Delphi (хотя listner'ы отлично реализуются), поэтому вам нужно будет сделать это на Java. В коде Java вы можете объявить интерфейс, который может быть передан классу, как в этом примере:

https://github.com/DelphiWorlds/Kastri/blob/master/Features/Connectivity/DW.Connectivity.Android.pas

 https://github.com/DelphiWorlds/Kastri/tree/master/Java/Base/Connectivity

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

Так вот где собака порылась:

14 часов назад, OnePeople сказал:
.setNetworkSpecifier( TJNetworkSpecifier.Wrap((WifiNetworkSpecifier as ILocalObject).GetObjectID))

а то "интерфейситься" не туда, втыкать "левую" перегрузку... А процедура Ваша - "огонь": подключается на "ура", но (куда же без этих "но") напрягает вот этот снэкбар:

 

 

 

Screenshot_2021-11-30-21-56-38-084_com.android.settings.thumb.jpg.2e619b5582ce5d79265a9835b28ebdc4.jpg

это - проделки Андрюхи (из глубины ядра)? Избавиться никак нельзя? И

14 часов назад, OnePeople сказал:

нахожу все сети, заполняю ими ListView

а поподробней нельзя?: какими компонентами/экземплярами каких классов/через какие свойства/методы...? А ещё лучше на паскале. 

Ссылка на комментарий
  • 0
В 30.11.2021 в 08:15, OnePeople сказал:

Нашел времени немного, у себя сделал так, нахожу все сети, заполняю ими ListView, при нажатии на item вызываю ConnectToWifi(ssid, bsid, password: String) а вы какой хотите велосипед такой и изобретайте

1.JWifiNetworkSpecifier = interface(JObject) оставляем!

2.

procedure ConnectToWifi(ssid, bsid, password: String);
  var
    ConnectivityManagerNative: JObject;
    ConnectivityManager: JConnectivityManager;
    NetworkRequest_Builder: JNetworkRequest_Builder;
    NetworkRequest: JNetworkRequest;
    WifiNetworkSpecifier: JWifiNetworkSpecifier;
    WifiNetworkSpecifier_Builder: JWifiNetworkSpecifier_Builder;
    WiFicallback: JConnectivityManager_NetworkCallback;
  begin
  WifiNetworkSpecifier := TJWifiNetworkSpecifier_Builder.Create
                    .setSsidPattern(TJPatternMatcher.JavaClass.init(StringToJString(ssid), TJPatternMatcher.JavaClass.PATTERN_PREFIX))
                    .setBssid(TJMacAddress.JavaClass.fromString(StringToJString(bsid)))
                    .setWpa2Passphrase(StringToJString(password))
                    .build();

  NetworkRequest := TJNetworkRequest_Builder.Create
                    .addTransportType(TJNetworkCapabilities.JavaClass.TRANSPORT_WIFI)
                    .removeCapability(TJNetworkCapabilities.JavaClass.NET_CAPABILITY_INTERNET)
                    .setNetworkSpecifier( TJNetworkSpecifier.Wrap((WifiNetworkSpecifier as ILocalObject).GetObjectID))
                    .build();

  WiFicallback := TJConnectivityManager_NetworkCallback.JavaClass.init;

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

  connectivityManager.requestNetwork(NetworkRequest, WiFicallback);
end;

3. WiFiCallBack это обратный вызов - это класс Java, поэтому вам нужно создать потомка и реализовать необходимые методы. В настоящее время это невозможно сделать в Delphi (хотя listner'ы отлично реализуются), поэтому вам нужно будет сделать это на Java. В коде Java вы можете объявить интерфейс, который может быть передан классу, как в этом примере:

https://github.com/DelphiWorlds/Kastri/blob/master/Features/Connectivity/DW.Connectivity.Android.pas

 https://github.com/DelphiWorlds/Kastri/tree/master/Java/Base/Connectivity

Добрый день, а вас не затруднит выложить полностью рабочий проект? 

 

Ссылка на комментарий
  • 0
В 04.01.2024 в 15:16, KazakOFF сказал:

Добрый день, а вас не затруднит выложить полностью рабочий проект? 

 

Так у меня его нет) Себе делал callback для поиска количества спутников. Пишите на java callback (GnssStatusCallback.rar)

Через codex генерируете jar файл, добавляете его себе в проект в Libraries

Пишите объявления методов (Androidapi.JNI.GnssStatusCallback.rar)

Создаем класс

  type
    TGnnsStatusCallbackDelegate = class(TJavaLocal, JGnssStatusCallbackDelegate)
  private
    class var FConnectivityManager: JConnectivityManager;
  private
    FCallback: JGnssStatusCallback;
  protected
  public
    procedure onFirstFix(ttffMillis: Integer); cdecl;
    procedure onSatelliteStatusChanged(status: JGnssStatus); cdecl;
    procedure onStarted; cdecl;
    procedure onStopped; cdecl;
  public
    constructor Create();
  end;
constructor TGnnsStatusCallbackDelegate.Create;
begin
  inherited Create;
  FCallback := TJGnssStatusCallback.JavaClass.init(TAndroidHelper.Context, Self);
end;
GnnsStatusCallbackDelegate := TGnnsStatusCallbackDelegate.Create;

Androidapi.JNI.GnssStatusCallback.rar GnssStatusCallback.rar

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

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

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

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

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

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

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

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

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

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

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