-
Постов
346 -
Зарегистрирован
-
Посещение
-
Победитель дней
60
OnePeople стал победителем дня 28 сентября
OnePeople имел наиболее популярный контент!
Посетители профиля
15 464 просмотра профиля
Достижения OnePeople
-
Letter отреагировал на ответ на вопрос: Создать подпись файла
-
Не делал не знаю, но с того что вы описываете, вам нужно ввести пароль для хранилища keystore.keystore т.е. когда вы увидите Enter password for store 'keystore.keystore' вам просто нужно ввести его и нажать enter, В данном случае у вас вводимые символы просто не отображаются, сделано так специально.
-
Letter отреагировал на ответ на вопрос: Разрешение на запись и чтение на Delphi 12.1
-
Дело не в среде скорее всего, а в версии андроид, вам 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;
-
Здравствуйте, форумчане. Есть большая проблема. У меня лаунчер для андроид магнитол, написанный на delphi 11. Все отлично работает, до ухода магнитолы в сон, логирование настроено, все уже в try except (log)end, плюс onExeption (log), но ошибок ни каких в логе нет просто при выходе из сна оно начинает грузится заново. Сделал wakeLock, проблема не ушла. Оптимизация батареи через powermanager также отключена. Куда копать?
-
Через реестр ищите мониторы по пути Компьютер\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.
-
Да конечно вы обновляете программу при старте программа проверяет билд(дату или любые данные которые позволяют узнать что база новее) сохраненный в настройках с текущим билдом(датой и т.д). По другому никак, так как установочный файл и установленная программа к друг другу не имеют ни какого отношения. Почему я писал что я проверяю по билду, мне кажется что так удобнее билд это 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);
-
Все верно, но только если база обновится при установке новой версии на ту же самую ни чего страшного не произойдет, а вы будете уверены что база у вас в актуальном состоянии. Конечно если вы не обновляете свое приложение каждый час, тогда да будет запуск долгий каждый раз, а так раз в месяц на секунду запуск дольше, думаю пользователи это перенесут, ИМХО сугубо мое мнение.
-
Я делаю так, сравниваю версию приложения (а именно билд), если версия новее, то обновляю асеты, если нет то нет. Можно сделать при обновлении асетов сохранять в настройки данные о базе и при обновлении сравнивать эти данные (например дату обновления базы, или версия базы) вариантов много.
-
Тогда я бы на вашем месте интегрировал ml kit https://developers.google.com/ml-kit/vision/barcode-scanning/android?hl=ru#java Или есть платный уже готовый от winsoft
-
Напишите разработчику и отправьте ему пример, вообще в версии 3.9.8 исправляли datamatrix.
-
Ну это к Гуглу вопросы, у меня в приложении работает, как у вас на скрине. Смысл такой вы создаёте запрос на определенный вид геолокации для вашего приложения в ответ получаете задачу для задачи определяете слушатель отсутствия геолокации. В слушателе обрабатываете "исключение" и если доступа нет, то запускаете действие с ответом. И обрабатываете ответ, нажал ли пользователь "ок" или нажал "нет, спасибо".(Пример как в delphi startActivityWithResult)
-
Hevard отреагировал на ответ на вопрос: Вызвать настройки GPS в Android