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

Pax Beach

Пользователи
  • Постов

    414
  • Зарегистрирован

  • Посещение

  • Победитель дней

    12

Весь контент Pax Beach

  1. Вот по шагам пройди школу Андроид, не знаю, дают еще сертификаты. Поставь AS, делай примеры. Найди на трекере курсы UDEMY — очень качественные.
  2. Проблема решалась очень просто. Оказывается нужно при вызове startActivityForResult использовать requestCode отличный от занятых в FMX, я использую REQUEST_IMAGE_CAPTURE = 1001 тогда обработчик сообщений FMX поймет, что сообщение не для него и передаст его в систему.
  3. В Android 6 на Berlin 10.1.1 перестала работать стандартная функция TakePhotoFromCameraAction. Иногда работает, иногда нет. Поэтому я решил написать нативную замену этой функции. За основу взят пример с портала разработчиков Android. Мой пример про видео на базе отправки Intetn смартфону и получение результата в виде другого Intent, отлично работает. Но для фотографий этот пример сыпется, после выполнения фотографирования система возвращается в мое приложение и оно вылетает с ошибкой: Если заглянуть в исходнки, там все обвязано сообщениями в лог монитора. Последнее сообщение «+ Intent is sent». Помогите пожалуйста разобраться, в чем может быть проблема? PhotoIntent.zip
  4. Вот пример, преноси в сервис и пиши в фоне.
  5. Я использую принудительную ориентацию экрана на Android устройстве. Что это означает? Когда открывается приложение, экран переворачивается в то положение, которое я устанавливаю по умолчанию, или которое было установлено в настройках приложения (состояние читается при запуске приложения). Приведу пример кода, как я его написал. Здесь что-то лишнее, что-то может стоит доработать. Есть две проблемы в примере: 1. Чтобы изменить ориентацию экрана, приходится закрывать (уничтожать) приложение, а потом открывать заново. 2. Когда стоит режим ландшафт, то срабатывает автоматический переворот экрана по сенсору, когда поворачиваешь экран на 180 градусов. А когда стоит режим портрет, автоматически экран не переворачивается. В настройках проекта так: В Object inspector для главной формы так: В модуле проекта вот так: begin Application.Initialize; TAndroidHelper.Activity.getWindow.addFlags (TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON); Application.FormFactor.Orientations := [TFormOrientation.Portrait, TFormOrientation.InvertedPortrait, TFormOrientation.Landscape, TFormOrientation.InvertedLandscape]; Application.CreateForm(TDM, DM); Application.CreateForm(TfmMain, fmMain); VKAutoShowMode := TVKAutoShowMode.Always; Application.Run; end. В модуле главной формы: procedure TfmMain.FormShow(Sender: TObject); begin if DM.setOrientation(TAndroidHelper.Activity) then Invalidate; end; В дата-модуле вот так: function TDM.setOrientation(Activity: JActivity): boolean; var orient: Integer; begin result := False; if DM.GetSettingsBoolean('IsOrientationLandshaft', true) then orient := TJActivityInfo.JavaClass.SCREEN_ORIENTATION_SENSOR_LANDSCAPE else orient := TJActivityInfo.JavaClass.SCREEN_ORIENTATION_SENSOR_PORTRAIT; try if Activity.getRequestedOrientation <> orient then begin Activity.setRequestedOrientation(orient); result := true; end; except result := False; end; end;
  6. Ребята, я до этого отписался, что перед НГ нет ни одного свободного дня, и мне придется отложить встречу с вами на другой какой-то раз (
  7. Товарищи, следующая неделя авралы сплошные, и эта тоже ( Мысленно с вами.
  8. Если бы мы здесь писали в Android Studio или любой другой IDE на JAVA для Android, можно было бы через Android менеджер GATT устройств обратиться к JAVA интерфейсу конкретного устройства BLE и вызвать нужный нам метод. Но ты ставишь задачу, сделать вызов, работая с устройствами через компонент TBluetoothLE. В Delphi работа с модулем Androidapi.JNI.Bluetooth.pas не явная, этот файл всего лишь обертка для внешней Android библиотеки, вызовы к ее методам осуществляются через патч, работу внесенных изменений можно проверить в процессе отладки на устройстве. Участники написали, что нужно сделать, осталось только протестировать, делается ли вызов метода requestMTU(), проходит ли согласование корректно. Может быть у тебя метод вызывается, но твое BLE не дает согласие на изменение размера пакета. Хорошая мысль, сделать параметр "MTU_Size" в компоненте, чтобы компонент на любой платформе при сопряжении с устройствами выполнял принудительное согласование MTU. Для этого нужно написать разработчикам, как сказал ранее ZuBy.
  9. Не уверен, что для кого-то здесь дело в этом. Просто мы пытаемся разобраться с FMX, и так как устройство только у тебя, а обратная связь скупая, то дальше только пустая трата времени. Надо искать человека, у которого есть подходящее устройство БЛЕ и желание копаться с MTU.
  10. 1. Сейчас не могу найти ссылку, но сам читал, что проблема с согласованием MTU есть только у Android. iOS делает согласование автоматически, Windows начинает согласование с половины октет — 500+ байт. Мне не на чем это проверить, нет под рукой BLE (маячки почему-то компонентом не распознаются как BLE), так что этот момент проверяй сам. 2. Тебе привели правильный код изменения компоненты. Неумение провести своими руками простую отладку сильно усложняет дело, трудно тебе помочь, когда ты не даешь понятную обратную связь. Поэтому, как сказал Zuby, либо ждать от Идеры изменений в следующем релизе, либо платное задание разместить где-нить.
  11. А точно используется измененный модуль, а не системный? DCU файл в каталоге проекта создался? В режиме отладки в этот метод вообще не заходит отладчик?
  12. Я бы согласование все-таки делал в отдельном потоке и проверил на наличие менеджера, а так отлично, должно заработать. Вот что у меня получилось: constructor TAndroidBluetoothGattListener.Create(const ALEDevice : TAndroidBluetoothLEDevice); begin inherited Create; FGatt := ALEDevice; // ADDED to increase MTU size - BEGIN if FGatt <> nil then if (FGatt.FConnectionStatus = TBluetoothDeviceState.Connected) then TThread.CreateAnonymousThread( procedure var MTU: Integer; status: Boolean; begin MTU := 525; while MTU > 100 do begin TThread.Synchronize(nil, procedure begin status := FGatt.FJGatt.requestMtu(MTU); end); if not status then begin dec(MTU, 100); end else begin // FRememberMTUasInteger := MTU; // I think, you need to implement this filed in private section to use in a furure break; // all good bro, it needs to exit from the thread end; end; end).Start; // ADDED to increase MTU size - END end; На счет необходимости синхронизации не уверен, надо пробовать.
  13. У меня есть джойстик, часы, пара смартфонов, ноут, колонка — ничего из этого видимо не является Smart Device, компонент с этим моим барахлом не коннектится. Не знаю, как еще проверить компонент. Может быть BLE можно эмулировать на ноуте?
  14. Не знаю почему, но у меня компонент BluetoothLE вообще не находит ни одно устройство, ни на ноуте, ни на телефоне. Трудно что-то тестировать без этого.
  15. Можно. Но это то же самое, что я написал, только в промышленном масштабе. Для Андроида будет вызов этого метода, а для остальных платформ будут заглушки, потому что мы пока не знаем как в других API это реализовано.
  16. Не верь никому, только мне одному! Интентом здесь дело не решишь ни как. Каждый раз, когда коннектится какое-то BLE к твоей мобиле, ты запрашиваешь у него нетрадиционный MTU. Это делается, как я описал. Ну или читай developer.*, там тебя научат, но примерно так же, как я написал )
  17. Товарищи, выручайте человека! Совсем нет времени сейчас на написание кода. Но вот что я накопал: // в событии компонента TBluetoothLE onConnectDevice получаем сущность устройства BLE procedure TForm1.BluetoothLE1ConnectedDevice(const Sender: TObject; const ADevice: TBluetoothLEDevice); begin // здесь создаем syncronise нить с запросом MTU, до пяти раз долбим устройство //параметр ADevice - TBluetoothLEDevice → TAndroidBluetoothLEDevice → JBluetoothDevice (Androidapi.JNI.Bluetooth.pas) // И так, добрались в JNI, что дальше? // Наверное каким-то образом через объект TJBluetoothDevice нужно получить доступ к интерфейсу JBluetoothGatt // Я вижу возможность через метод connectGatt(context: JContext; autoConnect: Boolean; callback: JBluetoothGattCallback): JBluetoothGatt; cdecl; // понятно, что предварительно мы должны иметь объект класса TJBluetoothGattCallback, наверное вызвав метод init() // после получения доступа к объекту TJBluetoothGatt вызываем в нити метод requestMtu() end;
  18. Я что-то не уловил, а ее в какой момент надо вызывать?
  19. Конкретнее пожалуйста, что нужно получить?
  20. Можно, предварительно подключив модуль Androidapi.JNI.Bluetooth.pas, и инициализировав объект класа TJBluetoothGatt. UPD: в Berlin точно
  21. Java2OP.exe -jar lib_fileexplorer.jar -unit myout.pas Матчасть здеся.
  22. Это самый известный мне пример. Как это работает на телефонах.
  23. Просто у Андроида отличные документированные библиотеки, с которыми мы можем просто работать через обертки. Про яблоки не знаю, но надеюсь так же. Интерфейсы для работы с бле есть. Никакие визуальные компоненты особо не нужны, тем более что ничего особенного в нем не реализовано, просто инициализация и назначение слушателя.
  24. Неожиданные выводы. А тебе под какую платформу нужно?
×
×
  • Создать...