Лидеры
Популярный контент
Показан контент с высокой репутацией 15.09.2016 в Сообщения
-
Проблема в Android 6.0
Kitty и 5 других отреагировал Brovin Yaroslav за вопрос
Так, я не все прочитал. Но добавлю пару слов на счет сворачивания и убивания приложения. Если вы нажимаете кнопку Back, то платформа FMX подаст запрос на уничтожение приложение. Если вы нажимаете на кнопку Home, то приложение просто сворачивается без уничтожения. Первый и второй пункты - это поведение андроид приложений по умолчанию. Если вы не хотите, чтобы приложение принудительно грохалось по кнопки Back. То вам нужно перехватить нажатие этой кнопки и самостоятельно свернуть ваше приложение. Повесить обработчик TForm.OnKeyDown/OnKeyUp и в нем вызвать код по сворачиванию. И сбросить Key и KeyChar TAndroidHelper.Activity.moveTaskToBack(true); А дальше все как обычно. Даже после сворачивания, система может уничтожить ваше приложение в любой момент времени по своему усмотрению.6 баллов -
TRESTLight - облегченная версия
Steepe_Hare и 3 других отреагировал Равиль Зарипов (ZuBy) за вопрос
Доброго времени суток! Навеяно этой темой. Посмотрел реализацию от @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.zip4 балла -
Проблема в Android 6.0
zairkz и 3 других отреагировал Равиль Зарипов (ZuBy) за вопрос
Андроед-телефоны, как и все вещи в 2016 году, собираются из каких-то ёбаных микросхем. начало ободряющее))4 балла -
WiFi Info
AngryOwl и 2 других отреагировал Andrey Efimov за тема
Название: 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.03 балла -
Один из вариантов открытия одного приложения из другого - это использование 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.3 балла
-
Проблема в Android 6.0
Vitaldj и 2 других отреагировал Andrey Efimov за вопрос
Persistent работает только для системных приложений. Попробуйте largeHeap установить в True, тогда памяти под ваше приложение будет выделено больше. И проведите тест с событиями. А вообще, вам уже подсказали Vitaldj и Rusland, любые длительные операции пихаем в сервис.3 балла -
Проблема в Android 6.0
Andrey Efimov и 2 других отреагировал Vitaldj за вопрос
Коллеги, простите за мою назойливость, но не применяйте свои десктопные знания в мобильных разработках! Это совершенно разные задачи! ИМХО постоянный коннект в мобилах - это зло!3 балла -
Проблема в Android 6.0
Andrey Efimov и ещё один отреагировал Rusland за вопрос
Да, есть сервисы. Стоит изучить темы тут Android сервисы никак не портировать на iOS2 балла -
2 балла
-
Получить голос из микрофона потоками
MrAnderson отреагировал 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) и как его проигрывать на сервере, может у кого есть опыт работы с этом сфере или какой нибудь документация имеется или какой нибудь предложение есть как все это сделать все совете и предложении очень важен Заранее спасибо согласитесь интересно использовать микрофон так и не дожидая пока он создаст файл всем удачи1 балл -
В смысле — нельзя — 152-ФЗ? Вы уже обрабатываете персональные данные, значит должны были получить на это разрешение разрешение. В оперативной памяти хранятся данные, чем это от недр отличается? Можно передавать данные через LocalBroadcastReceiver, если объем не большой.1 балл
-
Правый клик ListBox
Brovin Yaroslav отреагировал Равиль Зарипов (ZuBy) за вопрос
отвяжите 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;1 балл -
Работа с намерениями в iOS
Pax Beach отреагировал Brovin Yaroslav за вопрос
По идеи можно. Просто используйте нативное апи. TfgApplicationEvent здесь не поможет. Нужно перехватить сообщение с урлом TApplicationEventMessage1 балл -
Работа с намерениями в iOS
Pax Beach отреагировал Brovin Yaroslav за вопрос
Эта официальная статья вам, однозначно, поможет: Inter-App Communication1 балл -
OpenDialog для мобильных платформ
Равиль Зарипов (ZuBy) отреагировал Brovin Yaroslav за вопрос
На ios штатного диалога нету, кроме выбора фотки и видео. Это противоречит концепции apple. Там наоборот не хотят юзеру навязывать папочную структуру. НО, не смотря на это, функции по чтении директорий системы доступны. И вы в принципе, как минимум, можете её прочитать и самостоятельно ее визуализировать в UI.1 балл -
Проблема в Android 6.0
Andrey Efimov отреагировал Rusland за вопрос
На текущий момент и сервис не работает так как ожидается - после смерти от системы, приложение зависает при старте.1 балл -
Если хотите увидеть как на аппарате с 2Гб приложение будет выключено системой, то активнее полазайте по сайтам в браузере - например, откройте картинки в Google... через какое-то время приложение "помрет" PS. Еще можете установить какую-нибудь прожорливую игрушку и поиграть в нее1 балл
-
Как в рантайме указать, какие жесты нужно обрабатывать ?
Crusader99 отреагировал Равиль Зарипов (ZuBy) за вопрос
Panel1.Touch.GestureManager := GestureManager1; Panel1.Touch.StandardGestures := [TStandardGesture.sgLeft, ..]; Panel1.Touch.InteractiveGestures := [TInteractiveGesture.Pan, ..];1 балл -
TRESTLight - облегченная версия
Равиль Зарипов (ZuBy) отреагировал Pax Beach за вопрос
Нет времени для этого раньше понедельника. Как сделаю, выложу, конечно в соседней теме.1 балл -
Проблема в Android 6.0
Rusland отреагировал Равиль Зарипов (ZuBy) за вопрос
установите из маркета AppStatusWatcher, оно показывает потребление памяти приложением.1 балл -
Можно ли расположить MultyView внизу экрана
Brovin Yaroslav отреагировал Равиль Зарипов (ZuBy) за вопрос
из коробки такой возможности нет в примерах был пример для создания кастомного отображения1 балл -
Как изменить версию АПИ для компиляции проекта
Rusland отреагировал Andrey Efimov за вопрос
1. Можно поставить и самую последнюю версию АПИ (на данный момент последняя версия АПИ 24 Android 7, но использовать рискованно, т.к. Студией официально заявлена поддержка только до версии АПИ 23) Google поддерживает обратную совместимость. 2. Частично, выбор зависит от версии АПИ, пример: в "Build Tools, Revision 23.0.0" появилась официальная поддержка Android 6.0 (API level 23). Т.е. если используете АПИ 23, то Build Tools должны быть версии 23.0.0 или более поздней. Опять же поддерживается обратная совместимость. Подобную информацию можно посмотреть тут SDK Build Tools Release Notes Те же правила относятся и к SDK Tools. По умолчанию студия ставит версию 24.3.3 (19 АПИ) 3. Версия только устанавливаемая вместе со студией! Буквально вчера удалось это на себе прочувствовать. По умолчанию ставится версия NDK r9c. Не обновляйте самостоятельно на последнюю версию, приложения перестанут запускаться на устройствах! 4. Для внутренней работы студии с НДК? не знаю точного ответа... 5. Изменить можно в файле AndroidManifest.template.xml 6. Всё это техническая информация, которая позволяет гуглу выдавать списки приложений под устройство пользователя. Т.е. если у пользователя АПИ 19 устройство, а ваше приложение работает с версиями не ниже 20 АПИ, то этому пользователю не будут показывать ваше приложение. Пример приложения написанного с такими настройками: SDK 23 АПИ NDK r9c в приложении я мониторю версию АПИ, чтобы не пытаться выдать новый функционал из 23 АПИ для версии (например) 19 АПИ. разработка проводилась на устройстве с АПИ 19 Тесты прошли на всех версиях АПИ выше 4.4 Приложение: Wifi Info (Установки: активные/всего - 119/337) Надеюсь хоть немного смог объяснить, хотя сам ещё не до конца понимаю, что хорошо для студии, что плохо... p.s. Всё описанное выше, справедливо для RAD Studio Berlin1 балл -
Друзья! Я тут в одной теме выложил юнит для локализации приложений и демо-пример к нему, а также приложение облегчающее создание и редактирование ресурсов для локализации (файлов с переводами на разные языки). Потом подумал - может стоит вынести это в отдельную тему? Данная проблема (локализации приложений) возникла уже давно. На заре 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. Не сложно поправить - кому под что нужно.1 балл