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

voytalexey

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

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

  • Посещение

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

    1

Весь контент voytalexey

  1. А на Самсунге какая версия Андроида? Может просто созданный вами apk-файл требует версии выше чем 4.1.2
  2. Вы путаете две разные ситуации: неправильную работу программы и неправильную работу отладчика (он же дебаггер). Думаю, у вас второй вариант, ибо SetLength настолько много где используется, что сбой в её работе давно бы заметили. У меня в проектах для Андроида в XE6 она отрабатывает без проблем. Некорректная работа отладчика более вероятна, но это, строго говоря, не влияет на поведение готовой программы.
  3. Может кто-нибудь подсказать как использовать OnCompletionListener в работе с нативными объектами Android? Мне надо произвести простейшие действия по окончании проигрывания видеофайла. Для этого предназначена коллбек процедура OnCompletionListener. Но ни одного примера на Дельфи я в Гугле и Яндексе не нашел. А те примеры что нашел затрудняюсь перевести на Дельфи. Наиболее часто встречается что-то типа такого: mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { Toast.makeText(MainActivity.this, "I'm Finished", Toast.LENGTH_SHORT); } или такое: mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { public void onCompletion(MediaPlayer mp) { finish(); // finish current activity } }); Возможно ли подобную конструкцию реализовать на дельфийском паскале?
  4. Пока сделал на базе TJVideoView и TJDialog примерно как описано в http://fire-monkey.ru/topic/2154-native-android-videoview/ В этом случае смог воспользоваться методом FDialog.hide. Так что срочный костыль нашелся, теперь буду спокойно искать более изящное решение.
  5. Попробовал. Не помогло. Более того, вообще удалил MediaPlayerControl с формы, а поведение не изменилось. Похоже, для Андроида он не нужен, достаточно только MediaPlayer-а.
  6. Уточню вопрос. Задача не в том чтоб узнать об окончании воспроизведения (это я могу сделать по таймеру проверяя состояние плеера). Проблема в том что он остаётся поверх моей формы, и вот как мне заставить его убраться я не знаю.
  7. В DelphiXE6, проект под Андроид, на свою форму кладу Mediaplayer, по кнопке задаю ему файл и вызываю метод Play. По окончании проигрывания файла на экране висит либо последний кадр, либо черный экран (на двух устройствах по-разному). Для того чтоб снова увидеть свою форму приходится нажимать вручную системную кнопку "Назад". Как можно сделать чтоб окно проигрывателя скрывалось само и показывалась моя форма без участия пользователя сразу по окончании файла видео?
  8. Маленькое замечание: варианты Вячеслава от 01:45 и Alex7wrt от 23:42 дают неравномерное распределение.случайных точек. Вариант Brovin Yaroslav от 15:33 даёт равномерное распределение.
  9. Просил проверить мой тестовый APK на форуме 4pda.ru других владельцев данного девайса, результаты оказались разные. Производитель выпускал девайс с двумя вариантами прошивки. В одной дельфийские APK нормально работают, в другой, более поздней, уже нет. Перепрошил планшет на первичную прошивку, все мои проекты заработали. Придётся жить с этой прошивкой, хотя она и глючная. Настройки Android Tools оказались совсем не причём.
  10. Пытаюсь запускать явные активности используя startActivityForResult(intent: JIntent; requestCode: Integer); Пока requestCode не использовал и оставлял нулевым, проблем не было. Но вот решил его использовать, и начались проблемы. При requestCode=1 вызывающее приложение падает в момент возврата с невнятным сообщением: "В приложении ProjectAAA произошла ошибка". При requestCode=2 вызывающее приложение не падает, но и в обработчик коллбека не попадает. При requestCode >= 3 вроде всё работает. Почему такое поведение? В документации я таких ограничений на значение requestCode не увидел. Для проверки сделал ProjectGroup из двух приложений, вызывающего ProjectAAA и вызываемого ProjectBBB, залил сюда: https://yadi.sk/d/KawBTcv3eh3SF Проверял на Delphi XE6. Вопросы: 1. Почему такое поведение? 2. Какой диапазон значений можно спокойно использовать на наступая на эти грабли?
  11. Нет никакого java-кода в генерируемом APK. Дельфя компилит сразу в машинный код под процессоры серии "ARMv7 processor with NEON support" http://blog.blong.com/2013/09/delphi-for-android-aka-delphi-xe5-aka.html
  12. Возможно, это связано с разными настройками десятичных разделителей в разных языках. Вы используете функцию преобразования StrToFloat с настройками по-умолчанию. Подозреваю, что в разных языках эти умолчания различные. Попробуйте использовать вариант этой функции с двумя параметрами, где формат строкового представления задаётся явно: function StrToFloat(const S: string; const AFormatSettings: TFormatSettings): Extended; и задайте AFormatSettings такое как у вас записаны данные в текстовом файле.
  13. Загрузить текстовый файл в Мемо в андроиде не проблема, делается так же как в винде. А вот запросить у пользователя путь к файлу - вот это проблема. Готовых работающих компонентов нет. Можно делать самому, идею как сделать можно почерпнуть тут (http://delphifmandroid.blogspot.ru/p/blog-page_27.html), в разделах про файловый менеджер.
  14. Нашел ответ в теме "В каких координатах выполняется отрисовка на канве?"
  15. Пытаюсь рисовать в PaintBox, но выходит что-то странное. Пытаюсь для начала залить его цветом, пробовал два варианта: procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas); begin canvas.Clear(TAlphaColorRec.Greenyellow); <- вариант 1: заливает всю форму PaintBox1.canvas.Clear(TAlphaColorRec.Greenyellow); <- вариант 2: опять заливает всю форму end; Но оба варианта заливают всю форму вместо того чтоб залить только сам PaintBox. Проверял в ХЕ6. В хелпе написано так: Canvas: The drawing surface of the object to be paint Я думал что это поверхность самого PaintBox, а получаю залитой всю форму. И даже во втором варианте, где явно указан компонент. Почему такое странное поведение?
  16. Почитал интернеты, поковырял параметры доступных мне устройств. Похоже, пока что единственны метод исправления указан Vincenzo Vicedomini в QC Report 126670. http://qc.embarcader...n.aspx?d=126670 Всё дело в значении параметра "ro.secure". По-хорошему, значения ro.secured=0 не должно быть на устройствах поступающих в продажу. В хорошо собранной и оттестированной сборке запущенной в релиз, параметр должен быть переведен в единицу. Похоже, некоторые производители дешевых телефонов этой проблемой не заморачиваются, как результат, отладчик не может получить доступ к отлаживаемому приложению. Посмотреть значение параметра можно запустив Adb.exe, далее войти в консоль (shell), затем посмотреть значения параметров командой getprop. Я пытался поменять этот параметр на ходу используя (setprop ro.secured 1), но он упорно остается в нуле. Параметр хранится в файле default.prop в корне андроида, и тоже недоступен для изменения. Все найденные мой советы по изменению параметра сводились к тому что прошивку надо слить, изменить параметр и залить обратно. Способа изменить параметр без перепрошивки я не нашел. Итого, варианты пока такие: 1. Перепрошивка. 2. Ждать пока Embarcadero исправит QC Report 126670. 3. Искать вариант изменения параметра "ro.secured" без перепрошивки, пусть даже он будет сбрасываться при перезагрузке планшета. Если кто-то найдет третий способ, просьба дать здесь ссылку. Спасибо.
  17. При попытке запустить отладку приложение на планшете стартует, а вот дебаггер нет. Как следствие, точки останова не работают, на паузу не поставить, исключения не увидеть. Пробовал на ХЕ6 и ХЕ7, текст ошибки одинаковый. Замена номера порта в настройках прожекта ошибку не исправляет. На телефоне тот же прожект дебажится нормально. Перезагрузка планшета, Дельфи и компа не помогает. Думал, планшет такой хреновый, но попробовал его прогнать в Android Studio, и там точки останова прекрасно работают, значения переменных прекрасно видны в дебаггере. Устройство ZIFRO ZT-7004, в дельфе опознается как ZT-7004, в андроид студии как Rockchip ZT-7004. Версия анроид 4.4.4, версия ядра 3.0.36+ Видел подобные вопросы и тут на форуме, и тут ( http://community.embarcadero.com/index.php/answers/android-deploy-to-h-w-error-unable-to-start-gdbserver-on-port-64311 ), и в Embarcadero QC ( http://qc.embarcadero.com/wc/qcmain.aspx?d=126670 ), но удобного решения нигде не видел.
  18. А при чем тогда здесь ХЕ7? И почему вопрос задан в разделе "прочее", когда есть разделы по разным платформам? Варианты действий: 1. Установить на устройство утилиту-проверялку, например, Root Checker. На Маркете качается бесплатно. Надежность работы, имхо, невысокая. Может есть более качественные утилиты, ищите отзывы. 2. Попробовать начать рутирование обычным способом, только не тапать все семь раз, достаточно одного. Если прибор уже рутирован, появится всплывающая надпись "Не нужно, вы уже разработчик". 3. Установить на комп утилиту для рутирования, типа Kingo Root, она не только рутирует, но и диагностирует устройства.
  19. Простейшие приложения не работают на планшете Prestigio PMP5597D. При запуске приложения пользователем оно мелькает на долю секунды и пропадает. При запуске под отладчиком получаю Segmentation Fault. Эти же файлы APK ставлю на телефон с Android 4.4.2 и всё работает нормально. К сожалению, другого устройства с версией 4.1.1 у меня нет, так что не могу понять, связана ли проблема с версией андроида или конкретным планшетом. Методом тыка выяснил, что всё-таки некоторые приложения работают, если не содержат некоторых контролов на форме. Так, пустая форма с лейблами нормально запускается. А вот появление кнопки на форме вызывает вышеупомянутое исключение. Причем именно видимой кнопки. Если есть кнопка с Visible=false или она расположена за пределами формы, то всё нормально. Но стоит кнопке сделать Visible=true как тут же получаю Segmentation Fault. Пробовал разные контролы, выяснил что TLabel, TPanel, TShape, TChart нормально отображаются. А вот появление видимого TButton, TMemo, TCheckBox, TGroupBox приводят к исключению в момент установки Visible=true. Ответа в интернете не нашел, нашел только аналогичный вопрос без ответа: http://codeverge.com/embarcadero.delphi.firemonkey/c++-builder-xe7-and-android-dev/2004616 Использую Delphi XE6. Смотрел Call Stack в момент исключения, там зачем-то идёт копирование громадного куска памяти размером 2560000 байт. Функция FMX.Helpers.Android.JBitmapToSurface обрабатывает какой-то Bitmap размерами {width = 1600, height = 400, stride = 0, format = 0, flags = 0}. Причем параметры этого битмапа не зависят от типа и размера контрола которому я делаю Visible=true. И размерам экрана планшета они тоже не соответствуют. На этом я застрял, что дальше делать не понимаю. На всякий случай выкладываю ниже содержимое Call Stack. :4017378A memcpy() :68B37A98 System.memmove(void*, void const*, unsigned int)() :68B3AA9C System.Move(void const*, void*, NativeInt)(Source=0x41aca1f0, Dest=0x6bb98008, Count=2560000) :69184900 Fmx.Helpers.Android.JBitmapToSurface(System.DelphiInterface<Androidapi.Jni.Graphicscontentviewtext.JBitmap>, Fmx.Surfaces.TBitmapSurface*)(SrcBitmap=0x67a5a810, DestSurface=0x66e85bc0) :6918D882 Fmx.Canvas.Android.TBitmapCodecAndroid.StretchIfNeed(System.DelphiInterface<Androidapi.Jni.Graphicscontentviewtext.JBitmap>, Fmx.Surfaces.TBitmapSurface*, System.DelphiInterface<Androidapi.Jni.Graphicscontentviewtext.JBitmapFactory_Options>, unsigned int)(Self=0x673567f0, SrcBitmap=0x67a5a810, Bitmap=0x66e85bc0, LoadOptions=0x65e30580, MaxSizeLimit=4096) :6918B260 Fmx.Canvas.Android.TBitmapCodecAndroid.LoadFromStream(System.Classes.TStream*, Fmx.Surfaces.TBitmapSurface*, unsigned int)(Self=0x673567f0, AStream=0x66d7dc50, Bitmap=0x66e85bc0, MaxSizeLimit=4096) :68D55F38 Fmx.Graphics.TBitmapCodecManager.LoadFromStream(System.Classes.TStream*, Fmx.Surfaces.TBitmapSurface*, unsigned int)(Self=0x696e648c, AStream=0x66d7dc50, Bitmap=0x66e85bc0, MaxSizeLimit=4096) :68D56B3E Fmx.Graphics.TBitmap.LoadFromStream(System.Classes.TStream*)(Self=0x66e85c78, Stream=0x66d7dc50) :68D36190 Fmx.Multiresbitmap.TCustomBitmapItem.SetDormant(bool)(Self=0x66d7dba0, Value=false) :68D35DC6 Fmx.Multiresbitmap.TCustomBitmapItem.GetBitmap()(Self=0x66d7dba0) :6936200A Fmx.Styles.Objects.TCustomStyleObject.DoDrawToCanvas(Fmx.Graphics.TCanvas*, System.Types.TRectF const&, float)(Self=0x65d77bf8, Canvas=0x65417350, ARect={ = {{TopLeft = {{{X = 3.06330321e+025, Y = 5.7096492e+022}, {V = {3.06330321e+025, 5.7096492e+022}}}}, BottomRight = {{{X = 1.27199452e+023, Y = 3.06475682e+025}, {V = {1.27199452e+023, 3.06475682e+025}}}}}, {Left = 3.06330321e+025, Top = 5.7096492e+022, Right = 1.27199452e+023, Bottom = 3.06475682e+025}}}, AOpacity=1) :693591A2 Fmx.Styles.Objects.TCustomStyleObject.DrawToCanvas(Fmx.Graphics.TCanvas*, System.Types.TRectF const&, System.Uitypes.TAlphaColor, float)(Self=0x65d77bf8, Canvas=0x65417350, ARect={ = {{TopLeft = {{{X = 3.06330321e+025, Y = 5.7096492e+022}, {V = {3.06330321e+025, 5.7096492e+022}}}}, BottomRight = {{{X = 1.27199452e+023, Y = 3.06331244e+025}, {V = {1.27199452e+023, 3.06331244e+025}}}}}, {Left = 3.06330321e+025, Top = 5.7096492e+022, Right = 1.27199452e+023, Bottom = 3.06331244e+025}}}, ATintColor=0, AOpacity=1) :69358D88 Fmx.Styles.Objects.TCustomStyleObject.Paint()(Self=0x65d77bf8) :693471FC Fmx.Controls.TControl.PaintInternal()(Self=0x65d77bf8) :69332884 Fmx.Controls.TControl.PaintChildren()(Self=0x671a64d0) :693472E0 Fmx.Controls.TControl.PaintInternal()(Self=0x671a64d0) :69332884 Fmx.Controls.TControl.PaintChildren()(Self=0x65d83a58) :693472E0 Fmx.Controls.TControl.PaintInternal()(Self=0x65d83a58) :693CEA76 Fmx.Forms.TCustomForm.PaintRects(System.Types.TRectF const*, int)(Self=0x66f1f258, UpdateRects=@0x69cacd00: {{{{TopLeft = {{{X = 0, Y = 0}, {V = {0, 0}}}}, BottomRight = {{{X = 768, Y = 976}, {V = {768, 976}}}}}, {Left = 0, Top = 0, Right = 768, Bottom = 976}}}}, .=0) :693C06AE __stub_in588v69__ZN3Fmx5Forms17TCommonCustomForm10PaintRectsEPKN6System5Types6TRectFEi() :6928CE9A Fmx.Platform.Android.TWindowManager.Render().RenderNormalWindows(void*)(__FRAMEPTR__=@0x69cacd54: {<No data fields>}) :6927284E Fmx.Platform.Android.TWindowManager.Render()(Self=0x66f34810) :692727E4 Fmx.Platform.Android.TWindowManager.RenderIfNeeds()(Self=0x66f34810) :69290E0A Fmx.Platform.Android.TPlatformAndroid.InternalWaitMessage(int)(Self=0x6715a260, TimeoutOverride=0) :69279110 Fmx.Platform.Android.TPlatformAndroid.WaitMessage()(Self=0x6715a260) :69279068 Fmx.Platform.Android.TPlatformAndroid.Run()(Self=0x6715a260) :6927904E __stub_in256s__ZN3Fmx8Platform7Android16TPlatformAndroid3RunEv() :693BDE66 Fmx.Forms.TApplication.Run()(Self=0x66f346f8) :6942014A _NativeMain() :68B4A30E System.main_app_entry(void*)(param=nil) :40179B74 __thread_entry() :401792CC pthread_create() :66FC3350 ??() :66FC3350 ??()
  20. Уже давно в Windows есть функция QueryPerformanceCounter. Аналогичные вашему вопросы решались тут: http://delphikingdom.com/asp/answer.asp?IDAnswer=63327 http://delphikingdom.com/asp/answer.asp?IDAnswer=67074 http://delphikingdom.com/asp/answer.asp?IDAnswer=62538
  21. Одним вызовом передать два Intent-а? Никак, ибо функции типа startActivity() принимают только один экземпляр. Зато в один Intent можно напихать довольно много разнородной информации используя разнообразные Exstra.
  22. Заголовок топика должен звучать так: "Как в вызываемом приложении получить доступ к объекту JIntent?" К сожалению, на этом форуме редактировать содержание поста можно, а вот его заголовок нет. Теперь ответ на вопрос. Доступ есть через SharedActivity.getIntent (надо подключить модули FMX.Helpers.Android и Androidapi.JNI.GraphicsContentViewText). Для возврата информации в вызывающее приложение использовал SharedActivity.setResult(TJActivity.JavaClass.RESULT_OK, SharedActivity.getIntent); SharedActivity.finish(); Для того чтоб в главном приложении получить результат, надо перед вызовом подписаться на сообщение (в XE6): Intent := TJIntent.Create; Intent.setClassName(StringToJString('com.MySoft.PluginOne'),StringToJString('com.embarcadero.firemonkey.FMXNativeActivity')); // наполняем данные для передачи в плагин intent.putExtra(StringToJString('dbl'),123.456); intent.putExtra(StringToJString('str'),StringToJString('qwerty')); // подписываемся на сообщение, колл-бек метод "HandleActivityMessage" FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification,HandleActivityMessage); // стартуем плагин SharedActivity.startActivityForResult(Intent,0); Получение результата в вызывающем приложении делается в колл-бек методе, я делал так: procedure TForm1.HandleActivityMessage(const Sender: TObject; const M: TMessage); var RequestCode, ResultCode: Integer; Intent: JIntent; d:double; s:string; begin if not(M is TMessageResultNotification) then exit; TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FMessageSubscriptionID); FMessageSubscriptionID := 0; RequestCode:=TMessageResultNotification(M).RequestCode; ResultCode:=TMessageResultNotification(M).ResultCode; Intent:=TMessageResultNotification(M).Value; if ResultCode = TJActivity.JavaClass.RESULT_OK then begin Memo1.Lines.Append('RESULT_OK'); if Assigned(Intent) then begin d:=Intent.getDoubleExtra(StringToJString('dbl'),111.111); s:=JStringToString(Intent.getStringExtra(StringToJString('str'))); Memo1.Lines.Append('d='+FloatToStr(d)); Memo1.Lines.Append('s='+s); end; end else if ResultCode = TJActivity.JavaClass.RESULT_CANCELED then begin Memo1.Lines.Append('RESULT_CANCELED'); end; end; Проверено в ХЕ6, идеи почерпнуты из следующих источников: http://vlad8.com/tech/android-intents-tutorial/ http://www.darkraha.com/rus/mobile/android/api/intent.php http://www.blong.com/Articles/DelphiXE6AndroidActivityResult/ActivityResult.htm в последней ссылке есть описание как решать эту проблему в ХЕ5, есть отличия.
  23. Есть два приложения, условно назовём главное и плагин. Главное создает объект JIntent после чего запускает плагин через вызов startActivity(Intent). Как мне в плагине получить доступ к этому передаваемому Intent? Использую Delphi XE6.
  24. Получилось вызывать так: uses FMX.Helpers.Android, Androidapi.Helpers, Androidapi.JNI.JavaTypes, Androidapi.JNI.GraphicsContentViewText, ......... var Intent: JIntent; .......... Intent := TJIntent.Create; Intent.setClassName(StringToJString('com.MyDeveloperName.Project2'),StringToJString('com.embarcadero.firemonkey.FMXNativeActivity')); SharedActivity.startActivity(Intent); Здесь в первом параметре setClassName идёт имя вызываемого пакета.
×
×
  • Создать...