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

Активность

Лента обновляется автоматически

  1. today
  2. Последняя неделя
  3. blStartDiscovery := FJBluetoothAdapter.startDiscovery; if TJBuild_VERSION.JavaClass.SDK_INT >= 29 then тогда нужно доп разрешение FPermissionBackgroundLocation := JStringToString(TJManifest_permission.JavaClass.ACCESS_BACKGROUND_LOCATION); тут через BroadcastReceiver ловим TJBluetoothDevice.JavaClass.ACTION_FOUND и TJBluetoothAdapter.JavaClass.ACTION_DISCOVERY_FINISHED и TJBluetoothAdapter.JavaClass.ACTION_DISCOVERY_STARTED в методе BroadcastReceiver OnReceive(Context: JContext; Intent: JIntent); if JStringToString(Intent.getAction).Equals(JStringToString(TJBluetoothDevice.JavaClass.ACTION_FOUND)) then begin Parcel := intent.getParcelableExtra(TJBluetoothDevice.JavaClass.EXTRA_DEVICE); if Parcel <> nil then BluetoothDevice := TJBluetoothDevice.Wrap((Parcel as ILocalObject).GetObjectID); if BluetoothDevice <> nil then if (BluetoothDevice.getBondState() = TJBluetoothDevice.JavaClass.BOND_NONE) then begin Form1.AddListViewItem(Form1.lvBTOBD, jstringtostring(BluetoothDevice.getName), jstringtostring(BluetoothDevice.getAddress),'Bluetooth'); end; end;
  4. uses ... type TGnnsStatusCallbackDelegate = class(TJavaLocal, JGnssStatusCallbackDelegate) 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; ... var GnnsStatusCallbackDelegate := TGnnsStatusCallbackDelegate implementation procedure TForm1.FormCreate(Sender: TObject); begin GnnsStatusCallbackDelegate := TGnnsStatusCallbackDelegate.Create; end; constructor TGnnsStatusCallbackDelegate.Create; begin inherited Create; FCallback := TJGnssStatusCallback.JavaClass.init(TAndroidHelper.Context, Self); end; procedure TGnnsStatusCallbackDelegate.onFirstFix(ttffMillis: Integer); begin // end; procedure TGnnsStatusCallbackDelegate.onSatelliteStatusChanged( status: JGnssStatus); var satelliteCount, usedCount: Integer; begin TTask.Run(procedure var i: Integer; begin try usedCount:= 0; satelliteCount := status.getSatelliteCount(); for i := 0 to satelliteCount - 1 do if status.usedInFix(i) then usedCount := usedCount + 1; TThread.Synchronize(nil, procedure begin Form1.tqsSatMax.Text := satelliteCount.ToString; Form1.tqsSat.Text := usedCount.ToString; Form1.tnSat.Text := usedCount.ToString; end); except Form1.LogCAAdd('TGnnsStatusCallback except'); end; end); end; procedure TGnnsStatusCallbackDelegate.onStarted; begin // end; procedure TGnnsStatusCallbackDelegate.onStopped; begin // end;
  5. Да - чуть было не забыл: тостер внутри J_BT.zip
  6. Вообще-то - проект не мой, а лежит по адресу: c:\Users\Public\Documents\Embarcadero\Studio\22.0\Samples\Object Pascal\Multi-Device Samples\Device Sensors and Services\Bluetooth\ и окромя ГолубыхЗубов (базируется, правда на System.Bluetooth) там ещё кучи: ВиФи, акселерометр, геолокация, ... но самый прикольный TabSliding. Как и подсказал OnePeople в потоке TJReceiver ждём CRLF (#10 + #13) и строка выходит целиком, НО время её "коллекционирования" в System.Bluetooth занимает где-то секунд 5, а у мя таймер каждые 500 мС посылает запрос состояния и выводит положение датчиков.... Так что System.Bluetooth - не вариант, а вот исходник (точнее - обрывки) из последнего поста OnePeople после кувалды и напильника шлифанул "нулёвкой" и заработало... Кстати, для таких же почемучек как я (а мож и погоремычнее) приаттачиваю отшлифованный проект на Androidapi.JNI.Bluetooth (Ас Из - искушённые Гуру заметят в нём угловатости но критику эту - в студию: допилим). И чтобы чат заработал необходимо в среде Arduino IDE прошить ЕСП32 скетчем c:\Users\Администратор\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.11\libraries\BluetoothSerial\examples\SerialToSerialBT\... Затем проект затолкать Дэлфёй в телефон, в БТ-меню тела нажать "добавить устройство" и тел начнёт дискаверить.... По завершении законнектиться с ESP32-BT-Slave и тут же разорвать коннект, запустить J_BT, нажать btGetPaired и в комбобоксе (что рядом с ней) выбрать ESP32-BT-Slave и как увидите TJReceiver = Started и FJSocket <> nil - можно чатиться с ЕСПхой открыв в Arduino IDE монитор сериал порта (Ctrl+Shift+M). Вот и добрались к центральному вопросу поста: а как средствами Androidapi.JNI.Bluetooth дискаверить устройства поблизости? Нет можно, конечно, забить костыль из System.Bluetooth, но хотелось бы чтобы если уж АПИ, то АПИ. Заранее благодарен. J_BT.ZIP
  7. Привет Луди! Извините за рускии язык. У мена ест код на C# проект. Ево надо На делпи перевести. Код маленки. Кто помозет мен на етом? конешно не бесплатно. Поставлау код исходник. Собран на Висуал Студио 2012 на C#
  8. Более тупого вопроса на форуме, посвященному делфи, и не припомню
  9. Во все мыслимые стороны. Популярность Делфи выросла на прямых клиент-серверных приложениях. Сейчас так не пишут, почти везде - веб.
  10. Ещё раньше
  11. Firemonkey

    Delphi vs MS Visual Studio

    В чем преимущества (кроме бесплатности) у MS Visual Studio перед Delphi при создании Windows-программ?
  12. Были времена, когда на Delphi писали почти все (складывалось такое ощущение). Но в десятых годах 21 века (или раньше?) началась массовая миграция с Delphi. На какие языки и в какие среды мигрировали бывшие Delphi-программисты?
  13. JGnssStatus в модуле Androidapi.JNI.GnssStatusCallback.pas был не определен... - я добавил. Но правильно, или нет - вопрос. При попытке выполнить нижеуказанный код вылетает исключение "interface not supported". Что я делаю не так? Код формы: unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Controls.Presentation,Androidapi.JNI.GnssStatusCallback, System.Android.Sensors, System.Sensors,Androidapi.JNI.Location, FMX.Memo.Types, FMX.ScrollBox, FMX.Memo, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNIBridge, Androidapi.JNI.App, Androidapi.Helpers, Androidapi.JNI.JavaTypes, System.Sensors.Components; type TForm7 = class(TForm) CornerButton1: TCornerButton; Memo1: TMemo; × unit Unit1; LocationSensor1: TLocationSensor; procedure CornerButton1Click(Sender: TObject); private public end; var Form7: TForm7; implementation {$R *.fmx} type TMyGnssStatusCallbackDelegate = class(TJGnssStatusCallbackDelegate) public procedure onFirstFix(ttffMillis: Integer); cdecl; procedure onSatelliteStatusChanged(status: JGnssStatus); cdecl; procedure onStarted; cdecl; procedure onStopped; cdecl; end; procedure TMyGnssStatusCallbackDelegate.onFirstFix(ttffMillis: Integer); begin //... end; procedure TMyGnssStatusCallbackDelegate.onSatelliteStatusChanged(status: JGnssStatus); begin // Событие изменения статуса спутников end; procedure TMyGnssStatusCallbackDelegate.onStarted; begin // Событие запуска отслеживания GNSS end; procedure TMyGnssStatusCallbackDelegate.onStopped; begin // Событие остановки отслеживания GNSS end; procedure TForm7.CornerButton1Click(Sender: TObject); var LocationManager: JLocationManager; LocationProviders: JList; GnssStatusCallbackClass: JGnssStatusCallbackClass; GnssStatusCallback: JGnssStatusCallback; i: Integer; begin try LocationManager := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.LOCATION_SERVICE) as JLocationManager; LocationProviders := LocationManager.getProviders(True); for i := 0 to LocationProviders.size - 1 do begin if (LocationProviders.get(i) as JString).equals(TJLocationManager.JavaClass.GPS_PROVIDER) then begin GnssStatusCallbackClass := TJavaGenericImport<JGnssStatusCallbackClass, JGnssStatusCallback>.JavaClass; GnssStatusCallback := GnssStatusCallbackClass.init(TAndroidHelper.Context, TMyGnssStatusCallbackDelegate.Create); Exit; end; end; except on E: Exception do begin Memo1.Lines.Add('Error checking GNSS status: ' + E.Message); end; end; end; end. Androidapi.JNI.GnssStatusCallback.zip
  14. Применено так, как вы предложили. В методе FormClose. В тестовом примере оказывается ThreadPoolStats.IdleWorkerThreadCount=3 и ThreadPoolStats.WorkerThreadCount=3 Условие не выполняется, программа закрывается с утечкой. Насколько я понял, ThreadPoolStats.IdleWorkerThreadCount хранит кол-во потоков, ожидающих завершения. Если, например, изменить условие на if ThreadPoolStats.IdleWorkerThreadCount>0 то приложение просто невозможно закрыть.
  15. Как применено? Может оно и не вызывается?
  16. Уважаемый Slym, к сожалению предложенный способ результата не дал. Если я правильно понял, условие ThreadPoolStats.IdleWorkerThreadCount<>ThreadPoolStats.WorkerThreadCount является признаком того, что не все таски завершены. При тестировании приложения это условие не выполняется (то есть все такси завершены?), управление передается деструктору главной формы приложения, в котором дается команда на удаление пользовательских объектов. Пользовательские объекты удаляются. Затем выдается сообщение об утечке памяти и приложение закрывается.
  17. Спасибо, попробую
  18. CanFocus := False помогает(объясняет) и 2024 году на Delphi 11.3 Aleksandria. Хорошо что в релизе ошибки не проявляется. В Delphi 12 пробовали?... Благодарю премного!
  19. Надо дождаться завершения тасков например так: procedure TmainForm.FormClose(Sender: TObject; var Action: TCloseAction); begin //wait all tasks finished var ThreadPoolStats:=TThreadPoolStats.Default; if ThreadPoolStats.IdleWorkerThreadCount<>ThreadPoolStats.WorkerThreadCount then begin Action:=TCloseAction.caNone; TThread.ForceQueue(nil, procedure begin Application.MainForm.Close; end,300); end; end;
  20. antigrav

    Утечка памяти

    Здравствуйте, коллеги. Пишу метод десериализации для считывания данных из файла и создания соответствующего объекта в памяти. Для того, чтобы пользователь не скучал, загружаю данные в отдельном потоке, а в главном запускаю TAniIndicator. Данные считываются, объект создается, AniIndicator работает. Но при попытке завершения приложения получаю утечку памяти (см. рис.). Пользовательские объекты я удаляю перед закрытием приложения, но в памяти остаются системные объекты, в том числе из библиотеки PPL. Сокращенный код метода загрузки данных ниже. С чем может быть связана утечка? Для детектирования утечек использую команду ReportMemoryLeaksOnShutdown := True. Если дополнительный поток не использую, утечек нет. procedure LoadProjectFromFile(AFileName: string); var fut: IFuture<TComponent>; cmp: TComponent; begin AniIndic.Enabled := True; AniIndic.Visible := True; fut := TTask.Future<TComponent>( function: TComponent begin Result := LoadFromFile(AFileName); end ); TTask.Run( procedure begin fut.Start; cmp := fut.Value; {$REGION 'После загрузки в главном потоке'} TThread.Synchronize(nil, procedure begin AniIndic.Enabled := False; AniIndic.Visible := False; if Assigned(cmp) then begin if cmp is TCAMProject then begin fProject := cmp as TCAMProject; // здесь всякие действия if Assigned(OnFinishedLoadProject) then begin OnFinishedLoadProject(nil); end; end end end ) {$ENDREGION} end ); end;
  21. krapotkin

    Ping в андроид

    Пинг это просто один из вариантов вызвать сервер и чтоб он ответил. Нас интересует сам факт. Иногда вообще факт работающего интернета. Поэтому если на той стороне есть веб-сервер, то ничем не хуже просто сделать на него get запрос var resp := http.get('https://google.com'); ответил - живой. не ответил - либо нет сети, либо сервера
  22. Razmir

    Ping в андроид

    А можно подробнее? в принципе мне не важно куда пинговать, главное чтобы пинг проверить..
  23. Супер!!! Спасибо! А можно пример в проекте? - не пойму как "прикрутить" вызов...
  24. Может кому надо Androidapi.JNI.GnssStatusCallback.rar
  25. вот официальный список https://docwiki.embarcadero.com/RADStudio/Alexandria/en/Android_Devices_Supported_for_Application_Development
  1. Загрузить ещё активность
×
×
  • Создать...