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

OnePeople

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

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

  • Посещение

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

    60

OnePeople стал победителем дня 28 сентября

OnePeople имел наиболее популярный контент!

6 Подписчиков

Посетители профиля

15 464 просмотра профиля
  1. Не делал не знаю, но с того что вы описываете, вам нужно ввести пароль для хранилища keystore.keystore т.е. когда вы увидите Enter password for store 'keystore.keystore' вам просто нужно ввести его и нажать enter, В данном случае у вас вводимые символы просто не отображаются, сделано так специально.
  2. Дело не в среде скорее всего, а в версии андроид, вам 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;
  3. Причем по логу (на всю ночь оставил) все нормально всю ночь работало в фоне и вылет только когда заново разблокируется устройство.
  4. Да CallInUIThread это уже не надо FLAG_TURN_SCREEN_ON это используется FLAG_SHOW_WHEN_LOCKED это устарело, но попробую Activity.setShowWhenLocked(boolean)
  5. Здравствуйте, форумчане. Есть большая проблема. У меня лаунчер для андроид магнитол, написанный на delphi 11. Все отлично работает, до ухода магнитолы в сон, логирование настроено, все уже в try except (log)end, плюс onExeption (log), но ошибок ни каких в логе нет просто при выходе из сна оно начинает грузится заново. Сделал wakeLock, проблема не ушла. Оптимизация батареи через powermanager также отключена. Куда копать?
  6. Через реестр ищите мониторы по пути Компьютер\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.
  7. Да конечно вы обновляете программу при старте программа проверяет билд(дату или любые данные которые позволяют узнать что база новее) сохраненный в настройках с текущим билдом(датой и т.д). По другому никак, так как установочный файл и установленная программа к друг другу не имеют ни какого отношения. Почему я писал что я проверяю по билду, мне кажется что так удобнее билд это 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);
  8. Все верно, но только если база обновится при установке новой версии на ту же самую ни чего страшного не произойдет, а вы будете уверены что база у вас в актуальном состоянии. Конечно если вы не обновляете свое приложение каждый час, тогда да будет запуск долгий каждый раз, а так раз в месяц на секунду запуск дольше, думаю пользователи это перенесут, ИМХО сугубо мое мнение.
  9. Я делаю так, сравниваю версию приложения (а именно билд), если версия новее, то обновляю асеты, если нет то нет. Можно сделать при обновлении асетов сохранять в настройки данные о базе и при обновлении сравнивать эти данные (например дату обновления базы, или версия базы) вариантов много.
  10. Тогда я бы на вашем месте интегрировал ml kit https://developers.google.com/ml-kit/vision/barcode-scanning/android?hl=ru#java Или есть платный уже готовый от winsoft
  11. Напишите разработчику и отправьте ему пример, вообще в версии 3.9.8 исправляли datamatrix.
  12. Ну это к Гуглу вопросы, у меня в приложении работает, как у вас на скрине. Смысл такой вы создаёте запрос на определенный вид геолокации для вашего приложения в ответ получаете задачу для задачи определяете слушатель отсутствия геолокации. В слушателе обрабатываете "исключение" и если доступа нет, то запускаете действие с ответом. И обрабатываете ответ, нажал ли пользователь "ок" или нажал "нет, спасибо".(Пример как в delphi startActivityWithResult)
  13. Плюс нужно подключить необходимые библиотеки и соответственно нужно описать недостающие интерфейсы java
×
×
  • Создать...