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

mazayhin

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

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

  • Посещение

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

    19

Сообщения, опубликованные mazayhin

  1. 9 минут назад, Bob32 сказал:

     а как этот remapCoordinateSystem вызывать?

    сорри - это для вас "простая обертка" - я на Дельфи 2.0 15 лет назад программировал.

    Все эти "андроидовские штучки" не знаю. если книжку или ссылку путевую про это посоветуете - буду также крайне признателен.

    После получения матрицы, определяете поворот устройства через IFMXScreenService.GetScreenOrientation к примеру, или опять же, напрямую через api.

    Получаете углы (var x, y: integer; OutMatrix: TJavaArray<single>(16)):

    0: ничего не делаем, в т.ч. ремап

    90: X := TJSensorManager.JavaClass.AXIS_Y; Y := TJSensorManager.JavaClass.AXIS_MINUS_X;

    180: X := TJSensorManager.JavaClass.AXIS_X; Y := TJSensorManager.JavaClass.AXIS_MINUS_Y;

    270: X := TJSensorManager.JavaClass.AXIS_MINUS_Y; Y := TJSensorManager.JavaClass.AXIS_X;

    TJSensorManager.JavaClass.remapCoordinateSystem(FMatrix(изначальная матрица), x, y, OutMatrix)

    TJSensorManager.JavaClass.getOrientation(OutMatrix, FOrientation)

  2. Только что, Bob32 сказал:

    конечно выложу, если ума хватит ))))

    откомпилировал Ваше приложение = все работает, получаем данные акселерометра, магнитного датчика и углы (их я перевел в градусы для большей наглядности).

    но тут наступает вот какой момент (возможно, Вы именно о нем писали, когда упоминали об ориентации экрана)…

    когда телефон горизонтально (смотришь на экран сверху) - четко видно, что в первом углу = Азимут на север, который меняется от -180 до +180. 0 - север.

    когда поднимаешь телефон вертикально (смотришь на телефон сбоку) - этот угол  "едет" - те он начинает показывать что-то, но не азимут на север.

    предыдущая статья на хабре этого автора (я тоже читал обе эти статьи когда пытался разобраться сам), где он использует устаревший метод и потом выкладывает апк-шку - так вот в этой предыдущей версии (в ее апк-шке) углы определяются исключительно верно- поднимай телефон, крути, а азимут на север показывается четко. аналогично по двум другим углам. тем этот метод меня и зацепил....

    Вы об этом говорили, когда писали про "ориентацию экрана" или имели ввиду что-то другое?

    если что- мой номер +7 9162070089

    Да, все верно, именно об этом и писал.

  3. 2 минуты назад, Bob32 сказал:

    Спасибо огромное! Сейчас буду изучать.

    если что - можно будет Вам голосом вопрос задать?

    Наверное можно, если смогу - подскажу.

    Ну и по итогам, хорошо, если б вы все привели это в нормальный вид, и выложили готовое решение на форум.

  4. 13 часов назад, Bob32 сказал:

    сложновато это пока для меня. подожду завтрашнего дня )

    спасибо огромное!!!!!

    Все на скорую руку. Никаких проверок не делал. Вообще, за основу брал статью с хабра https://habr.com/ru/post/137820/

    Так же учтите, что необходимо проверить наличие магнитного датчика, т.к. без него getRotationMatrix всегда будет возвращать false, т.о. не получится определить положение устройства. Так же, еще, getOrientation вернет неправильные значения при повороте телефона, для этого надо определять текущую ориентацию экрана, и на основании этого делать remapCoordinateSystem, и только после этого уже определять положение.

    Смотрите, принцип понятен.

    Обертки взял от FMXExpress, немного подчистил, что бы не тянуть лишнего.

    Если будете брать сами, то обратите внимание:

    android.hardware.SensorManager:

    надо изменить JavaSignature на [JavaSignature('android/hardware/SensorManager')] для интерфейса JSensorManager (убрать $ и что после него, иначе, EJNIFatal)

    android.hardware.SensorEventListener:

    неправильно унаследованы интерфейсы (от JObject), а так как SensorEventListener это интерфейс, наследуемся от IJavaClass и IJavaInstance соответственно.

     

    SensorManager.zip

  5. 15 минут назад, Bob32 сказал:

    а как это сделать? Подскажете?

    Да, я видел на примере других приложений, написанных под андроид-студио, что getRotationMantrix + getOrientation дает необходимый эффект. но как их вызывать из Дельфи?

    я в прошлом был Дельфи-программист (лет 10 назад). а сейчас FMX и фич Андроида не знаю ( вот, осваиваю методом проб и ошибок. 

     

    Не успел сегодня.

    В общем, необходимо создать обертку для андроидовского system.hardware.SensorManager. и через нее уже работать.

    Получить интерфейс JSensorManager, вызвать registerListner для обоих сенсоров (листнер надо описать как клас ... = class (IJavaLocsl, JSensorEventListner), вроде так, пишу с телефона), его процедура по событию системы и будет вызываться. Ну а там, собственно уже, TJavaSensorManager.JavaClass.getRotationMatrix(R, nil, A, G)

    .getOrientation(R, O)

    Все переменные это TJavaArray<single>, размер у R: 16, остальные 3

    В общем, работы совсем ничего. Хотите-попробуйте посмотреть и разобраться, ну или завтра будет пример с простейшей оберткой, на нем и посмотрите.

  6. В 05.03.2019 в 01:42, Bob32 сказал:

    плохо. это видно при отрисовке компонентов дополненной реальности, который я рисую. они скачут, нет плавности.

    здесь именно задача на сглаживание этих показателей. но не средним арифметическим а каким нить фильтром, например Калмана.

    Просто - это изобретение велосипеда. методы getrotationmatrix и getorientation из Андроид Студио делают нечто подобное в "стандартной комплектации", без самописных огородов.

    Может в Дельфи есть что-то подобное..... или какой-то простой воркэраунд.

    А в чем проблема использовать getOrientationMatrix SensorManager'a? Обертки есть от FMXExpress к примеру, или самому можно перевести.

    Может если время сегодня хватит - набросаю проект и скину

  7. 8 часов назад, qubasesx сказал:

    Вы имеете ввиду что единственный вариант это сделать - через значение, которое передавать через текстовый файл например, в в основной форме по таймеру опрашивать значение какой-то строки файла?

    Описать BroadcastReceiver в приложении, а из сервиса слать сообщение (интент) с необходимыми данными.

    На форуме есть пример даже с сервисом 

     

  8. 23 минуты назад, Alexander Samosyuk сказал:

    Помогите кто чем может! Использую XE8 , и не могу найти в нем Android Service. Устанавливал и XE4 и XE5 (лицензию), но ни в одной версии Service нету!((

    Сервисы появились, если не изменяет память, с Сиэтла..

  9. 5 часов назад, MrAnderson сказал:

    Можно по подробнее??

    
    TAndroidHelper.Activity.requestPermissions(
                CreateJavaStringArray([PERMISSION_FILE_READ, PERMISSION_FILE_WRITE]),
                BUTTON_FILE
                );

    В этом месте у меня AV выскакивает.

    Delphi XE 10.2 Tokyo

    Еще раз ссылку на KastriFree дать? 

  10. В 07.11.2018 в 14:14, d7d1cd сказал:

    Прошу прощения за поспешный вопрос.

    После прочтения этого топика и нескольких других, у меня возник вопрос: нельзя ли осуществить работу с последовательным портом не используя код на Java? Так как C++Builder предоставляет несколько стандартных модулей для работы с Android API, стал пытаться. За основу взял известный код на гитхабе.

    Решил начать с поиска всех подключенных к USB устройств. В файле UsbSerialProber.java из вышеуказанной библиотеки, код которого выполняет поиск устройств, подключены 2 модуля:

    
    import android.hardware.usb.UsbDevice;
    import android.hardware.usb.UsbManager;

    В C++Builder подключил файл Androidapi.Hardware.hpp, так как он более всего подходит по названию к подключаемым модулям в Java коде. И, собственно, на этом все. В этом файле  я не нашел никакого упоминания о USB и, тем более, о UsbDevice и UsbManager. Видимо, надо подключать файлы Android.Hardware.Usb.UsbDevice и Android.Hardware.Usb.UsbManager, но их нет в C++Builder. Наверное, это означает, что необходимо, все таки, писать код на Java и создавать обертку...

    Но все же, думаю лучше, скомпилировать JAR и к нему уже делать обертку. Т.к. в противном случае, придется с собой очень много чего тащить в проект (java.*, javax.* и прочие, смотрите, сколько там зависимостей), что можно сказать, равнозначно почти собирать в студии половину android-api

  11. 4 часа назад, d7d1cd сказал:

    Прошу прощения за поспешный вопрос.

    После прочтения этого топика и нескольких других, у меня возник вопрос: нельзя ли осуществить работу с последовательным портом не используя код на Java? Так как C++Builder предоставляет несколько стандартных модулей для работы с Android API, стал пытаться. За основу взял известный код на гитхабе.

    Решил начать с поиска всех подключенных к USB устройств. В файле UsbSerialProber.java из вышеуказанной библиотеки, код которого выполняет поиск устройств, подключены 2 модуля:

    
    import android.hardware.usb.UsbDevice;
    import android.hardware.usb.UsbManager;

    В C++Builder подключил файл Androidapi.Hardware.hpp, так как он более всего подходит по названию к подключаемым модулям в Java коде. И, собственно, на этом все. В этом файле  я не нашел никакого упоминания о USB и, тем более, о UsbDevice и UsbManager. Видимо, надо подключать файлы Android.Hardware.Usb.UsbDevice и Android.Hardware.Usb.UsbManager, но их нет в C++Builder. Наверное, это означает, что необходимо, все таки, писать код на Java и создавать обертку...

    Можно создать обертку для java-классов, которые есть в исходниках Android с помощью Java2OP, или же руками, посмотрев как раз исходники.

    Исходники %sdk_path%\sources\android-nn\android\hardware\usb

    android-nn - версия API

    И уже эти файлы подключать.

    Либо взять готовые от FMXExpress

  12. 19 часов назад, d7d1cd сказал:

    Уважаемые, прокомментируйте ход моих мыслей, а то есть задача реализовать работу с последовательным портом в андроиде. И пока не знаю, то ли писать Java код и обертку для него, то ли можно осуществить задуманное используя стандартные модули jar и заголовочные hpp  в C++Builder. 

    Можно из API портировать то что нужно (написать обертку) для работы с USB.

    Либо, самый лучший вариант, использовать https://github.com/mik3y/usb-serial-for-android

    Здесь вся низкая работа с USB уже проделана, как пишет автор, поддерживает много чего, но не трудно добавить в device_filter свои VID&PID. Да, в этом варианте придется подключать jar и делать для него обертку

  13. 14 часов назад, MrAnderson сказал:

    Вы были правы почему-то в настройках разрешений телефона стоял запрет на камеру хотя я его не ставил.

    Потому что API-Level 26 он будет стоять автоматически. Как впрочем и практически все остальные, запрошенные в манифесте. Так же, не плохо было бы добавить в манифест

    <uses-feature android:name="android.hardware.camera" />

    Начиная с 26 необходимо разрешения, помимо указания в манифесте, должны явно запрашиваться у пользователя.

    Почитайте https://developer.android.com/guide/topics/permissions/overview

    Ну а для Delphi подключайте KastiFree https://github.com/DelphiWorlds/KastriFree

    Там есть пример использования https://github.com/DelphiWorlds/KastriFree/tree/master/Demos/AndroidDangerousPermissions

    и в добавок https://github.com/DelphiWorlds/KastriFree/tree/master/Demos/AndroidAPI26 тут как раз работа с камерой

  14. 3 часа назад, unlimuser сказал:

    Лежит, и это не решает проблему стертертопика: [FireDAC][stan][Def]-254. Definition [lbase] is not found in [].

    Ну скорее всего у себя вы указали в коннекшене символическое имя для подключения, оно сохраняется в FDConnectionDefs.ini (вроде правильно), а у пользователя его нет. 

    Задайте параметры подключения вручную, явно

  15. 13 часов назад, x11 сказал:

    Разницы между START_STICKY  и START_REDELIVER_INTENT для меня нет. 

    Мне главное, чтобы при (пере)создании службы, был создан и BroadcastReceiver,который будет ждать вызова.
     

    
    procedure TDMSrv.AndroidServiceCreate(Sender: TObject);
    begin
      CreateBroadcastReceiver;
    end;
    
    procedure TDMSrv.CreateBroadcastReceiver;
    begin
      if not assigned(fBroadcastReceiver) then
      begin
        fBroadcastReceiver := TCSBroadcastReceiver.Create(nil);
        Log('not assigned BroadcastReceiver, creating: ' + fBroadcastReceiver.ToString);
      end;
    
      fBroadcastReceiver.OnReceive := BroadcastReceiverOnReceive;
      fBroadcastReceiver.Clear;// Items.Clear;
    
      fBroadcastReceiver.RegisterReceiver;
      fBroadcastReceiver.Add(PHONE_STATE);
      fBroadcastReceiver.Add(NEW_OUTGOING_CALL);
    
      Log('CreateBroadcastReceiver');
    end;

     

    А, ну если в StartCommand (как и закомментировано) не по экшену StartService происходит создание то да.

  16. Не надо использовать START_STICKY если экшен в интенте был не пустой, т.к. при выгрузке службы и повторной попытке ее запуска системой (мы ж отметили что служба очень важная), придет пустой экшен.

    Стартуйте с START_REDELIVER_INTENT, что бы система отправила тот же интент, с которым служба запускалась до выгрузки.

    Цитата

    к сожалению примеров, информации и справки очень мало, а сообщество FMX всё ещё не очень большое

    Ну наверное в справке к FMX и не должно расписываться взаимодействие со всеми API целевых платформ. В качестве примера и для понимания принципов, как работать с ними, можно просто открыть исходники и сопоставить с доками того же гугла

  17. 8 часов назад, Dev сказал:

    Спасибо!

    И отдельное Спасибо Андрею Ефимову!

    получилось через AlarmManager

    не могу только допетрить как отменить задание по этому методу, если вдруг будет нужно для других идей

    
    procedure TForm2.Button1Click(Sender: TObject);
    var
      Intent: JIntent;
      PendingIntent: JPendingIntent;
    begin
      // Создаём Интент
      Intent := TJIntent.Create;
      Intent.setClassName(TAndroidHelper.Context, StringToJString('com.TestReceiver.AlarmReceiver'));
    
      // Оборачиваем Интент в PendingIntent
      PendingIntent := TJPendingIntent.JavaClass.getBroadcast(TAndroidHelper.Context, 1, Intent, 0);
    
      // Устанавливаем оповещение
      TAndroidHelper.AlarmManager.&set(TJAlarmManager.JavaClass.RTC_WAKEUP, getTimeAfterInSecs(30),
        PendingIntent);
    end;

     

    есть ссылка в статье описание этого метода http://developer.android.com/intl/ru/reference/android/app/PendingIntent.html 

    только мне там мало что понятно, если кто знает помогите примером как правильно удалить невыполненное задание 

    Вот здесь, когда оборачиваете в PendingIntent, присваиваете ему уникальный номер (в примере выше это 1), этот номер где-то храните.

    PendingIntent := TJPendingIntent.JavaClass.getBroadcast
          (TAndroidHelper.Context, _ТУТ НОМЕР_, intent, 0);

    Потом, что бы отменить, создаете идентичный PendingIntent, с номером, с которым запускали, и

    TAndroidHelper.AlarmManager.cancel(PendingIntent);

     

  18. Достойно сделано!

    Только есть пара моментов на моем телефоне (Honor 5X):

    - значок со сплеша немного "наползает" за статусбар

    - некорректно браузер отрабатывает интент на запуск навигатора, сам яндекс.навигатор установлен

    - при тапе на иконку, заполняется только часть всего контура (но может это так и надо)

     

     

    device-2018-04-10-152241.png

    device-2018-04-10-152151.png

    device-2018-04-10-153312.png

  19. 9 часов назад, ivyl сказал:

    1. Проблема кодировки. Пересохранил в UTF и заработало.

    2. Огнеобезьяна уверенно НЕ деплоит файлы, названные кириллическими символами (не переваривает "Remote name" кириллицей). Это такая "фича"?

    Если говорить относительно ресурсов, то сам Android дает указать имя только латиницей в нижнем регистре. 

    Возможно, это работает и для активов

  20. Поставщик SDK передал вообще jar - файл?

    Что в этих исходниках? Примеры работы, или исходники их SDK?

    Если исходники - то вообще все странно становится. Нельзя так. На то они и проходят сертификацию своего решения, что бы быть уверенным, что оно соответствует стандарту, и данные карты никуда не утекут, их никто у себя (как в случае с вашим прежним решением).

    Работать то так очень рискованно и для клиента (вас) и для шлюза. МПС, не факт, что с вами разбираться будут, пойдут к вышестоящему эквайеру, а тот, к вам. А штрафы, на минутку, у MC не шуточные - от 15 000 евро, вроде, за нарушение

  21. 43 минуты назад, Edward Tarasov сказал:

    java.util.zip.ZipException: error in opening zip file

    Вот он и пишет, что то, что ему туда суете, не является zip-архивом. jar - это и есть архив со скомпилированными классами (.java .class) и + еще немного.

    Не путайте исходники и по-сути исполняемый файл

  22. 9 минут назад, Edward Tarasov сказал:

    Никогда не бывает чтобы все вот так просто заработало((( что это такое и почемууууу

    12333.png

    Ну а лог то что пишет?

    Вот хелп например пишет, что

     Generate all classes from java source code, to specified unit
      Java2OP -source myproject/src -unit Androidapi.JNI.CustomName

    Если это все-таки jar, то надо при вызове -jar [].java дописать .jar?

     

  23. И прави

    5 часов назад, Edward Tarasov сказал:

    Тут проблема с самим эквайрингом... он не соглашается со мной работать по этой схеме, если у меня нет самого интернет магазина, а для мобильного приложения предлагают использовать их SDK, ну или пойти нафиг...

    И правильно делают!

    PCI DSS еще никто не отменял, а наоборот развивают. Хорошо, что об ваших со шлюзом махинациях в мпс не знают :)

    А по существу: 

    Берете их sdk, прогоняете через java2op, подключаете к проекту, правите немного манифест (добавляете в него их активности), и вызываете, обрабатываете результаты. Результат оплаты возвращается в интенте.

×
×
  • Создать...