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

Pavel M

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

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

  • Посещение

Информация

  • Пол
    Мужчина

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

1 577 просмотров профиля
  1. Pavel M

    JAVA и Delphi

    Прошу помощи в определении моих ошибок при написании и использования обёртки (часть библиотеки) Или ответа типа "используемый JAR непригоден для использования с DELPHI". Подробности ниже: Мне предоставили developer kit кассы (работает на андройде). Приложение Delphi типа Hello world на кассу поставил легко, но пока не получается работать со встроенным функционалом (пользователи, товары, чеки и пр). Библиотека кассы написана на Kotlin, я скомпилировал её целиком Android Studio в файл ".aar", затем распаковал как архив и вытащил ".jar", затем надеюсь создал корректную обёртку. (JAR закидываю как библиотеку к проекту на Delphi 10.1 update 2, вызываю как статик так и просто - либо не видит метод, либо приложение вылетает) Java2OP при создании обёртки вообще вылетает с ошибкой, буду признателен если подскажите как ему или чему то ещё правильно скормить эту библиотеку. Пример обёртки которую я использую: unit jdelphi; interface uses AndroidAPI.JNIBridge, Androidapi.JNI.JavaTypes; type JUser = interface; JUserClass = interface(JObjectClass) ['{A4B29440-8C8B-4C1F-A8E7-B7612D4FEEB4}'] function getUuid : JString; cdecl; function hashCode : Integer; cdecl; function init(uuid : JString; secondName : JString; firstName : JString; inn : JString; phone : JString; pin : JString; roleUuid : JString; roleTitle : JString) : JUser; cdecl; overload; function init(uuid : JString; secondName : JString; firstName : JString; phone : JString; pin : JString; roleUuid : JString; roleTitle : JString) : JUser; cdecl; overload; function toString : JString; cdecl; end; [JavaSignature('ru/evotor/framework/users/User')] JUser = interface(JObject) ['{2558685B-2BDC-4FCE-901F-3B53604E37C6}'] function equals(JObjectparam0 : JObject) : boolean; cdecl; function hashCode : Integer; cdecl; function toString : JString; cdecl; end; TJUser = class(TJavaGenericImport<JUserClass, JUser>) end; implementation procedure RegisterTypes; begin TRegTypes.RegisterType('jdelphi.JUser', TypeInfo(jdelphi.JUser)); end; initialization RegisterTypes; end. Программа Hello World!: unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects, FMX.Platform.Android, Androidapi.JNI.JavaTypes, Androidapi.Helpers; type TForm1 = class(TForm) btnExit: TButton; StyleBook1: TStyleBook; Text1: TText; btnGet: TButton; lbResult: TLabel; procedure btnExitClick(Sender: TObject); procedure btnGetClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} uses jdelphi; procedure TForm1.btnExitClick(Sender: TObject); begin MainActivity.finish; end; procedure TForm1.btnGetClick(Sender: TObject); // var // TestClass: JUser; begin // TestClass := TJUser.Create; // lbResult.Text:= JStringToString(TestClass.getUuid); lbResult.Text := JStringToString(TJUser.JavaClass.getUuid); end; end. Спасибо, за любые комментарии, мысли или советы.
  2. Разумеется. Там нет ответа на главный вопрос. "Как программно завершить вызов?"
  3. Задача отбить\завершить звонок. uses FMX.Memo, FMX.Memo.Types, FMX.Media, FMX.Helpers.Android, System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.IOUtils, Androidapi.Helpers, Androidapi.JNI.JavaTypes, Androidapi.JNI.Os, Androidapi.JNI.App, Androidapi.JNIBridge, Androidapi.JNI.GraphicsContentViewText, System.Threading, Androidapi.JNI.Telephony, Androidapi.JNI.Provider, Androidapi.JNIBridge, Androidapi.JNI.GraphicsContentViewText; function getdeclaredMethod(Cls: Jlang_class; const Name: JString): JMethod; var Arr: TJavaObjectArray<JMethod>; Meth: JMethod; I: Integer; begin Result := nil; Arr := Cls.getDeclaredMethods; for I := 0 to Arr.Length-1 do begin Meth := Arr.Items[I]; if Meth.getName.compareTo(Name) = 0 then begin Result := Meth; Exit; end; end; raise Exception.CreateFmt('method not found: %s', [Name]); end; function killCall(context: JContext): Boolean; var obj: JObject; telephonyManager: JTelephonyManager; classTelephony: Jlang_Class; methodGetITelephony: JMethod; telephonyInterface: JObject; telephonyInterfaceClass: Jlang_Class; methodEndCall: JMethod; begin try // Get the boring old TelephonyManager obj := context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE); telephonyManager := TJTelephonyManager.Wrap((obj as ILocalObject).GetObjectID); // Get the getITelephony() method classTelephony := TJlang_Class.JavaClass.forName(telephonyManager.getClass.getName); methodGetITelephony := getDeclaredMethod(classTelephony, StringToJString('getITelephony')); // Ignore that the method is supposed to be private // methodGetITelephony.setAccessible(True); JAccessibleObject(methodGetITelephony).setAccessible(True); // Invoke getITelephony() to get the ITelephony interface telephonyInterface := methodGetITelephony.invoke(telephonyManager); // Get the endCall method from ITelephony telephonyInterfaceClass := TJlang_Class.JavaClass.forName(telephonyInterface.getClass.getName); methodEndCall := getDeclaredMethod(telephonyInterfaceClass, StringToJString('endCall')); // Invoke endCall() methodEndCall.invoke(telephonyInterface); Result := True; except on E: Exception do // Many things can go wrong with reflection calls begin // Result := False; end; end; end; Это я нешел отсюда: stackoverflow Соответственно вопрос с invoke(): telephonyInterface := methodGetITelephony.invoke(telephonyManager); в вышеуказанной теме остался открытым. Как отловить входящий звонок (необходимый момент) через BroadcastReceiver понятно. Как решить задачу с завершением текущего звонка? P.S.: Как писать на JAVA и экспортировать функции что бы использовать их из Delphi представляю себе весьма туманно.
  4. Действительно бегло прочел Ваш пост и iOS9Fix не заметил. Сам переносил свой проект (под ведро) на 10.1 berlin, - была схожая проблема, думал помогу... Вместе с тем, если бы Вы соблюдали правила форума, то претензий и обвинений за мое желание помочь Вам, у Вас не было бы. Может будет кому полезно (константы кодов символов по названиям иконок): FontAwesomeCodes.zip
  5. Скопируйте файл FMX.FontGlyphs из 10.1 в папку своего проекта и отредактируйте его. Запускаемая программа должна искать шрифт в TPath.GetDocumentsPath (шрифт деплойдится в .\assets\internal) поскольку файл шрифта не найден символы не отображаются.
  6. Ярослав, спасибо этот способ я уже пробовал. в файле .style обнаружил PlatformTarget = [DARKSTYLE] 1) это флаг настроек или просто комментарий? Использовал и Light и Dark темы из BitmapStyleDesigner цвет шрифта у статус бара остается всегда белым. Проверял на Android 5.1.1 (Nexus 4) 2) Как сделать цвет шрифта статус бара чёрным? Как я указал выше цвет статус бара становится черным если у формы свойство Fill.Kind сменить на любое значение кроме None (иначе цвет шрифта и заливки статуса белые) однако при этом естественно не отражается беграунд формы из применяемой темы через StyleBook. 3) Как статус бар залить черным цветом не изменяя Fill. Kind ?
  7. Пожалуйста подскажите почему при третьем нажатии на кнопку возникает исключение: java.lang.RuntimeException: Init failed. unit Main; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls; type TFormMain = class(TForm) ButtonDtmf0: TButton; procedure ButtonDtmf0Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var FormMain: TFormMain; implementation uses Androidapi.JNI.Media; {$R *.fmx} procedure Play(Tone, Volume, DurationMs: Integer); overload; var ToneGenerator: JToneGenerator; begin ToneGenerator := TJToneGenerator.JavaClass.init(TJAudioManager.JavaClass.STREAM_MUSIC, Volume); ToneGenerator.StartTone(Tone, DurationMs); end; procedure TFormMain.ButtonDtmf0Click(Sender: TObject); var I: Integer; begin for I := 1 to 15 do begin Play(TJToneGenerator.JavaClass.TONE_DTMF_0, TJToneGenerator.JavaClass.MAX_VOLUME div 2, 50); sleep(100); end; end; end. В реальной программе многократное нажатие на разные кнопки вызывает исключение. Данный пример показывает суть проблемы.
  8. Спасибо, Я видел и это и схожие темы реализации заливки через FullScreen. Меня интересует возможность смены родительской темы на тёмную и замена цвета шрифта. Попытки редактирования Style.xml ни к чему не привели (он восстанавливается при компиляции), можно конечно отредактировать AndroidManifest.template.xml далее подгрузить свой Style.xml Но возможно есть более элегантные решения?
  9. Если залить основную форму любым цветом, то заливка TitleBar становится черной (шрифт белого цвета на ней становится виден). Но как всё таки как сменить заливку на светлую, а шрифт на тёмный пока не понятно.
  10. Использую любой стиль для Android из "FireMonkey Premium Styles Pack" Цвет шрифта статус бара и его заливка белые, видно только уровень батарейки зеленый. Как в .style или в run-time изменить тему (цвет заливки/шрифта) TitleBar на Dark?
  11. http://fontello.com Поищите здесь то что Вам нужно и скачайте себе шрифт только с необходимыми символами
  12. SQLite может быть собран в однопоточном варианте (параметр компиляции SQLITE_THREADSAFE = 0). Подробнее: https://m.habrahabr.ru/post/149635/
  13. я так и сделал, но полагаю это костыль. Неужели нет API для применения. Интересна так же причина возникающих ошибок у предложенного вами варианта после 30 кликов
  14. Спасибо, звук воспроизводиться. Однако при частом многократном обращении (поставил событие на клик по кнопке и покликал) появляются ошибки: java.lang.RuntimeExceprion: Init failed И я не нашел стандартного звука "чпок" , как будто все звуки только для работы с телефонией.
  15. Как проиграть стандартный звук системы "кнооцк" при нажатии на кнопку? Про вибрацию вроде уже нашел: uses FMX.Helpers.Android, Androidapi.JNI.JavaTypes, Androidapi.JNI.Os, Androidapi.JNI.App, Androidapi.JNIBridge, Androidapi.JNI.GraphicsContentViewText; implementation {$R *.fmx} uses FMX.Helpers.Android, Androidapi.JNI.JavaTypes, Androidapi.JNI.Os, Androidapi.JNI.App, Androidapi.JNIBridge, Androidapi.JNI.GraphicsContentViewText; procedure TForm1.Button1Click(Sender: TObject); var VibratorObj: JObject; Vibrator: JVibrator; begin VibratorObj := SharedActivity.getSystemService(TJActivity.JavaClass.VIBRATOR_SERVICE); Vibrator := TJVibrator.Wrap((VibratorObj as ILocalObject).GetObjectID); Vibrator.vibrate(StrToInt(ClearingEdit1.Text)); end;
×
×
  • Создать...