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

OnePeople

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

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

  • Посещение

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

    64

Весь контент OnePeople

  1. Информации мало, вообще к установке имеет отношение только файл манифеста смотрите ошибки там.
  2. Есть ли горячая клавиша для перехода между парными операторами, например от repeat к until?
  3. Ну так понятно это же код java, смотрите pas, я не проверял некогда Android.SensorListener.rar
  4. Ну так разницы ни какой onLocationChanged срабатывает при изменении локации, а у вас просто одиночный запрос локации. Для написания компаса вам нужно просто описать 2 слушателя по аналогии с LocationListener sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); magnetometer = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME); sensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_GAME); } Все очень просто
  5. В чем вопрос не понятно, вы же получаете в методе onLocationChanged location, там и берите что вам нужно направление, скорость, высоту и и.д.
  6. Вообще для 14 андроида не знаю, но для 15 описано новое поведение служб dataSync https://developer.android.com/develop/background-work/services/fgs/timeout?hl=ru И все время советуют перейти на WorkManager
  7. А в манифесте объявлено разрешение для службы "android.permission.FOREGROUND_SERVICE_DATA_SYNC"?
  8. OnePeople

    onPause

    Как переопределить метод Android приложения onPause?
  9. Ручками надо транслировать API, причем это androidx поэтому вам необходимо добавить в проект библиотеку androidx.work
  10. Может у вас конфликт с предыдущей версией, удалите старую версию и попробуйте установить заново?
  11. Да нет же. Для мобильных приложений есть библиотека alcinoe. Скоро там будет быстрый listbox и вообще будет ок. В исходниках вы можете посмотреть примеры реализаций множества api android, в том числе и запрос разрешений. Все будет работать очень быстро, красиво, и как рекомендует гугл. Также посмотрите на kastree там тоже много чего есть, вообще сейчас с андроид трудностей вообще у Делфи не каких, а то что встроенные компоненты Делфи глючат, то зачем их вообще использовать, если вам не нужна мультиплатформа. Любое апи переносится на Делфи за пару минут. Тут больше вопросов к самому андроида и их меняющемуся апи от версии к версии андроид, androidx библиотеки должны решать эти проблемы, но не всегда у них это получается.
  12. Так вы делайте не через методы delphi, а через методы android и проблем не будет.
  13. PermissionsService.RequestPermissions(AppPermissions); Да оно и не будет открываться на андроид 13 Вам ничего не мешает добавить описание этих переменных.
  14. Думаю тут именно нужно сохранять свойства объектов отдельно и использовать json. Допустим у вас в layout находятся нужные вам объекты, вы проходитесь по ним циклом и для объектов tcontrol записываете расположение, дальше уже по типу объекта нужные вам данные, а при загрузке этого файла также через цикл загружаете по данным, и свойствам, допустим можете использовать tagString = кругприм и тогда присваивать ему в onClick нужный метод.
  15. Первое про разрешения и деплоймент почитайте на сайте embarcadero. Второе вот в андроид точно в ини файл писать не стоит, особенно если какая нибудь настройка записывается при действии или таймере, если идёт запись настройки и случиться сбой и приложение экстренно закроется весь файл настроек сломается, используйте настройки андроид shared preference.
  16. Не делал не знаю, но с того что вы описываете, вам нужно ввести пароль для хранилища keystore.keystore т.е. когда вы увидите Enter password for store 'keystore.keystore' вам просто нужно ввести его и нажать enter, В данном случае у вас вводимые символы просто не отображаются, сделано так специально.
  17. Дело не в среде скорее всего, а в версии андроид, вам if TJBuild_VERSION.JavaClass.SDK_INT >= 30 then begin if TJEnvironment.JavaClass.isExternalStorageManager = false then begin Intent := TJIntent.Create; Intent:= TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); intent.setData(TJnet_Uri.JavaClass.parse(StringToJString('package:').concat(TAndroidHelper.Context.getPackageName))); if intent.resolveActivity(TAndroidHelper.Context.getPackageManager) <> nil then TAndroidHelper.Context.startActivity(Intent); end; end; if TJBuild_VERSION.JavaClass.SDK_INT <= 29 then begin FPermissionReadExternalStorage := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE); FPermissionWriteExternalStorage := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE); AppPermissions := AppPermissions + [FPermissionReadExternalStorage] + [FPermissionWriteExternalStorage]; end;
  18. Проверяйте разрешения на доступ к файловой системе
  19. Причем по логу (на всю ночь оставил) все нормально всю ночь работало в фоне и вылет только когда заново разблокируется устройство.
  20. Да CallInUIThread это уже не надо FLAG_TURN_SCREEN_ON это используется FLAG_SHOW_WHEN_LOCKED это устарело, но попробую Activity.setShowWhenLocked(boolean)
  21. Здравствуйте, форумчане. Есть большая проблема. У меня лаунчер для андроид магнитол, написанный на delphi 11. Все отлично работает, до ухода магнитолы в сон, логирование настроено, все уже в try except (log)end, плюс onExeption (log), но ошибок ни каких в логе нет просто при выходе из сна оно начинает грузится заново. Сделал wakeLock, проблема не ушла. Оптимизация батареи через powermanager также отключена. Куда копать?
  22. Через реестр ищите мониторы по пути Компьютер\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY Далее ищите в мониторе EDID Далее парсите EDID structure, version 1.4 https://en.wikipedia.org/wiki/Extended_Display_Identification_Data unit Unit3; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts, FMX.ListBox, FMX.Controls.Presentation, FMX.StdCtrls, Winapi.Windows, Registry; type TForm3 = class(TForm) lst1: TListBox; btn1: TButton; function GetAllMonitorName : TStringList; procedure btn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form3: TForm3; implementation {$R *.fmx} procedure TForm3.btn1Click(Sender: TObject); var monitors: TStringList; I: Integer; begin monitors := GetAllMonitorName; lst1.BeginUpdate; for I := 0 to monitors.Count - 1 do begin lst1.Items.Add(monitors.Strings[i]); end; lst1.EndUpdate; end; function TForm3.GetAllMonitorName: TStringList; const Key = '\SYSTEM\CurrentControlSet\Enum\DISPLAY\'; type IBMString = type Ansistring(1253); var Registry: TRegistry; H, i, j, k : Integer; MonitorName : IBMString; EDID : array [0 .. 127] of Byte; subKeysNames, subKeys : TStringList; begin Result := TStringList.Create; subKeys := TStringList.Create; subKeysNames := TStringList.Create; Registry := TRegistry.Create(KEY_READ); Registry.RootKey := HKEY_LOCAL_MACHINE; try try Registry.OpenKeyReadOnly(Key); Registry.GetKeyNames(subKeysNames); finally Registry.CloseKey; end; for h := 0 to subKeysNames.Count - 1 do begin try Registry.OpenKeyReadOnly(Key + subKeysNames[h]); Registry.GetKeyNames(subKeys); finally Registry.CloseKey; end; for i := 0 to subKeys.Count - 1 do begin try if registry.OpenKeyReadOnly(Key + subKeysNames[h] + '\' + subKeys[i]) then begin if registry.OpenKeyReadOnly(Key + subKeysNames[h] + '\' + subKeys[i] + '\' + 'Device Parameters') then begin Registry.ReadBinaryData('EDID', EDID, 128); Registry.CloseKey; end; MonitorName := ''; for j := 0 to 3 do begin if (EDID[54 + 18 * j] = 0) and (EDID[55 + 18 * j] = 0) and (EDID[56 + 18 * j] = 0) and (EDID[57 + 18 * j] = $FC) and (EDID[58 + 18 * j] = 0) then begin k := 0; while (EDID[59 + 18 * j + k] <> $A) and (k < 13) do Inc(k); SetString(MonitorName, PAnsiChar(@EDID[59 + 18 * j]), k); Break; end; end; Result.Add(MonitorName); end; finally Registry.CloseKey; end; end; end; finally subKeys.Free; Registry.Free; subKeysNames.Free; end; end; end.
  23. Да конечно вы обновляете программу при старте программа проверяет билд(дату или любые данные которые позволяют узнать что база новее) сохраненный в настройках с текущим билдом(датой и т.д). По другому никак, так как установочный файл и установленная программа к друг другу не имеют ни какого отношения. Почему я писал что я проверяю по билду, мне кажется что так удобнее билд это Integer и его проще сравнивать и узнать легко PackageManager := TAndroidHelper.context.getPackageManager; PackageManager.getPackageInfo(TAndroidHelper.context.getPackageName, 0).versionCode; А дальше смотрим билд в настройках SPStart := TAndroidHelper.Context.getSharedPreferences(OptionsFile, TJContext.JavaClass.MODE_PRIVATE); buildApkInSet := SPStart.getInt(StringToJString('apkBuild'), 0);
×
×
  • Создать...