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

Android

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

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

  • Посещение

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

    3

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

  1. Like
    Android отреагировална qz5 в Вышла Community Edition версии 10.4.2 (Delphi & C++Builder)   
    Официальная новость - Delphi & C++Builder FREE Community Editions Updated to Version 10.4.2 Are Now Available!
    Пока надо будет получать для этой версии новые ключи, старые от 10.3.3 не подходят
     
  2. Thanks
    Android получил реакцию от Новый пользователь в Как получить IMEI?   
    вовсе необязательно ИМЕННО там вставлять
  3. Thanks
    Android отреагировална slav_z в FMX: Скроллинг и нажатия   
    Все разработчики при работе с FMX рано или поздно сталкиваются с одной и той же проблемой: необходимо исключить "случайное" срабатывание нажатий элементов внутри скроллбокса во время его скроллинга. Идут годы, а решения так и нет. Давайте попробуем это исправить. Поехали!
    Запускаем IDE, создаем новый проект, кидаем на форму TVertScrollBox и на него чего-нибудь побольше... запускаем на мобильном устройстве, пытаемся скроллировать,

    получаем проблемы в виде срабатывания разных событий типа OnClick элементов.
    Решение состоит в том, чтобы сделать элементы "невидимыми" для событий связанных с действиями пользователя с экраном во время скроллинга.
    Делаем следующее:

    Все. Переносим код в базовую форму, делаем его более гибким, убираем все те костыли, которые мы уже успели сделать ранее...
    Удачи!
    https://github.com/slav-libx/scroll-click.git
  4. Thanks
    Android отреагировална Freezer_86 в TakePhotoFromCameraAction   
    Доброго времени суток. Столкнулся с такой же проблемой в 10.4.2. В стандартном примере все работает, а в мигрированном приложении из 10.3.3 - приложение всегда ловит отмену запроса на фото. Я так понимаю где-то не хватает прав для временного файла. 
    Путем долгих и мучительных экспериментов и курением доки организовал эту всю штуку через нативные интенты.
    Код вырезан из рабочего проекта, по этому извините если что-то не так. Но смысл должен быть понятен.
    Здесь кроме самого фото еще реализовано автоматическое поворачивание картинки по Exif-даным, относительно того в каком положении был телефон.
    Так же очень важно не забыть выставить права в опциях приложение и подключить Secure File Sharing в Entitlement List. С Uses секцией надеюсь разберетесь, не уверен что нужно для Вашей задачи все из того что я кинул.
    Uses .... Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.App, Androidapi.JNI.JavaTypes, Androidapi.Helpers, FMX.Platform.Android, System.Permissions, Androidapi.JNI.Os, Androidapi.JNI.Net, Androidapi.JNI.Support, Androidapi.JNI.Provider, Androidapi.JNIBridge, FMX.Helpers.Android, FMX.Surfaces, Androidapi.JNI.Media; TfmMain = class(TForm) ... procedure FormCreate(Sender: TObject); procedure btnPhotos_ShowCameraClick(Sender: TObject); ... protected FMessageSubscriptionID : integer; FPermissionWriteExternalStorage: string; FPermissionCamera: string; FPermissionReadExternalStorage: string; FphotoUri :Jnet_Uri; JFileName: JFile; procedure DisplayRationale(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc); procedure TakePicturePermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>); procedure TakePicturePermissionRequestAfterINitResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>); procedure HandleActivityMessage(const Sender: TObject; const M: TMessage); function OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean; end; procedure TfmMain.FormCreate(Sender: TObject); begin FPermissionCamera := JStringToString(TJManifest_permission.JavaClass.CAMERA); FPermissionReadExternalStorage := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE); FPermissionWriteExternalStorage := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE); ... end; procedure TfmMain.HandleActivityMessage(const Sender: TObject; const M: TMessage); begin if M is TMessageResultNotification then begin OnActivityResult(TMessageResultNotification(M).RequestCode, TMessageResultNotification(M).ResultCode, TMessageResultNotification(M).Value); end; end; function TfmMain.OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean; procedure SetPhotoData(); var jBmp : JBitmap; xSurface : TBitmapSurface; vImage : TImage; xExif : JExifInterface; sOrientation : JString; rotationAngle, orientation : integer; sFile : string; ScreenService: IFMXScreenService; begin if RequestCode = 1001 then begin if ResultCode = TJActivity.JavaClass.RESULT_OK then begin if FphotoUri <> nil then begin jBmp := TJImages_Media.JavaClass.getBitmap(SharedActivity.getContentResolver, FphotoUri); if jBmp <> nil then begin xSurface := TBitmapSurface.Create; try JBitmapToSurface(jBmp, xSurface); vImage := TImage.Create(nil); try vImage.Bitmap.Assign(xSurface); sFile := JStringToString(JFileName.getAbsolutePath); xExif := TJExifInterface.JavaClass.init(StringToJString(sFile)); sOrientation := xExif.getAttribute(TJExifInterface.JavaClass.TAG_ORIENTATION); if sOrientation = nil then orientation := TJExifInterface.JavaClass.ORIENTATION_NORMAL else orientation := StrToIntDef(JStringToString(sOrientation), 0); rotationAngle := 0; if orientation = TJExifInterface.JavaClass.ORIENTATION_ROTATE_90 then rotationAngle := 90; if orientation = TJExifInterface.JavaClass.ORIENTATION_ROTATE_180 then rotationAngle := 180; if orientation = TJExifInterface.JavaClass.ORIENTATION_ROTATE_270 then rotationAngle := 270; if rotationAngle <> 0 then vImage.Bitmap.Rotate(rotationAngle); //Готовое фото уже в vImage - выводим куда нужно imPhotos_Photo.Bitmap.Assign(vImage.Bitmap); finally vImage.Free; end; finally xSurface.Free end{try..finally}; end else begin //не вдалось завантажити картинку TDialogService.ShowMessage('Не вдалось завантажити картинку'); end{if..else}; end else begin //пустий Uri TDialogService.ShowMessage('Пустий Uri'); end{if..else}; end else begin TDialogService.ShowMessage('Відмовились робити фото'); end{if..else}; end{if}; end; begin Result := False; TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FMessageSubscriptionID); FMessageSubscriptionID := 0; if RequestCode = 1001 then begin // робота з камерою - отримання фото SetPhotoData(); exit; end; ... end; procedure TfmMain.TakePicturePermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>); var intent : jintent; Authority: JString; begin // 3 permissions involved: CAMERA, READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE if (Length(AGrantResults) = 3) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) and (AGrantResults[2] = TPermissionStatus.Granted) then begin //створюємо "намір" отримання фото з камери intent := TJIntent.JavaClass.init; intent.setAction(TJMediaStore.JavaClass.ACTION_IMAGE_CAPTURE); //створюємо тимчасовий файл JFileName := TJFile.JavaClass.createTempFile(StringToJString('picture'), StringToJString('.jpg')); //отримуємо опис прав по файлам Authority := StringToJString(JStringToString(TAndroidHelper.Context.getApplicationContext.getPackageName) + '.fileprovider'); //отримуємо URI-до тимчасового файлу в контексті нашої аплікації FphotoUri:= TJFileProvider.JavaClass.getUriForFile(TAndroidHelper.Context, Authority, JFileName); //кажемо що наш "намір" має писати дані в цей тимчасовий файл intent.putExtra(TJMediaStore.JavaClass.EXTRA_OUTPUT, TJParcelable.Wrap((FphotoUri as ILocalObject).GetObjectID) ); //реєструємось на отримання подій FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification, HandleActivityMessage); //стартуємо наш "намір" MainActivity.startActivityForResult(intent, 1001); end else TDialogService.ShowMessage('Не надані необхідні для роботи дозволи!'); end; procedure TfmMain.DisplayRationale(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc); var I: Integer; RationaleMsg: string; begin for I := 0 to High(APermissions) do begin if APermissions[I] = FPermissionCamera then RationaleMsg := RationaleMsg + 'The app needs to access the camera to take a photo' + SLineBreak + SLineBreak else if APermissions[I] = FPermissionReadExternalStorage then RationaleMsg := RationaleMsg + 'The app needs to read a photo file from your device'; end; // Show an explanation to the user *asynchronously* - don't block this thread waiting for the user's response! // After the user sees the explanation, invoke the post-rationale routine to request the permissions TDialogService.ShowMessage(RationaleMsg, procedure(const AResult: TModalResult) begin APostRationaleProc; end); end; procedure TfmMain.btnPhotos_ShowCameraClick(Sender: TObject); begin PermissionsService.RequestPermissions( [FPermissionCamera, FPermissionReadExternalStorage, FPermissionWriteExternalStorage], TakePicturePermissionRequestResult, DisplayRationale ); end; P.S. возможно нужно будет вставить в манифест:
    android:requestLegacyExternalStorage="true"  
  5. Thanks
    Android отреагировална qz5 в TPath.GetSharedDownloadsPath в Android 11 не находит файлы   
    Вот еще почитать на эту тему:
    https://developer.android.com/training/data-storage/use-cases
    и
    https://developer.android.com/about/versions/11/privacy/storage
    Так что после Target SDK 30 вообще старый код работать не будет... Нужно будет переписывать код работы с файлами.
  6. Thanks
    Android отреагировална qz5 в Selenium Webdriver для Firemonkey?   
    Пробежался.
    Да, можно обычным Webview управлять, как Вы делали через Селениум. Селениум у Вас просто удобный инструмент для доступа к режиму удаленного управления браузера. Можно и без него, например через Chrome DevTools.
    Включить то программным образом режим отладки можно через команду setWebContentsDebuggingEnabled(true), но дальше начинаются сложности, остальное видимо возможно только, если писать на Java.
    Дальше я просто не знаю. Там уже темный лес, но в любом случае лезьте туда. только если знаете Java.
    Т.е. режим удаленной отладки, который использует Селениум, и так уже встроен в Webview (веб-браузер, который встраивается в приложения), но предполагается, что его используют не из самой программы, а удаленно. Либо через Chrome DevTools, либо через такие штуки как Селениум.
    p.s. это мои измышления, может реальность и другая. Я еще порою в этом направлении, но сомневаюсь, что смогу найти быстрое решение...
    Так что пока предлагаю переписать все на JS и запускать через EvaluateJavaScript. Там тоже есть свои подводные камни (например получение результата из скрипта), но это по-крайней мере можно сделать в Delphi.
  7. Thanks
    Android отреагировална qz5 в Selenium Webdriver для Firemonkey?   
    У стандартного Webview есть процедура включения удаленного управления, через который Селениум работает. Называется setWebContentsDebuggingEnabled.
    В Делфи реализовано, но я не пробовал его использовать. Сейчас пороюсь, возможно ли.
  8. Thanks
    Android отреагировална qz5 в Selenium Webdriver для Firemonkey?   
    Я использую немного обычный Webview
    Про Селениум знаю, но для чего бы его использовать в Firemonkey? Может быть, если мне нужно будет, то попробую примастрячить (я уже кое какие сторонние от Firemonkey штуки подключил в Андроид, может быть и это сделаю).
    Я знаю, что его используют например тестировщики, но что оно дает разработчикам программ?
  9. Thanks
    Android отреагировална krapotkin в Не подключается Huawei   
    Короче, действуем примерно так.
    Я надеюсь, что базовые действия - скачать google latest adb driver - мы уже провели, но наш No- или Brand- name телефон недоступен
    Тогда
    1) идем в диспетчер устройств, находим там наше невстающее устройство, кликаем дважды,  и на закладке Сведения выбираем свойство ИД оборудования. Копируем себе
    что-то типа 

    2)  идем к файлам того самого драйвера, открываем android_winusb.inf 
    находим разделы
    [Google.NTx86] и [Google.NTamd64]
    и вписываем туда, прямо в оба
    ;galaxy tab a 2019
    %SingleAdbInterface%        = USB_Install, USB\VID_04E8&PID_6866
    %CompositeAdbInterface%     = USB_Install, USB\VID_04E8&PID_6866&MI_01
     
    3) делаем обновить драйвер, выбираем вариант Вручную, и указываем тот модифицированный файл
    если не берет автоматом, то "Выбрать из списка уже установленных..." --> "Есть диск" --> "Да, мне пофиг что он не подписан"
    4) The End
     
  10. Thanks
    Android отреагировална Vitaldj в Внезапно перестал работать TNetHTTPClient   
    Вот нашел новость, которую публиковал пару месяцев назад в чате:
    https://3dnews.ru/1024871/v-2021-godu-mnogie-sayti-perestanut-rabotat-na-android-71-i-bolee-starih-os
  11. Like
    Android отреагировална Anatoliy_ в Планируется ли Wasm/WebAssembly компиляция?   
    Приветствую
    Подскажите, планируется ли в RAD Studio возможность компиляции Delphi программ  для WebAssembly?
     
  12. Like
    Android отреагировална juppy в [Google Play] Создать новый выпуск   
    Это иллюзия.
    Все там понятно и логично.
    И!!! Самое главное доступны  все современные элементы интерфейса совершенно бесплатно.
    Не надо думать как наколхозить "Pull To Refresh"  или "Swipe For Action" 
    Все есть бесплатно. Все современные визуальные элементы. 
    Визуального редактора, как в Delphi нет.
    Но есть "Hot Reload" который является вполне рабочим инструментом.
  13. Like
    Android отреагировална juppy в [Google Play] Создать новый выпуск   
    Приветы!
    Если кнопка недоступна, проверьте, есть черновик версии.
    Его надо либо выпустить для проверки, либо удалить.
    обзор выпусков/панель управления выпусками/выпуски.
    Там будет видно. Если есть черновик будет синяя кнопка "Удалить"
  14. Thanks
    Android отреагировална slav_z в Delphi 10.3 (targetSDK=28) и Android 11   
    да (после патча System.o конечно)

  15. Thanks
    Android отреагировална #WAMACO в Memory Table компонент   
    https://www.devart.com/virtualdac/
  16. Like
    Android получил реакцию от Ingalime в Delphi 10.4 и Android 4.1   
    http://docwiki.embarcadero.com/RADStudio/Sydney/en/Android_Devices_Supported_for_Application_Development
    RAD Studio does not support the following Android versions:
    Lollipop (Android 5.0) KitKat (Android 4.4) Jelly Bean (Android 4.1.x, 4.2.x, 4.3.x) Ice Cream Sandwich (Android 4.0.3 and 4.0.4) Honeycomb (Android 3.x) Gingerbread (Android 2.3.3 – 2.3.7) Tegra 2 devices (NEON support is required)
  17. Like
    Android получил реакцию от gonzales в Delphi 10.4 и Android 4.1   
    http://docwiki.embarcadero.com/RADStudio/Sydney/en/Android_Devices_Supported_for_Application_Development
    RAD Studio does not support the following Android versions:
    Lollipop (Android 5.0) KitKat (Android 4.4) Jelly Bean (Android 4.1.x, 4.2.x, 4.3.x) Ice Cream Sandwich (Android 4.0.3 and 4.0.4) Honeycomb (Android 3.x) Gingerbread (Android 2.3.3 – 2.3.7) Tegra 2 devices (NEON support is required)
  18. Thanks
    Android отреагировална dnekrasov в Кто-нибудь щупал TMS Web Core?   
    Пробовал я и TMS Web Core и UniGUI, но как по мне - лучше чем Thinfinity VirtualUI нет.  И да, реально на всех получаются неплохие веб-приложения на Delphi без знания всех этих новомодных фреймворков.
  19. Haha
    Android получил реакцию от Maximus в Текстовый компонент с подсветкой синтеза   
    какого синтеза? ?
  20. Thanks
    Android получил реакцию от Ingalime в [Android]Правила публикации в маркете   
    By August 3, 2020, new apps must target at least Android 10 (API level 29). By November 2, 2020, all apps that are being updated must target at least Android 10 (API level 29).
  21. Like
    Android отреагировална krapotkin в После обновления на Андроид 6.01   
    в Android начиная уже с 6 вы должны запрашивать разрешение на запись в файл у пользователя каждый раз при попытке этой записи
    пример есть в делфи
  22. Like
    Android получил реакцию от Ingalime в [Android]Публикация в маркете   
    Если стоит эта галочка, то на выходе получается не apk, а aab.
    Непонятно тогда, откуда вы берет apk.
  23. Like
    Android отреагировална MAD_EVAL в Альтернатива Google Play   
    А убило окончательно аккаунт использование WebView в приложении, в которым был основной контент, мне хотелось попробовать сделать игру на JS и просто подгрузить её в приложение. Всё, вечный бан после этого последовал. Причина - опасная загрузка контента.
    И вообще с гуглом надо осторожно, акк разраба на вес золота.
  24. Like
    Android получил реакцию от Ingalime в Альтернатива Google Play   
    при первой публикации приложения указать, что оно бесплатное, а потом сделать платным
  25. Haha
    Android отреагировална Slym в Delphi 10.4.1 и Андроид 11   
    Забаньте Maka - рекламирует платные ресурсы.
×
×
  • Создать...