Андроид: непонятки с FMX.DialogService и JWifiManager
Желаю всем здравия, други мои.
Скультивировал (изгандобил) тут намедни одну железяку на базе ЕСП8266 и вы можете не поверить, но на написание компьютерной ипостаси программы поддержки (в перемешку с допиливанием прошивки как Точки Доступа) ушло день-два (максимум три, правда остался один недозакрытый вопрос, но об этом позже или в совсем другой теме: WLanConnect через немецкий перевод нативной WLanAPI на дельфийскую nduWLanAPI), но ПиСи - штука не совсем портабельная/мобильная а вот с Андрюхиной ипостасью бьюсь уже больше недели, но как у Крылова: Однажды-лебедь-раком-щуку-но-воз-и-ныне---там... вАащпе - пипец... Ну, значит - вот:
Код:
var
Form1: TForm1;
WifiManager: JWifiManager;
WifiManagerObj: JObject;
mtError, mtInformation, mtConfirmation: System.UITypes.TMsgDlgType;
mbYes, mbNo, mbOK: System.UITypes.TMsgDlgBtn;
implementation
{$R *.fmx}
function myMsgDlg(const AMessage: string; const ADialogType: TMsgDlgType;
const AButtons: TMsgDlgButtons; const ADefaultButton: TMsgDlgBtn): Integer;
var
mr: TModalResult;
begin
mr:=mrNone;
// standart call with callback anonimous method
TDialogService.MessageDialog(AMessage, ADialogType, AButtons,
ADefaultButton, 0,
procedure (const AResult: TModalResult)
begin
mr:=AResult
end);
// while mr = mrNone do // wait for modal result
// Application.ProcessMessages;
Result:=mr;
end;
Function TForm1.WiFiScan(search_ssid: string; var Founded: TStringList): TStringList;
var
{$IFDEF ANDROID}
ScanResult: JScanResult;
{$ENDIF}
ssid: string;
I: Integer;
begin
Result:= TStringList.Create;
TJWifiManager.Wrap(TAndroidHelper.Context.getSystemService(TJContext.JavaClass.WIFI_SERVICE));
WifiManagerObj:= TAndroidHelper.Context.getSystemService(TJContext.JavaClass.WIFI_SERVICE);
WifiManager:= TJWifiManager.Wrap((WifiManagerObj as ILocalObject).GetObjectID);
if not WifiManager.isWifiEnabled then
if myMsgDlg('Модуль WiFi в устройстве отключен.' + //#10 + #13 +
'Попытаться включить?', mtError, mbYesNo, mbYes) = mrYes
then WifiManager.setWifiEnabled(true) else exit;
Sleep(2000);
for I := 0 to WifiManager.getScanResults.size - 1 do
begin
ScanResult := TJScanResult.Wrap((WifiManager.getScanResults.get(I) as ILocalObject).GetObjectID);
ssid:= JStringToString(ScanResult.SSID);
Result.Add(ssid);
end;
for I := 0 to Result.Count - 1 do
if Pos(search_ssid, Result.Strings[i]) > 0 then Founded.Add(Result.Strings[i]);
end;
Function TForm1.WiFiConnect(SSIDtoConnect: string): boolean;
var
{$IFDEF ANDROID}
conf: JWifiConfiguration;
// WifiConfigObj: JObject;
list: JList;
iter: JIterator;
{$ENDIF}
begin
Result:= false;
SSIDtoConnect:= '"'+SSIDtoConnect+'"';
try
//TJWifiManager.Wrap(TAndroidHelper.Context.getSystemService(TJContext.JavaClass.WIFI_SERVICE));
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);
list:= wifiManager.getConfiguredNetworks;
WifiManager.addNetwork(conf);// добавляем внаглую - не мешало бы проверить может она уже есть в ConfiguredNetworks?
iter := list.iterator;
while iter.hasNext do
Begin
conf := TJWifiConfiguration.Wrap((iter.next as ILocalObject).GetObjectID);
//Memo1.lines.add('networkId: '+conf.networkId.ToString + ' --> SSID: ' + JStringToString(conf.SSID));
if JStringToString(Conf.SSID) = SSIDtoConnect then// '"ESP-007.1"'
Begin
wifiManager.disconnect;
wifiManager.enableNetwork(Conf.networkId, true);
//memo1.lines.add('enableNetwork = networkId: ' + Conf.networkId.ToString(Conf.networkId));
Result:= wifiManager.reconnect;
End;
End;
except
on E: Exception do
ShowMessage('Произошла ошибка класса: ' +#13 +#10 + E.ClassName +#13 +#10 +
'c сообщением: ' +#13 +#10 + E.Message);
end;
if Result then
ShowMessage('Подключение: связь с устройством' + #10 + #13 + SSIDtoConnect
+ #10 + #13 + ' установлена.');
end;
Function TForm1.SendMsg(Msg: string): string;
begin
IdUDPClient1.Send(Msg, IndyTextEncoding(encIndyDefault)); //отправка сообщени¤ в сеть
Result:= IdUdpClient1.ReceiveString(10, IndyTextEncoding(encUTF8));
end;
это чтобы было понятно когда и что выполняется, а вызывается отсюда:
Код:
procedure TForm1.btWifiConnectClick(Sender: TObject);
label l;
var
tsESP, tsl: TStringlist;
TPath: System.IOUtils.TPath;
I: Integer;
Start: TTime; // FMX.Objects , Stop
PreStatus, apname: string;
begin
// FMX.Dialogs.MessageDlg('Для того чтобы программа смогла ' + #10 + #13 +
FMX.Dialogs.ShowMessage('Для того чтобы программа смогла ' + #10 + #13 +
'связаться с железякой нажмите' + #10 + #13 +
'на её корпусе кнопку "WiFi" после' + #10 + #13 + #10 + #13 +
'---для расширения окна мессага - ' + #10 + #13 +
'чтобы его было видно из-под окна' + #10 + #13 +
'2-го мессага--------------------' + #10 + #13 + #10 + #13 +
'чего щёлкните "ОК"');// #10 + #13 + mbYes, mbNo{ }
// 'чего щёлкните "ОК"', mtError, [mbOK], 0);// #10 + #13 + mbYes, mbNo{ }
Sleep(3000);
tsESP:= TStringlist.Create;
if not FileExists(TPath.Combine(TPath.GetDocumentsPath, 'AP_Name.txt')) then
begin // AP_Name.txt = NOT Exists
FMX.Dialogs.ShowMessage('Программа не нашла файл' + #10 + #13 +
'"AP_Name.txt" - вычисляем ' + #10 + #13 +
'наш агрегат по алгоритму...');
// 'наш агрегат по алгоритму...', mtError, [mbOk], 0);
Sleep(2000);
tsl:= TStringlist.Create;
l: tsl:= WiFiScan('ESP-007', tsESP);
ListBox1.Items.Add('tsESP.Count ='+IntToStr(tsESP.Count));
if tsESP.Count = 0 then // в эфире - тишина
begin
if myMsgDlg('Если кнопка "WiFi" была' + #10 + #13 +
'нажата, то агрегат или' + #10 + #13 +
'не запитан или ему хана' + #10 + #13 +
'но прога его не видит' + #10 + #13 +
'Повторить попытку?', mtConfirmation, mbYesNo, mbYes) = mrYes then GoTo l else exit;
end;
if tsESP.Count < 2 then
begin//ESP-ха в эфире одна
FMX.Dialogs.ShowMessage('В эфире - одна ESP-ха');//, mtInformation, [mbOk], 0);
tsESP.SaveToFile(TPath.Combine(TPath.GetSharedDocumentsPath, 'AP_Name.txt'));
end
else
begin // ESP-х в эфире - куча 007.1, 007.2, ... ,007.9...9
FMX.Dialogs.ShowMessage('В эфире - тонна ESP-х: откройте дверцу');//, mtInformation, [mbOk], 0);
for I := 0 to tsESP.Count - 1 do
begin
WiFiConnect(tsESP.Strings[i]);
PreStatus:= SendMSG('Get_Status');
Start:= Now;
while SecondsBetween(Now, Start) < 120 do // ждём открытия дверцы
begin
if PreStatus <> SendMSG('Get_Status') then // если 2-й или 4-й бит поменялся
begin
apname:= tsESP.Strings[i];
tsESP.Clear;
tsESP.Add(apname);
tsESP.SaveToFile(TPath.Combine(TPath.GetSharedDocumentsPath, 'AP_Name.txt'));
FMX.Dialogs.ShowMessage('Спасибо. Агрегат детектирован, сетевое имя сохранено.');//, mtInformation, [mbOk], 0);
break;
end;
sleep(500);
end;// while
end;
end;
end
else
begin // AP_Name.txt = Exists
tsESP.Clear;
tsESP.LoadFromFile(TPath.Combine(TPath.GetDocumentsPath, 'AP_Name.txt'));
if WiFiConnect(tsESP.Strings[0]) then
FMX.Dialogs.ShowMessage('Подключено к агрегату по фамилии' + #10 + #13 +
tsESP.Strings[0]);//, mtInformation, [mbOk], 0);
end;
tsESP.Free;
end;
а теперь по порядку: изначально ХЕ5 с Андрюхой не справилась - пересел на ХЕ8, но намучившись из-за отсутствия в её составе FMX.DialogService и TAndroidHelper пересел на Сиэтл(10.4) - мож тож глючная?: мало того, что порядка в Мессагах (по 3 шт. друг над другом) и Диалогах (необязательно жать "Yes" или "No" - достаточно промахнуться мимо окна диалога и окно закрывается) порядка не навела, но и перестали работать ф-ции Скан и Коннект (ни с устаревшей SharedActivityContext, ни с TAndroidHelper на который рекомендует заменить Сиэтл). Что делать и как быть - подскажить, плз.
__________________
...И был сначала ZX-Spectrum, а потом его T(urbo)ASS(e)M(bler)... И только на 7-й день (когда Интел купила Пентковского [из КБ Бабаяна]) - появился Pentium-I... А в Союзе P-II был ещё в 1978 году (точнее: Эльбрус [мультискалярный проц] только не рапространялся спекулянтами, а управлял ракетами и спутниками)... А лет с пяток назад Эльбрус-II ПЁР (но никак не ГНАЛСЯ как Селероны) на F(recuency):= 400 GHz... А самое парадоксальное - презентация состоялась в Минске...