-
Постов
363 -
Зарегистрирован
-
Посещение
-
Победитель дней
64
Весь контент OnePeople
-
Есть ли горячая клавиша для перехода между парными операторами, например от repeat к until?
-
Ну так понятно это же код java, смотрите pas, я не проверял некогда Android.SensorListener.rar
- 47 ответов
-
- gps
- tlocationsensor
-
(и ещё 1 )
C тегом:
-
Ну так разницы ни какой 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); } Все очень просто
- 47 ответов
-
- gps
- tlocationsensor
-
(и ещё 1 )
C тегом:
-
В чем вопрос не понятно, вы же получаете в методе onLocationChanged location, там и берите что вам нужно направление, скорость, высоту и и.д.
- 47 ответов
-
- gps
- tlocationsensor
-
(и ещё 1 )
C тегом:
-
Вообще для 14 андроида не знаю, но для 15 описано новое поведение служб dataSync https://developer.android.com/develop/background-work/services/fgs/timeout?hl=ru И все время советуют перейти на WorkManager
-
А в манифесте объявлено разрешение для службы "android.permission.FOREGROUND_SERVICE_DATA_SYNC"?
-
Как переопределить метод Android приложения onPause?
-
Ручками надо транслировать API, причем это androidx поэтому вам необходимо добавить в проект библиотеку androidx.work
-
Да нет же. Для мобильных приложений есть библиотека alcinoe. Скоро там будет быстрый listbox и вообще будет ок. В исходниках вы можете посмотреть примеры реализаций множества api android, в том числе и запрос разрешений. Все будет работать очень быстро, красиво, и как рекомендует гугл. Также посмотрите на kastree там тоже много чего есть, вообще сейчас с андроид трудностей вообще у Делфи не каких, а то что встроенные компоненты Делфи глючат, то зачем их вообще использовать, если вам не нужна мультиплатформа. Любое апи переносится на Делфи за пару минут. Тут больше вопросов к самому андроида и их меняющемуся апи от версии к версии андроид, androidx библиотеки должны решать эти проблемы, но не всегда у них это получается.
-
Так вы делайте не через методы delphi, а через методы android и проблем не будет.
-
PermissionsService.RequestPermissions(AppPermissions); Да оно и не будет открываться на андроид 13 Вам ничего не мешает добавить описание этих переменных.
-
Думаю тут именно нужно сохранять свойства объектов отдельно и использовать json. Допустим у вас в layout находятся нужные вам объекты, вы проходитесь по ним циклом и для объектов tcontrol записываете расположение, дальше уже по типу объекта нужные вам данные, а при загрузке этого файла также через цикл загружаете по данным, и свойствам, допустим можете использовать tagString = кругприм и тогда присваивать ему в onClick нужный метод.
-
Первое про разрешения и деплоймент почитайте на сайте embarcadero. Второе вот в андроид точно в ини файл писать не стоит, особенно если какая нибудь настройка записывается при действии или таймере, если идёт запись настройки и случиться сбой и приложение экстренно закроется весь файл настроек сломается, используйте настройки андроид shared preference.
-
Не делал не знаю, но с того что вы описываете, вам нужно ввести пароль для хранилища keystore.keystore т.е. когда вы увидите Enter password for store 'keystore.keystore' вам просто нужно ввести его и нажать enter, В данном случае у вас вводимые символы просто не отображаются, сделано так специально.
-
Дело не в среде скорее всего, а в версии андроид, вам 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);