-
Постов
1 204 -
Зарегистрирован
-
Посещение
-
Победитель дней
26
Активность репутации
-
Rusland отреагировална Brovin Yaroslav в Фильтр по типу "облака тегов"
Добрый день,
Можно взять компонент TFlowLayout с плавающей разметкой внутренних компонентов. Накидывать туда TLabel со специальным стилем и AutoSize. Там где нужен перенос вставлять TFlowLayoutBreak.
Всплывающий список со списком, я думаю не проблема. Можно взять TPopup с TListBox. Можно просто заюзать пикеры FMX.Pickers.pas. Взять пикер TCustomListPicker
-
Rusland отреагировална AngryOwl в Получить голос из микрофона потоками
Есть библиотека BASS, которая умеет все вышеперечисленное. И захват с микрофона в потоке, и определение уровня громкости и много чего еще.
Кроме того, в реальных условиях работы в сети Интернет, при передаче через UDP, не забывайте о максимальном размере пакетов (размер MTU в байтах) - обычно он 1450-1500, но я бы рекомендовал использовать значение 1400 (по личному опыту). Иначе вы будете слышать именно те "щелчки", вместо нормального звука. Т.е. - нужно определить размер буфера принимаемого с микрофона, разбивать его на фрагменты, и отправлять так, чтобы на принимающей стороне собрать в нужной последовательности, а далее - воспроизвести.
-
Rusland отреагировална Равиль Зарипов (ZuBy) в Отобразить маршрут при помощи Google Distance
только он давно не обновлялся, нужно его от Indy избавить и переписать на TNetHTTPComponent, чтобы работало стабильно https
на днях займусь, сам забыл про него...
-
Rusland отреагировална kami в Будет ли утечка памяти при таком использовании объектов?
На Android штатный менеджер памяти не отслеживает утечки.
-
Rusland отреагировална Alex7wrt в Зависание приложения при разворачивании после поворота экрана, Android
Я так понимаю,у меня одного возникает такая проблема, и никто с таким не встречался?
Может быть стоит создавать баннер средствами JNI на основе стандартного баннера Android?
Тут еще такой вопрос: в Berlin есть модуль FMX.Advertising.Android. Есть ли у кого-нибудь опыт работы с этим модулем?
-
Rusland получил реакцию от Alex7wrt в Зависание приложения при разворачивании после поворота экрана, Android
Запускайте Android Device Monitor
Путь примерно такой (в зависимости от версии):
C:\Users\All Users\Documents\Embarcadero\Studio\17.0\PlatformSDKs\android-sdk-windows\tools\monitor.bat
-
Rusland отреагировална Сергей Сергеев в Проблема в Android 6.0
есть такой путь.. я его описал чуть выше :
Придется по новой заполнять всю начальную инфу на сервере ( например там есть список файлов клиента), который получается сканированием определенных директорий, при каждом коннекте , раньше я с клиента просто говорил - дай файл №5 .. в сессии по MemTable искал№5 - брал его путь и отсылал клиенту..
понятно, что все решаемо.. всякими бубнами.. но весь этот стройный и удобный механизм ДатаСнап летит.. используется только для начального заполнения.. к чему эти все циклы статей и видео - как прекрасно на дельфи используя датаснап делать приложения для Анроида, если клиент прибивается, только ты решил отправить СМС? и сесииян на сервере захлопнулась.. со всеми вытекающими..
-
Rusland получил реакцию от Равиль Зарипов (ZuBy) в Проблема в Android 6.0
Ярослав как-то упоминал BindService, но до сих пор тема сисек не раскрыта никакой конкретики. Может как-то через TLocalServiceConnection.LocalService можно получить доступ к данным в сервисе?
-
Rusland отреагировална Andrey Efimov в как из сервиса узнать, что приложение основное сейчас закрыто
Узнать, работает Служба или Приложение, можно попробовать, через методы
getRunningAppProcesses getRunningServices ActivityManager - getSystemService(ACTIVITY_SERVICE);
-
Rusland отреагировална Fedor K в Работа с намерениями в iOS
Один из вариантов открытия одного приложения из другого - это использование URL schemes (Ярослав давал выше ссылку).
Из приложение А:
//отправка uses Macapi.Helpers, FMX.Helpers.iOS; //делаем намерение открыть URL (по сути тоже самое Intent в Android) SharedApplication.openURL(StrToNSUrl(Url)); Приложение Б (подробнее, хотя немного устарело):
//подписываемся на события if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(aFMXApplicationEventService)) then aFMXApplicationEventService.SetApplicationEventHandler(HandleAppEvent); //обработчик function HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; var lURL : string; begin case AAppEvent of TApplicationEvent.OpenURL : begin lURL := (AContext as TiOSOpenApplicationContext).URL; //реализуем логику end; Как передать файлы я вижу несколько вариантов:
- использовать буфер обмена (класс UIPasteboard - думаю не сложно его использовать в FMX, я им пользовался только в Xamarin, на FMX возможно (нужно проверить) можно использовать FMX.Platform.IFMXClipboardService). Перед открытием URL в "А" - сохраняем картинку/файл в буфер обмена, в "Б" при открытии считываем.
- передавать в URL путь к файлу (это возможно только, если и "А" и "Б" являются приложением одной группы). пример с Object-C.
-
Rusland отреагировална Fedor K в Работа с намерениями в iOS
1. TMS iCL
2. DPF- смотрите в сторону TDPFQLPreviewController
3. Ручками, что-то вроде такого (документация apple):
var controller : UIDocumentInteractionController; URL: NSURL; {$ENDIF} path : string; temp : Boolean; begin path := ExtractFilePath(ParamStr(0)) + '/Sample.pdf'; {$IFDEF IOS} URL := TNSUrl.Wrap(TNSUrl.OCClass.fileURLWithPath(StrToNSStr(path))); controller := TUIDocumentInteractionController.Wrap( TUIDocumentInteractionController.OCClass.interactionControllerWithURL(URL)); TNSUrl.Wrap(TNSUrl.OCClass.fileURLWithPath(StrToNSStr(path))); temp := controller.presentOpenInMenuFromRect( WindowHandleToPlatform(self.Handle).View.frame, WindowHandleToPlatform(self.Handle).View,true); {$ENDIF} end;
-
Rusland отреагировална Martifan в Получить голос из микрофона потоками
Доброго времени сутки
недавно для себя открыл что можно из микрофона получить данные потоками:
Uses ..., Androidapi.JNI.Media; procedure TForm1.Button1Click(Sender: TObject); var bufferSize: integer; buffer: TJavaArray<Byte>; M: TMemoryStream; begin audioRecord := TJAudioRecord.JavaClass.init(TJMediaRecorder_AudioSource.JavaClass.MIC, 44100, TJAudioFormat.JavaClass.CHANNEL_IN_MONO, TJAudioFormat.JavaClass.ENCODING_PCM_16BIT, 44100 * 2); (audioRecord as JAudioRecord).startRecording; buffer := TJavaArray<Byte>.Create(8820); (audioRecord as JAudioRecord).read(buffer, 0, 8820); (audioRecord as JAudioRecord).stop; audioRecord.release; buffer заполняется данными я проверил все работает (можно код прописать чтобы этот buffer проигрывал)
audioRecord := TJAudioRecord.JavaClass.init(TJMediaRecorder_AudioSource.JavaClass.MIC, 44100, TJAudioFormat.JavaClass.CHANNEL_IN_MONO, TJAudioFormat.JavaClass.ENCODING_PCM_16BIT, 44100 * 2); <--- как мне кажется здесь видно что это формат Wave
я пытаюсь передать это все серверу:
IdUDPClient1.SendBuffer(IdUDPClient1.Host, IdUDPClient1.Port, RawToBytes(buffer, buffer.Length)); сервер запущен на Windows но не получается я слышу только пикание
Вопрос:
как мне передать этот поток серверу (среды Windows) и как его проигрывать на сервере, может у кого есть опыт работы с этом сфере или какой нибудь документация имеется или какой нибудь предложение есть как все это сделать все совете и предложении очень важен
Заранее спасибо согласитесь интересно использовать микрофон так и не дожидая пока он создаст файл
всем удачи
-
Rusland отреагировална Равиль Зарипов (ZuBy) в Правый клик ListBox
отвяжите TPopupMenu от TListBox
procedure TForm4.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); var aItem: TListBoxItem; begin if Button = TMouseButton.mbRight then begin aItem := ListBox1.ItemByPoint(X, Y); if aItem = nil then exit; ListBox1.ItemIndex := aItem.Index; PopupMenu1.Popup(Screen.MousePos.X, Screen.MousePos.Y); end; end;
-
Rusland получил реакцию от Vitaldj в Проблема в Android 6.0
Если хотите увидеть как на аппарате с 2Гб приложение будет выключено системой, то активнее полазайте по сайтам в браузере - например, откройте картинки в Google... через какое-то время приложение "помрет"
PS. Еще можете установить какую-нибудь прожорливую игрушку и поиграть в нее
-
Rusland отреагировална Andrey Efimov в WiFi Info
Название: WiFi Info
Платформа: Android 4.1.2 или более поздняя
Тип устройства: смартфон, планшет
Актуальная версия: 1.1.0
Ссылка: Google Play
Описание:
Приложение позволяет просматривать полную информацию об активном подключении, сканировать Wi-Fi точки и просматривать информацию о них, а также просматривать информацию о конфигурациях для сохранённых точек доступа. Есть возможность настроить автоматическое обновление информации.
Поддержка Android 4.1.2 и выше.
Приложение протестировано на устройствах:
LG-P705 - Android 4.1.2
Huawei Y541-U02 - Android 4.4.2
Xiaomi Redmi Note 3 - Android 5.0.2 LRX22G (MIUI by xiaomi.eu stable 7.3.1)
Samsung SM-T585 Galaxy Tab A 10.1 - Android 7.0
-
Rusland получил реакцию от Andrey Efimov в Проблема в Android 6.0
На текущий момент и сервис не работает так как ожидается - после смерти от системы, приложение зависает при старте.
-
-
Rusland получил реакцию от Andrey Efimov в Проблема в Android 6.0
Да, есть сервисы. Стоит изучить темы тут
Android сервисы никак не портировать на iOS
-
Rusland отреагировална AngryOwl в Локализация приложений
Друзья!
Я тут в одной теме выложил юнит для локализации приложений и демо-пример к нему, а также приложение облегчающее создание и редактирование ресурсов для локализации (файлов с переводами на разные языки).
Потом подумал - может стоит вынести это в отдельную тему?
Данная проблема (локализации приложений) возникла уже давно. На заре XE2. Потом были все версии, вплоть до текущей. Но лично меня текущие решения так и не устраивали. Мне нужно было простое и удобное редактирование сразу всех языков приложения, и чтобы быстро работало.
Тогда и были созданы этот юнит и приложения, с которыми я решил с вами поделиться. Создано это было для себя, для упрощения локализации собственных приложений. Поэтому никакой "красоты" кода прошу не искать - ее там нет. Местами вообще кому-то покажется "кривым"... )
Очень жаль, что у меня критически мало времени для общения на данном ресурсе, а потому я в некотором смысле извиняюсь - мог бы выложить этот код давно.
Тем-более, что он очень простой. Все что в нем используется, и как используется, думаю, всем будет доступно и понятно.
Итак.
Приложение Test_Translator - это дело пример с, непосредственно, самим юнитом uTranslatorFM.pas
В uTranslatorFM.pas вы увидите, что локализация осуществлена за счет использования INI-файлов, а сам "перевод" осуществляется простым перебором компонент на форме.
Стоит отметить, что перевод осуществляется использованием свойства компонент HelpContext (integer), а у компонент, что не имеют этого свойства - используется свойство Tag.
На первый взгляд может показаться неудобным. А если приложение большое - что-то может забыться. Однако, лично я очень быстро привык к такому использованию. И поверьте - приложение, в котором я использую этот юнит, очень большое! )))
Кроме того, если есть компоненты, которые не имеют этих свойств, или которые могут менять значение перевода самостоятельно, либо могут быть динамическими - можно использовать нулевой HelpContext, но при этом придавать им значения "вручную".
Например: если требуется у компонента TLabel динамически менять значение в ходе выполнения программы, подставляя нужные "подстроки" (грубо - используя, например, Format(...)), то можно написать в программе
Label1.Text := Format( AppTranslator.GetValue(_код_, _значение_по_умолчанию_), [_подставляемое_значение_]); где
_код_ - это значение, которое будет считываться из INI-файла (например 100)
_значение_по_умолчанию_ - значение строки по умолчанию, на тот случай, если данный текст отсутствует в INI-файле, или файла с таким переводом не существует (этот параметр не обязателен)
_подставляемое_значение_ - в данном случае это просто пример, допустим - ход выполнения процесса (например 85%)
А строка в INI-файле может быть такая:
(файл lang.ru)
100=Процесс выполнения %d%%
(файл lang.en)
100=The progress %d%%
и также другие языки.
Думаю тут, в примере, все элементарно и понятно.
Все работает на любой платформе!
Как вы будете подключать файлы к приложению - ваше дело. Можно скачивать с инета, можно встроить в качестве ресурсов, задеплоить в проект и т.д.
Лично я встраиваю в качестве ресурсов (Win) и деплою (Mac и Android). У меня свои причины и аргументы.
Файлы:
Lang.ru
Lang.en
и другие, это INI-файлы соответствующих переводов где строки с переводами имеют одинаковые индексы
LangList.ini - вспомогательный файл (разберетесь))
language.rc - файл для создания ресурса (Win)
С приложением SLLanguage все немного и сложнее и проще, одновременно...
Не вижу смысла его описывать - оно просто позволяет редактировать описанные выше ресурсы (файлы языков).
Часть его кода откуда-то позаимствовано (не помню уже).
Для чего все это я отдельно решил написать, в отдельную тему?
Предлагаю всем пользоваться данным кодом - кому как заблагорассудится! Исправлять, дополнять и делится мыслями и идеями.
Возможно кто-то решит создать компонент.
Ну вот вроде все, друзья!
Если что - спрашивайте! Отвечу по мере возможности.
P.S. К модераторам - поправьте, если что, - вдруг не в ту тему закинул.
SLLanguage.zip
Test_Translator.zip
P.P.S. Забыл уточнить - дело-пример делал под XE10, а приложение для создания ресурсов под XE7. Не сложно поправить - кому под что нужно.
-
Rusland получил реакцию от Равиль Зарипов (ZuBy) в Проблема в Android 6.0
Да, есть сервисы. Стоит изучить темы тут
Android сервисы никак не портировать на iOS
-
-
Rusland отреагировална Равиль Зарипов (ZuBy) в Проблема в Android 6.0
установите из маркета AppStatusWatcher, оно показывает потребление памяти приложением.
-
Rusland отреагировална Равиль Зарипов (ZuBy) в TRESTLight - облегченная версия
Доброго времени суток!
Навеяно этой темой.
Посмотрел реализацию от @Pax Beach (за что ему спасибо большое) и столкнулся с тем что TRESTClient со всеми потрахами это просто дикий ужас.
Решил собрать аналогичный пример, только не использовать TREST***
немного опишу, свою реализацию
uAppSettings.pas - хранит описание вашего приложения созданного в ВК FMX.RESTLight.pas - модуль "общения" клиента с сервером FMX.RESTLight.Types.pas - тут хранятся типы для работы TRESTLight Приведу код, который постит Вам на стену текст
var aFields: TArray<TmyRestParam>; aJSON: string; begin SetLength(aFields, 5); aFields[0] := TmyRestParam.Create('access_token', FAuthToken.token, false); aFields[1] := TmyRestParam.Create('v', FVKApp.APIVersion, false); aFields[2] := TmyRestParam.Create('owner_id', FAuthToken.user_id, false); aFields[3] := TmyRestParam.Create('friends_only', '0', false); aFields[4] := TmyRestParam.Create('message', 'Тестовое сообщение <RESTLight>', false); TTask.Run( procedure begin aJSON := TRESTLight.Execute('wall.post', FVKApp, aFields); TThread.Synchronize(TThread.CurrentThread, procedure begin Memo1.Lines.Add('---- wall.post ----'); Memo1.Lines.Add(aJSON); end); end); а вот так можно заливать файлы
var aFields: TArray<TmyRestParam>; aJSON: string; begin SetLength(aFields, 4); aFields[0] := TmyRestParam.Create('access_token', FAuthToken.token, false); aFields[1] := TmyRestParam.Create('v', FVKApp.APIVersion, false); aFields[2] := TmyRestParam.Create('owner_id', FAuthToken.user_id, false); aFields[3] := TmyRestParam.Create('photo', aUploadFile, true); // для файлов указывается !!!true!!! TTask.Run( procedure begin // для загрузки файлов использовать TRESTLight.Execute2, в нем можно указать произвольный URL aJSON := TRESTLight.Execute2(aUploadURL, FVKApp, aFields); TThread.Synchronize(TThread.CurrentThread, procedure begin Memo1.Lines.Add('---- upload file to server ----'); Memo1.Lines.Add(aJSON); end); end); P.S. На правильность и оригинальность не претендую, просто альтернативный вариант. Мне например не понравилась как устроен TRESTClient, много компонентов лишних. В боевых условиях наверное код еще будет модернизироваться, я рассмотрел только пару методов, но думаю общая концепция не сильно поменяется
GitHub TRESTLight.zip
-
Rusland отреагировална Pax Beach в После "сна" программа с сервисом не стартует
Лучше указать параметры SDK, с которыми компилируешь приложение, и платформу на которой тестируешь.
И, если честно, по-русски не очень понятно, что ты имеешь ввиду. А гугл транслятор справиться с переводом сам.
Я плюсанул )
-
Rusland отреагировална rareMax в [Статья][AdMob] Добавляем рекламный блок в приложение
На канале в телеграмме кто то рассказывал как использовать видео рекламу на андроиде