Перейти к содержанию

Dev

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

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

  • Посещение

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

    1

Активность репутации

  1. Like
    Dev получил репутацию от Ingalime в Требования к целевому уровню API с августа 2018 г.   
    кстати доступ в интернет тоже есть в этом списке и если он отмечен в Uses Permissions, то он будет работать сразу и без вопросов.
    https://developer.android.com/guide/topics/permissions/overview. 
    в чем противоречие? вы наверно невнимательно прочитали, я не писал что разрешения все равно надо запросить, я писал что если даже их запросить...
    но все же прошу извинить если не доходчиво изложил мысль.
     
  2. Like
    Dev выдал репутацию mazayhin в Требования к целевому уровню API с августа 2018 г.   
    Странно, что смогли разобраться с тем, что надо заменять в папках студии, ну и подключать уже кастомное активити в манифесте.
    Из DW надо подключить только пару файлов и все.
    Вы в манифесте добавили эти разрешения?
    И да, запрашивать у пользователя их не надо (потому, думаю, запрос и не выдает система). Для всех ваших разрешений указано Protection level: normal. Запрос нужен для тех, что dangerous.
    https://developer.android.com/reference/android/Manifest.permission.html#ACCESS_WIFI_STATE и далее по тексту
    https://developer.android.com/guide/topics/permissions/overview (If your app lists normal permissions in its manifest (that is, permissions that don't pose much risk to the user's privacy or the device's operation), the system automatically grants those permissions to your app. )
  3. Like
    Dev выдал репутацию mazayhin в Требования к целевому уровню API с августа 2018 г.   
    Ставьте целевой уровень 26 и используйте KastriFree https://github.com/DelphiWorlds/KastriFree
  4. Thanks
    Dev выдал репутацию Andrey Efimov в Простая проверка подключения к интернету перед выполнением IdHTTP1.get   
    Ну, не знаю где вы накосячили, но я сегодня как раз добавлял свой класс в проект и всё отлично работает...
    Что значит все Pasы?
    Если второй вариант у вас, это https://github.com/AndrewEfimov/Android-API/tree/master/ActiveNetworkInfo, то нужно:
    положить файл ActiveNetworkInfo.Android.pas в папку вашего проекта подключить этот файл в Uses вашего проекта Добавить разрешение в Uses Permissions: ACCESS_NETWORK_STATE использовать в коде проекта - TActiveNetworkInfo.метод (например, TActiveNetworkInfo.IsConnected)  
    p.s. Использую Delphi Berlin 10.1 Update 2
  5. Like
    Dev выдал репутацию Andrey Efimov в [Android] Как свернуть приложение?   
    Вот так:
    uses   Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers; procedure TForm2.Button1Click(Sender: TObject); var   Intent: JIntent; begin   Intent := TJIntent.Create;   Intent.setAction(TJIntent.JavaClass.ACTION_MAIN); Intent.addCategory(TJIntent.JavaClass.CATEGORY_HOME);   Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);   SharedActivity.startActivity(Intent); end; но на 4.4 поведение немного другое... (Выскакивает табличка с выбором лаунчера). Хотя не известно на всех устройствах так или только у меня...
     
    В справке написано, что должен открываться домашний экран, по всей видимости, тем, у кого стоит несколько Лаунчеров даётся выбор.
  6. Like
    Dev выдал репутацию Martifan в [Android] Как свернуть приложение?   
    Нашел еще один способ:
      Uses     Androidapi.Helpers; procedure TfMain.SpeedButton11Click(Sender: TObject); begin   SharedActivity.moveTaskToBack(True); end;
  7. Like
    Dev получил репутацию от HyperZen в Это приложение было создано для более ранней версии Android   
    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="26" />
  8. Thanks
    Dev выдал репутацию Евгений Корепов в Не работает onClose (Android)   
    Для этого есть событие TForm.OnSaveState http://docwiki.embarcadero.com/Libraries/Rio/en/FMX.Forms.TForm.OnSaveState
  9. Like
    Dev выдал репутацию krapotkin в Фреймворк для стандартного ListView   
    Всем привет!
    После долгого творческого запоя я запилил альфу либы, которая позволяет юзать обычный, не-генномодифицированный ListView.
    Данные подаются в виде модели данных, описание раскладки итема лежит в JSON.

    Для работы пишется примитивный наследник класса-адаптера, который биндит данные модели на элементы из JSON. Я решил, что руками делать это дешевле чем через RTTI
    { TMyAdapter } procedure TMyAdapter.SetupDrawableContent(const ADrawable: TListItemDrawable; const AData: TMyData); begin if SameText( ADrawable.Name, 'text') then begin (ADrawable as TListItemText).Text := AData.Text; end else if SameText( ADrawable.Name, 'detail') then begin (ADrawable as TListItemText).Text := AData.Detail; end else if SameText( ADrawable.Name, 'balance') then begin (ADrawable as TListItemText).Text := FormatFloat('0.00', AData.Balance); end else if SameText( ADrawable.Name, 'reserved') then begin (ADrawable as TListItemText).Text := FormatFloat('0.00', AData.Reserved); end end; Главная хитрость и отличие от стандартного DynamicAppearance+LiveBinding - переменная высота итемов ListView и использование арифметики в описании раскладки.
    Можно указать Detail.Y  = Text.Bottom + 5, ItemHeight = Detail.Bottom + 10, Detail.W = ItemWidth/2 - X
    {"Kind":"rect","Name":"BonusRect","Value":"", "Place":{"X":"itemwidth*3/4","Y":"Text.Y","W":"ItemWidth/4-5","H":"50"}, "BorderColor":"#FF005500", "Color":"lime", "LineWidth":3}, {"TextHAlign":2,"TextVAlign":1,"Kind":"text","Name":"Balance","Value":"", "Place":{"X":"BonusRect.x+5","Y":"Text.Y","W":"BonusRect.w-10","H":"50"}, "WordWrap":true, "Color" :"Black", "Font":{"Size":18,"Style":""}} ], "ItemHeight":"detail.bottom+10", Это дает довольно гибкую систему. Не на все случаи жизни, но все, что нужно, можно после автоматической раскладки дополнительно приписать в OnUpdateObjects 
    Код для работы примерно такой
    procedure TForm1.FormCreate(Sender: TObject); begin data:= TMyDataList.CreateFromFile(ExePath()+'data.json'); // загрузка в модель данных Adapter := TMyAdapter.Create(lvWallets, data.Items, ExePath()+'pattern.json'); // создание адаптера и загрузка шаблона Adapter.Pattern.SetupListView(lvWallets); // задать отступы и разную мелочь Adapter.ResetView(); // здесь в цикле из модели данных создается нужное количество итемов ListView end; procedure TForm1.lvWalletsUpdatingObjects(const Sender: TObject; const AItem: TListViewItem; var AHandled: Boolean); begin Adapter.SetupContent(AItem); // загрузить текст, картинки и другое содержимое в элементы итема Adapter.Pattern.DoLayout(AItem); // поправить раскладку в соответствии с содержимым элементов итема end; Для использования кроме стандартных - текст, картинка, кнопка - создано несколько дополнительных элементов итема - прямоугольник, круг, уголок, линия.
    Отличие от ModernLV - , 
    1) все происходит без правки системных файлов
    2) пока нет колонок и других особых изысков.
    На результат работы смотреть тут. Исходники пока не причесаны, будут чуть позже
     
    ListViewFramework.7z
  10. Like
    Dev выдал репутацию krapotkin в Фреймворк для стандартного ListView   
    вторая версия демо
    -работа над ошибками
    -устранил утечки памяти
    -расширил функционал
    -добавил картинки
    -совместимость с Android
    Приложил EXE и APK
    Скорее всего, для 100500 записей не потянет, т.к. слишком много арифметики для раскладки каждого элемента на каждом итеме, но для сотни - хватает.
    ListViewTest2.7z
    pasFiles.rar
  11. Thanks
    Dev выдал репутацию x11 в Как добавить «ярлыки приложения» для Android в приложении FMX   
    Может кому пригодится
    https://blog.andreamagni.eu/2019/02/how-to-add-android-app-shortcuts-to-a-fmx-application/

  12. Like
    Dev выдал репутацию Barbanel в Runtime permissions in Delphi 10.3 Rio   
    В поставке 10.3 есть примеры работы с правами.
    Один из них можно найти по такому пути:
    C:\Users\Public\Documents\Embarcadero\Studio\20.0\Samples\Object Pascal\Multi-Device Samples\Media\PhotoEditorDemo
    Что интересно, этот же код можно без изменений использовать под любой другой платформой.
    На других платформах приложение будет считать что ему выдали все права, и соответственно запускать все коллбеки без каких-либо вопросов.
  13. Like
    Dev выдал репутацию Евгений Корепов в Runtime permissions in Delphi 10.3 Rio   
    Для полноценной работы вам нужно добавить параметры в вызов (иначе вы не узнаете дал ли пользователь разрешение или нет)
    PermissionsService.RequestPermissions([FPermissionWrite, FPermissionRead], nil); Вот так:
    PermissionsService.RequestPermissions([FPermissionWrite, FPermissionRead], PermissionRequestResult, ExplainReason); PermissionRequestResult - это обработка ответа пользователя
    procedure TForm.PermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>); begin if (Length(AGrantResults) = 2) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) then begin // Ура! Пользователь дал разрешение на оба наших запроса. Выставялем глобальные флаги (к примеру) которые сигнализируют что можно читать/писать карту памти end else TDialogService.ShowMessage('Не возможно продолжить работу, требуемые разрешения не получены') end; И ExplainReason - если пользователь сдуру не дал разрешение, то вам нужно объяснить ему что без этого приложение работать не будет.
    procedure TForm.ExplainReason(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc); begin TDialogService.ShowMessage('Приложению нужен доступ к карте памяти для таких то целей, иначе приложение не сможет работать. Зайдите в настроки Андроид и дайте разрешение на доступ', procedure(const AResult: TModalResult) begin APostRationaleProc; end) end;  
  14. Like
    Dev выдал репутацию yooSee в Runtime permissions in Delphi 10.3 Rio   
    Всем привет, вот и я решил внести свою лепту в жизнь форума и сегодня мы разберемся с разрешениями на Delphi Rio под Андроид. 
    Для примера мы будем использовать разрешения на чтение и запись с памяти устройства, для начала в нашем проекте выставим в Delphi>Project>Application>Uses Permissions галочки на Read External Storage и Write External Storage.
    в uses проекта добавьте следующее
    uses System.Permissions, Androidapi.Jni.Os, Androidapi.Helpers, далее  создадим переменные
    var Form: TForm; .... FPermissionWrite: string; FPermissionRead: string; в Form.Create добавим следующий код
    procedure TForm.FormCreate(Sender: TObject); begin FPermissionWrite := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE); //Значение на запись FPermissionRead := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE); //Значение на чтение end; и теперь сам не посредственно запрос на подтверждение наших прав
    procedure TForm.Button1Click(Sender: TObject); begin PermissionsService.RequestPermissions ([FPermissionWrite, FPermissionRead], nil); end; //это вызовет окно с запросом разрешения прав ну и для проверки бросим на форму TMemo и пару TButton , в них реализуем сохранение и чтение из файла с памяти устройства
    procedure TForm.Button1Click(Sender: TObject); begin Memo1.Lines.LoadFromFile(TPath.Combine(TPath.GetSharedDocumentsPath, 'test.txt')); end; procedure TForm.Button2Click(Sender: TObject); begin Memo1.Lines.SaveToFile(TPath.Combine(TPath.GetSharedDocumentsPath, 'test.txt')); end; P.S. Напоминаю что для работы TPath нам понадобится подключить в Uses 
    uses System.system.ioutils; Надеюсь материал будет полезен! 
     
     
     

    video_2019-02-08_00-11-36.mp4 Permissions.zip
  15. Like
    Dev получил репутацию от Ingalime в Анимированная смена форм   
    https://www.youtube.com/watch?v=YU7MlY58n9U&t=59s
  16. Like
    Dev выдал репутацию dnekrasov в [Windows] Запретить окну переход в прозрачный режим   
    Недавно решил одну проблемку, которая долго мучала - решил поделиться, может кому ещё пригодится.
    При работе с двумя мониторами или с монитором и проектором часто возникает необходимость запретить окну "исчезать" при наведении курсора мыши на миниатюру другого приложения в панели задач. Чтобы это сделать надо:
    uses ... Winapi.DwmApi ... TMainForm = class(TForm) ... protected procedure CreateHandle; override; ... end; ... procedure TMainForm.CreateHandle; var Val, Res: Integer; begin inherited CreateHandle; Val := 1; Res := DwmSetWindowAttribute(FormToHWND(Self), DWMWA_EXCLUDED_FROM_PEEK, @Val, SizeOf(Val)); {$IFDEF DEBUG} if Res <> S_OK then ShowMessage(SysErrorMessage(Res)); {$ENDIF} end; Спасибо @Alex7wrt за наводку
  17. Like
    Dev выдал репутацию Brovin Yaroslav в С днем рождения Андрей Ефимов ???   
    Хочу от всей души поздравить с днем рождения нашего модератора Андрея Ефимова @Andrey Efimov. Человек, на которого можно положиться и который всегда готов прийти на помощь. Из года в год помогает нашему форуму становиться лучше. 
    С днем рождения! Успехов тебе в работе, в личных делах. И не забывать про Делфи!
  18. Like
    Dev получил репутацию от dnekrasov в Анимированная смена форм   
    https://www.youtube.com/watch?v=YU7MlY58n9U&t=59s
  19. Like
    Dev выдал репутацию Barbanel в Изменение разрешения экрана   
    Вам нужны стили для каждого коэффициента масштабирования.
    Обычно по дефолту в стилях уже все готово (возможно вам нужно что-то настроить для своих кастомных элементов, или если ваш интерфейс в корне отличается от того что предлагают стили).
    Более ничего не нужно. Все происходит автоматически.
    Если "само" автоматически не происходит, то опишите что вам требуется и в чем именно проблема.
  20. Like
    Dev выдал репутацию Barbanel в Изменение разрешения экрана   
    Из-за логического масштабирования.
    Вот здесь описано про это подробнее.
  21. Like
    Dev выдал репутацию Brovin Yaroslav в Получаем разрешение экрана устройства, логические и физические размеры экрана в FireMonkey   
    Введение
    Появление экранов повышенной плотность физических точек, привело с одной стороны к проблеме адаптации графического интерфейса под разные разрешения экранов при их одинаковых физических размерах, с другой к увеличению четкости и качества картинки.
     
    Например, если раньше на iPhone 3 при размере экрана 3,5 дюйма позволял отобразить 320х480 точек, то на устройстве iPhone 4 при таком же физическом размере экрана, экран мог уже отображать 640х960 точек. Это хорошо видно на увеличенном изображении обычного экрана и ретина экрана на рисунке ниже (слева - не ретина, справа - ретина (2х)). Справа количество физических точек ровно в четыре раза больше, чем слева:

     
    Для разработчика это могло означать, что интерфейс привязанный к разрешению 320х480 на Retina экране будет занимать только четверть экрана. Естественно, что использование разрешения экрана в физических координатах не удобно с этой точки зрения. Именно по этому появились логические координаты, которые гарантируют, что тот же пользовательский интерфейс для iPhone 3, будет иметь такие же размеры (физические) и на экране с ретиной.
     
    FireMonkey работает в логических координатах. Это означает, что на iPhone 3 - 4 мы работаем с логическим разрешением 320x480 точек. Однако, при отображении интерфейса на iPhone 4 c (с двойной плотностью пикселей по сравнению с iPhone 3), интерфейс автоматически масштабируется на физическое разрешение 640х960 с коэффициентом масштабирования равным 2. 
     
    Практика
    Теперь посмотрим, как получить всю эту информацию. Вся информация об экране (логический размер и коэффициент масштабирования) находится в сервисе IFMXScreenService. 
    Чтобы получить физическое разрешение экрана, нужно логический размер умножить на коэффициент масштабирования.
     
    Код ниже показывает, как получить доступ к этому сервису и извлечь требуемые параметры:
    var ScreenService: IFMXScreenService; LogicScreenSize: TPoint; ScreenScale: Single; begin // Запрашиваем сервис экрана, для получения информации о размере и текущем коэффициенте масштабирования if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then begin LogicScreenSize := ScreenService.GetScreenSize.Round; ScreenScale := ScreenService.GetScreenScale; LabelLogicScreenSize.Text := Format('Логический размер: %d, %d', [LogicScreenSize.X, LogicScreenSize.Y]); LabelPhysicScreenSize.Text := Format('Физический размер: %f, %f', [LogicScreenSize.X * ScreenScale, LogicScreenSize.Y * ScreenScale]); LabelScreenScale.Text := Format('Коэффициент масштабирования: %f',[ScreenService.GetScreenScale]); end; end; Результат кода приведен на снимке экранов ниже для iPad устройств с ретиной экраном и без:

  22. Like
    Dev получил репутацию от d7d1cd в Анимированная смена форм   
    https://www.youtube.com/watch?v=YU7MlY58n9U&t=59s
  23. Like
    Dev получил репутацию от Barbanel в Анимированная смена форм   
    https://www.youtube.com/watch?v=YU7MlY58n9U&t=59s
  24. Thanks
    Dev выдал репутацию Slym в Артефакты на экране (Android)   
    Боролись как-то с артефактами отображения (мы их прозвали "крокодилами" из-за сходства на первом скриншоте с этим багом)...
    Могли отображаться также левые спрайты, или обрезки скролившихся контролов...
    Коллега выяснил что не надо трогать Form.Fill, из-за переключения в недрах FMX нативной и не нативной канвы: если нужен фон - брось Rect по контенту и в нем делай заливку...
  25. Like
    Dev выдал репутацию Brovin Yaroslav в [FGX Native] Выступление с демонстрацией библиотеки на запуске RAD Studio 10.3   
    Рад со всеми поделиться, что 13 ноября я принимаю участие в запуске RAD Studio 10.3 в Москве и выступаю с двумя докладами: один по FMX, второй про мою библиотеку FGX Native. 
    На мероприятии в живую покажу возможности библиотеки, поговорим об особенностях, планах и сделаем нативное андроид приложение в прямом эфире.
    Не пропустите. Ссылка на регистрацию: http://softlinemail.ru/delivery/010918/zayvka1960/index.html
×
×
  • Создать...