Anatoliy
-
Постов
176 -
Зарегистрирован
-
Посещение
Активность репутации
-
Anatoliy отреагировална Yuriy2606 в API level 26 ??? Всё таки как выложить приложение на Play Market?
Большое спасибо за ответ. Еще раз внимательнее все проверив у меня все таки получилось динамически запросить разрешения при помощи KastriFree в Berline
Запрос сделал так
{cPermissionACCESS_COARSE_LOCATION = 'android.permission.ACCESS_COARSE_LOCATION'; cPermissionACCESS_FINE_LOCATION = 'android.permission.ACCESS_FINE_LOCATION'; cPermissionACCESS_NETWORK_STATE = 'android.permission.ACCESS_NETWORK_STATE'; cPermissionCALL_PHONE = 'android.permission.CALL_PHONE'; cPermissionCAMERA = 'android.permission.CAMERA'; cPermissionINTERNET = 'android.permission.INTERNET'; cPermissionREAD_EXTERNAL_STORAGE = 'android.permission.READ_EXTERNAL_STORAGE'; cPermissionREAD_PHONE_STATE = 'android.permission.READ_PHONE_STATE'; cPermissionWAKE_LOCK = 'android.permission.WAKE_LOCK'; cPermissionWRITE_EXTERNAL_STORAGE = 'android.permission.WRITE_EXTERNAL_STORAGE'; } FRequester.RequestPermissions([cPermissionACCESS_FINE_LOCATION,cPermissionACCESS_COARSE_LOCATION,cPermissionREAD_EXTERNAL_STORAGE, cPermissionWRITE_EXTERNAL_STORAGE, cPermissionCAMERA], cPermissionsCodeExternalStorage); Обработка так
procedure TForm1.PermissionsResultHandler(Sender: TObject; const ARequestCode: Integer; const AResults: TPermissionResults); begin case ARequestCode of cPermissionsCodeExternalStorage: begin if AResults.AreAllGranted then DoShow; //Что-то делаем else ShowMessage('You need to grant all required permissions for the app to be able to take photos!'); end; cPermissionsCodeSMS: begin if AResults.AreAllGranted then ShowMessage('SMS permissions granted') else ShowMessage('You need to grant all required permissions for the app to be able to handle SMS!'); end; end; end; Там в коде примера KastriFree все описано более подробно
https://www.delphiworlds.com/2018/06/targeting-android-8-and-higher-continued/
Вот ссылка, это для тех, у кого Berlin
-
Anatoliy отреагировална Tumaso в API level 26 ??? Всё таки как выложить приложение на Play Market?
@Yuriy2606, нужно динамически запрашивать необходимые разрешения у пользователя.
Наверное, правильнее будет установить 10.3 CE, там поддержка получения разрешений идет из коробки (модуль System.Permissions). Плюс 10.3 поддерживает android 9
Что касается получения ключа, то проверьте, что у вас в hosts и нет ли блокировки доступа bds.exe к Интернет на уровне антивируса
-
Anatoliy отреагировална IVGSoft в Обработка анимированных GIF по рецепту китайского коллеги
В конце концов получилось исправить.
Для interlaced гифок проблема была вообще пустяковая. Одна строчка не в том месте. А вот для optimized все оказалось несколько сложней, но в итоге теперь все гифки отображаются правильно.
Пользуйтесь на здоровье!
FMX.GifUtils.zip
-
Anatoliy отреагировална Евгений Корепов в Обработка анимированных GIF по рецепту китайского коллеги
Принцип работы такой:
На форму кладете стандартный TImage Создаете экземпляр TGifPlayer Задаете свойство FGifPlayer.Image:=Image; где Image это лежащая на форме TImage Загружаете гифку FGifPlayer.LoadFromFile('D:\Embarcadero\Projects\ShareCode\FMX.GifUtils\GIF_Example.gif'); Запускаем проигрывание гифки FGifPlayer.Play; Вот код:
unit UnitFormMain; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.GifUtils, FMX.Objects; type TFormMain = class(TForm) Image: TImage; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } FGifPlayer : TGifPlayer; end; var FormMain: TFormMain; implementation {$R *.fmx} procedure TFormMain.FormCreate(Sender: TObject); begin FGifPlayer:=TGifPlayer.Create(Self); FGifPlayer.Image:=Image; FGifPlayer.LoadFromFile('D:\Embarcadero\Projects\ShareCode\FMX.GifUtils\GIF_Example.gif'); FGifPlayer.Play; end; end. Вот демо проект во вложении:
FMX.GifUtils.Demo.zip
-
-
-
Anatoliy отреагировална Brovin Yaroslav в Не могу вывести локальное уведомление
В 10.3 расширено апи уведомлений для возможности указывать канал уведомлений для андроида. Это должно решить вашу проблему.
-
-
Anatoliy отреагировална FREEFAR в PUSH Notification не работает после публикации
Всем доброго времени суток.
Казалось бы. Во время разработки и перед тем как подписали приложение сертификатом Distribution, пуши приходили норм. Но после того как прошли аудит Apple пуши куда-то пропали. FCM возвращал ошибку InvalidRegistration.
Оказалось все достаточно просто. На сервере с которого мы отправляем пуш, В php скрипте, который отправляет пуши надо выставить
sandbox = false
Ура! Всем удачи)
-
Anatoliy отреагировална Tumaso в Андроид. Не удаётся установить приложение.
Удалите вручную приложение с телефона перед установкой новой версии.
Можно еще попробовать установить -cleaninstall в Run->Parameters, далее в появившемся диалоге в дереве слева выбираете Debugger, справа в поле Parameters и указываете -cleaninstall
-
Anatoliy отреагировална dnekrasov в Перевод VCL приложения на FMX. Подводные камни, стоит ли?
Совершенно верно
-
Anatoliy отреагировална OnePeople в Перевод VCL приложения на FMX. Подводные камни, стоит ли?
Не знаю куда уж проще?
Кидаешь на форму StyleBook и в свойствах формы выставляешь его.
Создаешь свой прогрессбар например.
Кликаешь по нему правой кнопкой мыши и выбираешь изменить стиль по умолчанию или же создать свой новый стиль для компонента.
Затем редактируешь его как компонент содержащий в себе другие компоненты, причем не обязательно как я сделал для примера из прямоугольников, можно сделать и из картинок, главное чтобы названия StyleName совпадали c родными.
-
Anatoliy отреагировална #WAMACO в TMapView завешивает программу
Сходите на Android Studio! После мытарств там, ждем обратно! ?
По-делу.... что конкретно не получается?
-
Anatoliy отреагировална #WAMACO в TMapView завешивает программу
Отключите создание маркеров при переключении на другую задачу...
При возвращении... продолжайте выставлять!
-
Anatoliy отреагировална dnekrasov в Перехват сообщений в Windows
Делаем как обычно, если надо переопределить какое-то событие окна
interface uses {$IFDEF MSWINDOWS} Winapi.Windows, Winapi.Messages, FMX.Platform.Win, {$ENDIF} System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs; type TMainForm = class(TForm) private procedure CreateHandle; override; {$IFDEF MSWINDOWS} procedure WMIMENotify(var Msg: TMessage); message WM_IME_NOTIFY; {$ENDIF} public end; var MainForm: TMainForm; implementation {$R *.fmx} {$IFDEF MSWINDOWS} var OldWndProc: Pointer = nil; function NewWndProc(Wnd: HWND; Msg: UINT; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall; var Mess : TMessage; begin case Msg of WM_IME_NOTIFY: begin Mess.Msg := Msg; Mess.WParam := wParam; Mess.lParam := lParam; Mess.Result := 0; MainForm.Dispatch(Mess); Result := Mess.Result; end; else Result := CallWindowProc(OldWndProc, Wnd, Msg, WParam, LParam); end; end; {$ENDIF} { TMainForm } procedure TMainForm.CreateHandle; begin inherited CreateHandle; {$IFDEF MSWINDOWS} OldWndProc:= Pointer(SetWindowLong(WindowHandleToPlatform(Handle).Wnd, GWL_WNDPROC, Integer(@NewWndProc))); {$ENDIF} end; {$IFDEF MSWINDOWS} procedure TMainForm.WMIMENotify(var Msg: TMessage); begin {что-то делаем} end; {$ENDIF}
-
Anatoliy отреагировална Slym в Delphi 10.1 FMX android данные с сервера в base64 закодирован хранится pdf как его раскодировать и сохранить на устройстве
1. для упрощения кода работы с JSON давно можно использовать сложные пути
ABase64:=JSON.GetValue<string>('body.nextStep.pdf');
2. ну нельзя так:
AStreamSource.WriteBuffer(Pointer(ABase64)^, Length(ABase64) * 2); так безопасней AStreamSource:=TBytesStream.Create(TEncoding.UTF8.GetBytes(ABase64));
3. И сохранять лучше сразу в TFileStream - меньше расход памяти
4. не забываем finally Free (их выше нету)... хоть оно и может AUTOREFCOUNT (а может и нет!), но правила хорошего тона никто не отменял
-
Anatoliy отреагировална Евгений Корепов в Delphi 10.1 FMX android данные с сервера в base64 закодирован хранится pdf как его раскодировать и сохранить на устройстве
Накидал вам функцию (проверил - работает):
unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.JSON, System.NetEncoding, System.IOUtils; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } function ExtractPDFContentBase64(const AJSONString : String; out AFileName : String) : boolean; end; var Form1: TForm1; implementation {$R *.fmx} function TForm1.ExtractPDFContentBase64(const AJSONString : String; out AFileName : String) : boolean; Var AJSONObject, AJSONObjectBody, AJSONObjectNextStep : TJSONObject; ACode : Integer; AStreamSource, AStreamDest : TMemoryStream; ADecodeByteCount : Integer; ABase64 : String; begin // Выставляем результат функции в False Result:=False; // Парсим JSON строку в JSON объект AJSONObject:=TJSONObject(TJSONObject.ParseJSONValue(AJSONString)); if Not Assigned(AJSONObject) then exit; // Проверям поле code на предмет содержания http code 200 (это я домыслил, можно удалить) if Not AJSONObject.TryGetValue('code', ACode) then exit; if ACode <> 200 then exit; // Извлекаем body if Not AJSONObject.TryGetValue('body', AJSONObjectBody) then exit; if Not Assigned(AJSONObjectBody) then exit; // Из body извлекаем instanceId - будем использовать как имя файла if Not AJSONObjectBody.TryGetValue('instanceId', AFileName) then exit; // Склеиваем полное имя файла // AFileName:=TPath.Combine(TPath.GetSharedDownloadsPath, AFileName + '.pdf'); AFileName:=TPath.Combine(TPath.GetSharedDownloadsPath, AFileName + '.jpeg'); // Я тестил на картинке // Извлекаем nextStep if Not AJSONObjectBody.TryGetValue('nextStep', AJSONObjectNextStep) then exit; if Not Assigned(AJSONObjectNextStep) then exit; // Содаем поток-источник и помещаем в него base64 AStreamSource:=TMemoryStream.Create; if Not AJSONObjectNextStep.TryGetValue('pdf', ABase64) then exit; AStreamSource.WriteBuffer(Pointer(ABase64)^, Length(ABase64) * 2); // Длину строки умножаем на 2, так как строка юникод AStreamSource.Position:=0; // Создаем поток-назначение AStreamDest:=TMemoryStream.Create; // Декодируем base64 из текста в потоке AStreamSource в бинарные данные в поток AStreamDest ADecodeByteCount:=TNetEncoding.Base64.Decode(AStreamSource, AStreamDest); // Проверяем сколько байт было декодировано if (ADecodeByteCount > 0) then begin AStreamDest.Position:=0; try // Сохраняем поток с бинарными данными в файл с ранее собранным именем AStreamDest.SaveToFile(AFileName); except exit; end; end; // Выставляем результат функции в True Result:=True; end; procedure TForm1.FormCreate(Sender: TObject); Var AJSONString : String; AFileName : String; begin AJSONString:=TFile.ReadAllText('d:\JSON_example.txt'); if ExtractPDFContentBase64(AJSONString, AFileName) then begin // Что то делаем с PDF файлом AFileName end; end; end.
-
Anatoliy отреагировална ENERGY в Приложение для получения информации о составе основных комплектующих, входимостей по моделям автобусов и троллейбусов МАЗ на смартфонах v.11.52.
Зайдите в гугл картинки и поищите что-то типа mobile UI design.
Также у Delphi есть пакет премиум скинов - Firemonkey premium styles.
-
Anatoliy отреагировална kami в Delphi 10.1 FMX android данные с сервера в base64 закодирован хранится pdf как его раскодировать и сохранить на устройстве
А в чем загвоздка?
Достать поле из JSON - вроде просто, обычная работа с JSON далеко не самой сложной структуры.
Раскодировать из Base64 - uses System.NetEncoding; TNetEncoding.Base64.DecodeStringToBytes и сохранить их в файл
Потом открыть файл через интент.
-
Anatoliy отреагировална ENERGY в TScrollBox или TPresentedScrollBox поворот на 180
А зачем скрол переворачивать то?
TPresentedScrollBox у него есть Content, установите Content высоту на размер больше, добавляйте вниз сообщение (в невидимую область ниже) и программно с анимацией прокручивайте вниз.
-
Anatoliy отреагировална Равиль Зарипов (ZuBy) в [DELPHI FMX Android] [6.0] Не удается загрузить SSL библиотеку
Вообще не совсем понятно зачем делать отправку письма из приложения.
Я придерживаюсь мнения что захардкоренные места не нужно держать в приложении, при обновлении параметров smtp сервера вы никак не сможете починить быстро
самый простой способ это хостинг ну или текущий сайт компании, там реализовать отправку письма как предлагал @ENERGY
-
Anatoliy отреагировална ENERGY в В Embarcadero отсутствует Android Service
Совет. Не пишите под Android на Delphi ниже последней версии Берлина (10.1 upd 2).
А если выше, то точно не Токио первых версий, только последние версии Токио, иначе все будет тормозить и глючить.
-
Anatoliy отреагировална #WAMACO в [DELPHI FMX Android] [6.0] Не удается загрузить SSL библиотеку
Слишком много ЕСЛИ....
Задачи разные бывают и приложения тоже. Мы говорим про конкретную задачу отправки письма из приложения. Способов несколько, использование Indy позволяет это сделать без стороннего хостинга.
А через неделю и Ваш хостинг может загнуться, ввиду не оплаты, форс мажора и т.д.
-
Anatoliy отреагировална Barbanel в Отладка Indy
Если вы видите что в одной процедуре кружки есть, а в другой нет - это значит что этот код (который без кружка) не скомпилирован и в данном не используется.
Говоря по другому, вы не можете эту процедуру продебажить потому что ее никто не вызывает (ни вы, ни сам компонент).
В данном случае - это не глюк)
-
Anatoliy отреагировална Barbanel в [Apple store]отказ публикации из-за локации
Я не знаю что такое CoreLocation и что оно делает, но беглый гуглеж дает некоторые ссылки.
Вы это: http://edn.embarcadero.com/article/41715 смотрели?
PS
Ваше приложение предоставляет инфо о траве, которая нелегальна во всех странах где приложение доступно.
Ключевое слово "во всех". Вы уверены что вы правильно настроили страны?