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

Поиск сообщества

Показаны результаты для тегов 'android'.

  • Поиск по тегам

    Введите теги через запятую.
  • Поиск по автору

Тип контента


Форумы

  • Общие вопросы
    • Анимация
    • Графика
    • Стили
    • Базы данных и REST
    • Компоненты
    • Положение, размеры, выравнивание
    • Работа с текстом
    • Приложение и формы
    • Отладка
    • Развертывание приложений
    • Вопросы по языку Object Pascal и RTL
    • Общая информация о TControl
    • События
    • Прочие вопросы
  • Вопросы по платформам
    • Android
    • iOS
    • OSX
    • Windows
    • Windows Phone
    • Linux
  • Вопросы по использованию RAD Studio
    • Лицензирование
    • Сборка проектов
    • Multi-Device Designer
    • Редактор кода
    • Вопросы
  • Обучение
    • Основная информация
    • Вопросы
    • Отзывы
  • Поиск специалистов по FireMonkey
    • Консультации
    • Ищу подрядчика
  • Дополнительные ресурсы по FireMonkey
    • Сторонние компоненты
    • Приложения, написанные с использованием FireMonkey
    • Примеры
    • Руководства
    • Шаблоны
    • Статьи и заметки
    • Информация о версиях RAD Studio
    • Новости
  • Организация работы данного форума

Поиск результатов в...

Поиск контента, содержащего...


Дата создания

  • Начало

    Конец


Дата обновления

  • Начало

    Конец


Фильтр по количеству...

Регистрация

  • Начало

    Конец


Группа


AIM


MSN


Сайт


ICQ


Yahoo


Jabber


Skype


StackOverflow


Защита от ботов


Город


Интересы

  1. У меня есть старый проект который сделан на 10. Берлин и теперь Android говорит что нужно обновить. Я поставил сначала РАД12 но там почему-то нет Android. Тогда я поставил 11.3 и Андроид есть и SDK поставил но при компиляции вылетают куча ошибок. Что опять не так ? Прикладываю и паскаль. System.Android.Bluetooth.zip
  2. У меня был проект на Bulder 10.1 и аппликация на Android . Прошло время и Android сказал что версия очень старая и надо перекомпилировать. Я поставил RAD12 Bulder с Windows + Android. Поднял старый проект но Android платформы в опциях нет. Что не так ? Почему только Windows ?
  3. Создаю приложение для андроид. Нужно вызвать проводник, выбрать директорию и запомнить путь. Как это сделать?
  4. Доброго дня! Не могу победить применение стиля в приложении FMX. Положил на Форму TStyleBook, выбрал 0-Android, открыл и применил стиль Transparent.Style, в свойстве Формы добавил StyleBook = StyleBook1... В окне Design всё изменилось, всё красивое. В Win10 приложение запускается в стиле, на телефоне при параметре Android x32 зависает сплэш, при х64 вылетает. (Delphi 10.4, Samsung A30, Android 11) Подскажите, что я делаю не так?
  5. Решаю задачку разработки приложения камеры для использования из сторонней программы в Android'e. Нужна обработка фотографии определенным образом, плюс еще по мелочи немного, стандартной камерой не сделать такое, поэтому делаю свое приложение. Вопрос в том, как объявить свое приложение камерой? Наткнулся на подобную конструкцию: <activity android:name=".CameraActivity" android:clearTaskOnLaunch="true"> <intent-filter> <action android:name="android.media.action.IMAGE_CAPTURE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> Это вносится в "AndroidManifest.template.xml" или через настройки проекта Delphi (10.4) можно сделать?
  6. Пытаюсь добавить свою иконку для Android приложения. Указываю все их в свойствах проекта. В настройках Deploy они тоже есть. Однако, при установке приложения на рабочем столе вместо моей иконки стоит дефолтная. Как быть? Может кто сталкивался с проблемой? В папке Android проекта при деплое моя картинка заменяется на дефолтную. А вот изображения из Splash Images нормально отображаются именно те, что я указал. Пробовал на двух разных смартфонах - результат одинаковый.
  7. У меня есть проект который я сделал года 3 назад в РАД 10.2 Берлин. Управление приборами с помощью апликации на Андроиде через блютуз. Все работало пока я не купил новый мобильник с 10-м Андроидом который сказал что нужно её обновить. Взял новый РАД 11 и скомпилировал свой проект и получил кучу не известно откуда ошибок. Тогда я поставил опять 10.2 и с помощью старых SDK успешно скомпилировал опять проект. Теперь нужно повторить с новыми SDK. В директории SDK есть SDK Manager. Я его запустил и скачал 29 версию. Запустил на компиляцию и получаю ошибку что не хватает файлов. Не понятно почему со старой SDK этих ошибок не было. Какая связь между SDK и отсутствием файлов? Если посмотреть на ошибки то программа ищет файлы находящиеся в include\windows\crtl хотя я строю апликацию для android и это отражено в коммандной строке. error.docx КАк это починить ? Добавить пути к include\windows\crtl ? И куда ?
  8. Здравствуйте, есть вопрос по поводу создания приложения и его функционала. По нажатию на кнопку должен создаваться компонент, в него должен вводится текст, и по желанию добавлять или не добавляться изображение. Т.е. оно должно работать по типу записной книжки/ каталога. Из этого вышли вопросы: 1) Какой лучше компонент использовать? Я думал по началу что бы вызывалась панель, а на ней был условный ListBox, для которого в edit`e вводилась бы информация. 2) Как позиционировать это? Т.е. возможно ли сделать так, что бы пользователь сам выбирал в какую часть экрана поставить данную запись? Или же лучше сделать просто по добавлению, что бы новое было перед старым? И соответственно, как это сделать? Подскажите пожалуйста как это реализовать, так как я новичок в этом, а хочется понять как это всё устроено и работает.
  9. Итак, я установил себе новую Delphi 10.4 CE, так как у старой Delphi 10.3 CE кончился годовой срок. Однако, у меня возникла проблема с разработкой, точнее - с компиляцией приложений для Android. Дело в том, что в поставке новой Embarcadero RAD 10.4 отсутствует AVD Manager (эмулятор для Android), что вы и можете видеть на втором скрине. А когда я пытаюсь использовать старый, из набора Embarcadero RAD 10.3, компиляция вылетает с ошибкой, которую вы можете видеть на первом скрине.
  10. У меня среда программирования rad studio Delphi 10.4.2. Собственно ищу совета как отправить и получить ответ на запрос USSD. Нашел в интернете единственный пример более или менее который похож на правду. Привел его к виду нормальному виду, но не хватает знаний как передать функцию CallBack. procedure TForm7.Button6Click(Sender: TObject); var Temp:Jstring; ResponceCallBack: JTelephonyManager_UssdResponseCallback; handler: JHandler; begin TM :=TJTelephonyManager.Create; handler := TJHandler.Create; ResponceCallBack := TJTelephonyManager_UssdResponseCallback.Wrap( TAndroidHelper.Context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE)); TM.sendUssdRequest(StringToJString('*100#'), ResponceCallBack,handler); end; На java делается вот так. Не знаю как этот код переделать в delphi. TelephonyManager = telephonyManager(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); Handler handler = new Handler(); TelephonyManager.UssdResponseCallback callback = new TelephonyManager.UssdResponseCallback() { @Override public void onReceiveUssdResponse(TelephonyManager telephonyManager, String request, CharSequence response) { super.onReceiveUssdResponse(telephonyManager, request, response); Log.e("ussd",response.toString()); } @Override public void onReceiveUssdResponseFailed(TelephonyManager telephonyManager, String request, int failureCode) { super.onReceiveUssdResponseFailed(telephonyManager, request, failureCode); Log.e("ussd","failed with code " + Integer.toString(failureCode)); } }; try { Log.e("ussd","trying to send ussd request"); telephonyManager.sendUssdRequest("*123#", callback, handler); }catch (Exception e){ String msg= e.getMessage(); Log.e("DEBUG",e.toString()); e.printStackTrace(); }
  11. slav_z

    FMX: Скроллинг и нажатия

    Все разработчики при работе с FMX рано или поздно сталкиваются с одной и той же проблемой: необходимо исключить "случайное" срабатывание нажатий элементов внутри скроллбокса во время его скроллинга. Идут годы, а решения так и нет. Давайте попробуем это исправить. Поехали! Запускаем IDE, создаем новый проект, кидаем на форму TVertScrollBox и на него чего-нибудь побольше... запускаем на мобильном устройстве, пытаемся скроллировать, получаем проблемы в виде срабатывания разных событий типа OnClick элементов. Решение состоит в том, чтобы сделать элементы "невидимыми" для событий связанных с действиями пользователя с экраном во время скроллинга. Делаем следующее: Все. Переносим код в базовую форму, делаем его более гибким, убираем все те костыли, которые мы уже успели сделать ранее... Удачи! https://github.com/slav-libx/scroll-click.git
  12. Здравствуйте! Создаю медиаплеер для Android TV. Запускаю плеер, нажимаю на условную кнопку, которая делает следующее: MediaPlayer1.FileName:='/storage/emulated/0/download/1.mp4'; После нажатия вылетает окошко с надписью: java.lang.java.lang.illegalargumentexception после закрытия окошки нажимаю на play, но ничего не происходит. Подскажите, пожалуйста как исправить это?
  13. Итак, я пробовал использовать компоненты AppTethering для передачи данных между VCL-приложением работающим под Windows и мобильным FMX-приложением и потерпел неудачу, так как выяснилось что потоки данных данные компоненты на деле не передают. И у меня возник вопрос: а нет ли каких других компонентов в современной Embarcadero Studio, которые бы позволяли передавать как строковые данные, так и файлы между приложениями? Особенно меня интересуют все же файлы.
  14. Доброе время суток. У меня есть код, который отправляет данные, в частности файлы, из одного приложения в другое, используя технологию AppTethering. Вот код, который отправляет данные: var ImageToStream : TMemoryStream; begin ImageToStream := TMemoryStream.Create; ImageToStream.LoadFromFile('Здесь находится путь к файлу'); ImageToStream.Position := 0; TetheringAppProfile1.Resources.FindByName('ImageTransfer').Value := ImageToStream; ImageToStream.Free; end; А вот который принимает: procedure TForm1.TetheringAppProfile1Resources3ResourceReceived( const Sender: TObject; const AResource: TRemoteResource); var GetImage : TMemoryStream; begin GetImage := TMemoryStream.Create; GetImage.Position := 0; GetImage.LoadFromStream(AResource.Value.AsStream); ImageViewer1.Bitmap.LoadFromStream(GetImage); GetImage.Free; end; Пока передача данных идет между двумя Windows-приложениями, все работает прекрасно. Однако, когда я пытаюсь отправить данные от Windows-приложения в Android-приложение, которое исполняется на смартфоне, подключенном к компьютеру через USB-шнур, данные не проходят.
  15. Здравствуйте. У меня такая проблема. Пытаюсь скачать файл: var S : TMemoryStream; begin S := TMemoryStream.Create(); IdHTTP1.Get('http://sitename.com/7UlmBU7IXHA.jpg', S); S.SaveToFile('/storage/emulated/0/ImageFile.jpg'); S.Free; end; Проблема возникает на последней стадии - при сохранении файла. Android пишет, Cannot create file: '/storage/emulated/0/ImageFile.jpg'. Permission denied, то есть доступ запрещен. Но как его разрешить? Когда я устанавливаю приложение, система пишет, что никаких разрешений данная программа не требует.
  16. Здравствуйте. Как указываются пути к каталогам и файлам в Android? Скажем, в Windows я указываю такой путь: C:/Windows/Folder, а как это делается в Android? Особенно меня интересует, как обратиться к корневому каталогу, для создания там новой папки или файла, в Windows это C:/, или D:/ а тут как?
  17. Всем привет, с помощью Java2Op сделал обертку библиотеки получил модуль с интерфейсами. Теперь сам вопрос в JavaInterfaces.pas есть описание: JUsbManagerClass = interface(JObjectClass) ['{1048A6E9-E1B5-4DA5-A168-ED91E8DE5284}'] {class} function _GetACTION_USB_ACCESSORY_ATTACHED: JString; cdecl; {class} function _GetACTION_USB_ACCESSORY_DETACHED: JString; cdecl; {class} function _GetACTION_USB_DEVICE_ATTACHED: JString; cdecl; {class} function _GetACTION_USB_DEVICE_DETACHED: JString; cdecl; {class} function _GetEXTRA_ACCESSORY: JString; cdecl; {class} function _GetEXTRA_DEVICE: JString; cdecl; {class} function _GetEXTRA_PERMISSION_GRANTED: JString; cdecl; {class} function getAccessoryList: TJavaObjectArray<JUsbAccessory>; cdecl;//Deprecated {class} function openAccessory(accessory: JUsbAccessory): JParcelFileDescriptor; cdecl;//Deprecated {class} function openDevice(device: JUsbDevice): JUsbDeviceConnection; cdecl;//Deprecated {class} procedure requestPermission(device: JUsbDevice; pi: JPendingIntent); cdecl; overload;//Deprecated {class} property ACTION_USB_ACCESSORY_ATTACHED: JString read _GetACTION_USB_ACCESSORY_ATTACHED; {class} property ACTION_USB_ACCESSORY_DETACHED: JString read _GetACTION_USB_ACCESSORY_DETACHED; {class} property ACTION_USB_DEVICE_ATTACHED: JString read _GetACTION_USB_DEVICE_ATTACHED; {class} property ACTION_USB_DEVICE_DETACHED: JString read _GetACTION_USB_DEVICE_DETACHED; {class} property EXTRA_ACCESSORY: JString read _GetEXTRA_ACCESSORY; {class} property EXTRA_DEVICE: JString read _GetEXTRA_DEVICE; {class} property EXTRA_PERMISSION_GRANTED: JString read _GetEXTRA_PERMISSION_GRANTED; end; [JavaSignature('android/hardware/usb/UsbManager')] JUsbManager = interface(JObject) ['{6F603A25-E816-4012-9B23-054B428A4A75}'] function getDeviceList: JHashMap; cdecl;//Deprecated function hasPermission(device: JUsbDevice): Boolean; cdecl; overload;//Deprecated function hasPermission(accessory: JUsbAccessory): Boolean; cdecl; overload;//Deprecated procedure requestPermission(accessory: JUsbAccessory; pi: JPendingIntent); cdecl; overload;//Deprecated end; TJUsbManager = class(TJavaGenericImport<JUsbManagerClass, JUsbManager>) end; Что бы получить доступ к методам интерфейса используется следующая конструкция: JavaObject := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.USB_SERVICE); FUsbManager := TJUsbManager.Wrap((JavaObject as ILocalObject).GetObjectID); теперь я могу получить доступ к методам JUsbManager, а как получить доступ к методам JUsbManagerClass Вот пример кода на Java, который хочу реализовать в Delphi: UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager); if (availableDrivers.isEmpty()) { return; } // Open a connection to the first available driver. UsbSerialDriver driver = availableDrivers.get(0); //Вот тут мы видим что из экземпляра класса мы вызываем openDriver, как это сделать в Delphi UsbDeviceConnection connection = manager.openDevice(driver.getDevice()); Как мы можем заметить этого метода в описании интерфейса нет, но есть в классе, как получить доступ к экземпляру класса?
  18. Доброго дня уважаемые форумчане! Есть одна задача, но я не совсем уверен, что так можно, прошу совета. В общем есть приложение, в ней база данных SqlLite (файл базы данных деплоится в assets\internal\). Пользователь наполняет эту базу данных своими данными. Необходимо сделать возможность экспортирования этих данных на внешний носитель и последующего импортирования уже на другом устройстве. Вопрос, даст ли система экспортировать свой файл из assets\internal и главное импортировать его (т.е. фактически заменить существующий файл базы данных) в папке assets\internal на другом устройстве? (предполагается что root прав у пользователя нет). Если да, то можно вкратце объяснить порядок действий (желательно с указанием запрашиваемых и статичных разрешений на это дело, путей обращения к файлам). Если нет, то каким образом тогда это можно сделать (формировать промежуточный файл с данными БД, а потом его обрабатывать на другом устройстве средствами СУБД)? P.S. Такая задача встала впервые, не очень разбираюсь в теме безопасности на Андроид устройствах и работе с файлами приложения напрямую, поэтому прошу помощи, может быть кто-то уже сталкивался с подобной задачей. Заранее спасибо! )
  19. Коллеги, здравствуйте. Помогите пожалуйста с работой потоков. При запуске потока, появляется индикатор и исправно крутится. В какой то момент он залипает и перестает крутиться и так до конца работы потока. Понимаю, что в потоке идет работа с визуальными компонентами, по этому скорее всего и залипает индикатор. Как исправить/оптимизировать код? Спасибо. DelOff = class (TThread) protected FOnTaskStarted: TThreadMethod; FOnTaskFinished: TThreadMethod; procedure DoStarted; procedure DoFinished; procedure load; procedure Execute; override; public property OnTaskStarted: TThreadMethod read FOnTaskStarted write FOnTaskStarted; property OnTaskFinished: TThreadMethod read FOnTaskFinished write FOnTaskFinished; end; procedure DelOff.DoFinished; begin Add.Layout1.Visible:=false; if Assigned (Add.FindComponent('Null') as TLayout) then (Add.FindComponent('Null') as TLayout).Free; end; procedure DelOff.DoStarted; begin Add.Layout1.Visible:=true; end; procedure DelOff.load; begin try ReOpen; ClientModule2.ServerMethods1Client.Number13(a,b,g,h); a:='1'; ReOpen; offerlist1.Lines.Text:=ClientModule2.ServerMethods1Client.Number12(a,b,g,h); a:='2'; ReOpen; sumofferlist1.Lines.Text:=ClientModule2.ServerMethods1Client.Number12(a,b,g,h); a:='3'; ReOpen; keyofferlist1.Lines.Text:=ClientModule2.ServerMethods1Client.Number12(a,b,g,h); ReOpen; offercount:=ClientModule2.ServerMethods1Client.Number11(a,b,g,h); except ANM.Show; Add.Visible:=false; ShowmessageToast('Ошибка загрузки',TJToast.JavaClass.LENGTH_LONG); Value := Trim('10,500'); if Add.CheckPermission then if Value.Contains(',') then TVibratorHelper.vibrate(Value.Split([',']), -1) else TVibratorHelper.vibrate(Value.ToInt64); end; end; procedure DelOff.Execute; begin inherited; //Удаление из БД продукта try try Synchronize(DoStarted); updatecount:=StringReplace((Add.FindComponent('LabelIntro') as TLabel).Hint, 'Rec', '', [rfReplaceAll]); a:=(Add.FindComponent('NameProduct'+updatecount) as TLabel).Hint; di:= TZDeviceInfo.Create; b:=StringReplace(di.DeviceID, '=', '', [rfReplaceAll]); if(internet='true') and (server='true') then begin EditCase:='false'; Add.PSB.AutoCalculateContentSize:=false; Add.PSB.EnabledScroll:=true; Add.PSB.AutoCalculateContentSize:=true; synchronize(load); if Assigned (Add.FindComponent((Add.FindComponent('LabelDel') as TLabel).Hint)) then begin (Add.FindComponent((Add.FindComponent('LabelDel') as TLabel).Hint) as TRectangle).Free; (Add.FindComponent('RecEdit') as TRectangle).Free; end; Add.PSB.ScrollTo(0,0,true); for countload:=0 to StrToInt(offercount)-1 do begin (Add.FindComponent('XRun'+IntToStr(countload)) as TFloatAnimation).Enabled:=false; (Add.FindComponent('x'+IntToStr(countload)) as TImage).Opacity:=0; (Add.FindComponent('VRun'+IntToStr(countload)) as TFloatAnimation).Enabled:=false; (Add.FindComponent('v'+IntToStr(countload)) as TImage).Opacity:=0; end; end else begin ShowmessageToast('Нет интернета',TJToast.JavaClass.LENGTH_LONG); Value := Trim('10,500'); if Add.CheckPermission then if Value.Contains(',') then TVibratorHelper.vibrate(Value.Split([',']), -1) else TVibratorHelper.vibrate(Value.ToInt64); end; finally Synchronize(DoFinished); end; except ANM.Show; Add.Visible:=false; ShowmessageToast('Ошибка загрузки',TJToast.JavaClass.LENGTH_LONG); Value := Trim('10,500'); if Add.CheckPermission then if Value.Contains(',') then TVibratorHelper.vibrate(Value.Split([',']), -1) else TVibratorHelper.vibrate(Value.ToInt64); end; end;
  20. Недавно решил написать небольшое приложение под андроид, которое будет в удобном виде показывать расписание моего ВУЗа (они нам передают 20 летний привет в виде экселя), ну и задно изучить FMX. Написал за пару дней парсер, все более менее работает. Встал вопрос - какими компонентами все это удобно и красиво отобразить? Перечитал кучу инфы по стандартным компонентам и, кажется, они мне не подойдут Для того чтобы было понятно, чего именно я хочу - набросал схему. Границы для наглядности. Каким компонентом это можно реализовать? Если все-таки коробочные тоже годятся, то ткните лицом куда читать :) Заранее спасибо.
  21. Господа Delphi-программисты под Android (FireMonkey), Нужна ваша помощь или совет в направления решения в несложной, достаточно типичной и прозрачной задаче: Я хочу выполнять некоторые вычисления (или выдавать Toastы) через каждые 30 сек. в Android-приложении. Что-то типа сервиса (службы): Приложение запускает задание и может закрываться, но периодические вычисления продолжаются (результат сохраняется, допустим, в ini - не важно пока), т.е. служба работает. Я не знаю, как это решить: 1. Организовал как сервис. Сервисы убиваются androidом ... И это политика androidов: экономить батарию и т.д. 2. Сделал через AlarmManager. Тоже это не работает на MI 9T (Android 10: API 29). На старых (Android 4...: API 19) всё работает. 3. Хотел использовать job scheduler: добавлять задания и удалять исполненные. Но не знаю как. ничего не нагуглил под Firemonkey. Может кто знает? Какие ещё варианты и вообще, это решается на Firemonkey Delphi XE 10.3.3? На поиск решения мною потрачено много время - сдвинуться не могу. Если Delphi это не умеет, так и скажите - перепрыгну на другую платформу. Может Delphi об этом думает, чтоб это скоро реализовать? В интернете тишина. Если Delphi это умеет, просьба дать идею или совет или пример ...
  22. поделитесь пожалуйста пустым проектом, готовым к публикации для TV устройств. что-то никак не получается опубликовать, сейчас отклонили с такими ошибками: APK:8 No Now Playing notification [card]" Your App does not contain a “Now Playing” notification [card] for when the user has selected the HOME button within the app. Please refer to our Displaying a Now Playing Card documentation for more details. APK:8 Play/Pause key event is not respected during playback Your media apps that play video or music content must respect the play/pause key during playback. Please refer to our Media Play/Pause documentation and Update the Playback State documentation for details. Missing DPad functionality Your app requires user interaction for menus or app navigation. Please make sure that all menus and app navigation are fully functional using a DPad. Please refer to our DPAD Control and Hardware Declaration documentation. ну и баннер не прилепил No full-size app banner Your app does not contain a full-size app banner or is it not visible in the launcher. We are targeting 1080P, which we consider xhdpi. Apps should include the banner in the xhdpi (320 dpi) drawables folder with a size of (320px × 180px). Please refer to our Home Screen Banner and UI Patterns documentation. The title should help users identify apps in the launcher. Please refer to our Visual Design and User Interaction documentation for more information. был бы очень благодарен за рабочий пустой костяк с манифестом.
  23. В процессе разработки столкнулся с очень странной ситуацией, корни которой до сих пор неясны, но решение нашлось. Итак. Делфи 10.3.3. Чистое приложение - пустая форма и кнопка. Отлично работает на разных устройствах кроме Samsung Galaxy Tab A (2016). Android 5.1.1 Программа падает, не успев даже загрузиться. Любая. При этом она же, скомпилированная на другом компе, запускается нормально. И даже после изменения SDK/NDK на нем, ничего не падает. LogCat дает крайне странную картину java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/com.embarcadero.Project1-1/libProject1.so Начинаем экспериментировать с SDK, NDK и т.д. Поставил также хотфиксы для 10.3.3. Сразу скажу, SDK/NDK ставились отдельно через Android studio, не скачивались вместе с Delphi. Не торопитесь бросать чтение на этом месте!)) На другом компе, где все работает, все ставилось точно так же. Короче, очень много комбинаций версий SDK/NDK проверено. Результат такой. При постепенном понижении версии NDK все взлетело при NDK v22. При этом версия SDK видимо такого большого влияния не имеет, потому что этот вариант нормально работает Повторюсь. На других устройствах все работало и на более новых Ndk. Xiaomi Mi Pad4 , Samsung Galaxy Tab A (2019), Xiaomi Redmi 5 и 5Plus Спасибо за участие и помощь в разборе завалов @Andrey Efimov
  24. У меня в работе два приложения, и оба они не предназначены для Play market, так как имеют ограниченный круг использования, по сути, чисто внутрикорпоративные. Так что нежелательно и выкладывание их и на альтернативные магазины приложений. Автоматически возникает вопрос обновления. Если в первый раз мы можем установить приложение сами при помощи админов, то обновлять их не так просто. А контингент пользователей не справится с "скачайте APK по ссылке, найдите, куда его скачал браузер, и запустите вручную именно последний скачанный, а не какой попало"... Простейший способ - дать приложению скачать свежую копию с сайта и натравить на полученный файл системный инсталлер. Вот только свежие Andoird делать это напрямик запрещают. Нужен filepropvider. Целый день шуровал по мануалам и YT, Вот то что получилось в результате. Если у вас 10.3.3 как у меня, уже можно не вносить <provider>...</provider> в манифест и свой файл file_paths.xml (или как вам его советуют назвать в интернетах) в деплой. Теперь все это делается хоть несколько странно и однобоко, но автоматически, путем установки галочки Secure File Sharing после этого в манифесте автоматически пропишется один из вариантов размещения файлов, которые вы можете найти в интернете. Используется алиас external-path файл, показанный на рисунке, создается автоматически самой делфи. теперь остается отгадать, какой путь реально подставится вместо "." Как показала практика, все пути выглядят не так, как кажется, если исходить из простого здравого смысла. Целый день использования GetHomeDir и других полезных методов TPath завел меня совсем в тупик. Оказалось все проще (?) st:TMemoryStream; OutputDir: JFile; ApkFile: JFile; ApkUri: Jnet_Uri; path, filename: string; ... OutputDir := TAndroidHelper.Context.getExternalCacheDir(); path := JStringToString(OutputDir.getAbsolutePath); filename := path+'/ASDroid2.apk'; ApkFile := TJfile.JavaClass.init( StringToJstring(filename)); FApkUri := TAndroidHelper.JFileToJURI(ApkFile); st.Position := 0; st.SaveToFile(filename); обратите внимание, в provider_paths мы задаем external-paths, а в коде ищем ExternalCacheDir.!!! (For.Unbelievably.Creative.Knowers!) Потом все просто. FApkUri передаем в интент и запускаем итоговый код примерно таков. (скачивание в потоке с использованием небольшого собственного API, но там ничего важного, можно не обращать внимания) procedure TasdSettingsFrame.bDownloadClick(Sender: TObject); begin {$IFDEF ANDROID} bDownload.Enabled := False; DownloadAndRun(); {$ENDIF} end; {$IFDEF ANDROID} procedure TasdSettingsFrame.DownloadAndRun(); begin ttask.Run(procedure var aapi:TasdAPI; st:TMemoryStream; OutputDir: JFile; ApkFile: JFile; ApkUri: Jnet_Uri; path, filename: string; begin st := TMemoryStream.Create; aapi := TasdAPI.Clone(_API); try aapi.OnReceiveData := OnReceiveData; aapi.getApk(st); if aapi.Err.Code=0 then begin OutputDir := TAndroidHelper.Context.getExternalCacheDir(); path := JStringToString(OutputDir.getAbsolutePath); filename := path+'/ASDroid2.apk'; ApkFile := TJfile.JavaClass.init( StringToJstring(filename)); FApkUri := TAndroidHelper.JFileToJURI(ApkFile); st.Position := 0; st.SaveToFile(filename); TThread.Synchronize(nil,procedure begin bDownload.Enabled := true; StartActivity(FApkUri); end); end; finally st.Free; aapi.Free; end; end); end; procedure StartActivity(ApkUri: Jnet_Uri); var Intent: JIntent; begin Intent := TJIntent.Create(); Intent.setAction(TJIntent.JavaClass.ACTION_VIEW); Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK or TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP or TJIntent.JavaClass.FLAG_GRANT_WRITE_URI_PERMISSION or TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION); Intent.setDataAndType(apkuri, StringToJString('application/vnd.android.package-archive')); TAndroidHelper.Activity.startActivity(Intent); end; procedure TasdSettingsFrame.OnReceiveData(const Sender: TObject; AContentLength: Int64; AReadCount: Int64; var Abort: Boolean); begin tthread.Synchronize(nil, procedure begin pb1.Max := AContentLength; pb1.Value := AReadCount; end); end; {$ENDIF} Вопросы остались конечно, почему так странно с каталогами, но выяснять пока нет желания. Работает - не трожь. Всем удачи. UPD. Для того, чтобы системный инсталлер запускался, нужно не забыть отметить еще одну галочку
  25. Приветствую. На просторах интернета нашел BASS-библиотеку для Android и соответственно обертку для нее под Delphi. Вроде бы все работает нормально, но вот при настройке библиотеки при помощи методов BASS_GetConfigPtr, BASS_SetConfigPtr для работы со строковыми параметрами возникает проблема. На Windows с этим я легко работал, там достаточно использовать такую конструкцию PAnsiChar(BASS_GetConfigPtr(configId)) и получаем значение. BASS_SetConfigPtr(configId, PAnsiChar(value)) и задаем значение. Но вот под Android такой способ не проходит, как минимум по одной причине - он не понимает, что такое PAnsiChar. На docwiki.emarcadero.com, есть вот такая статейка. В которой написано, что PAnsiChar нужно заменить одним из трех: System.String, System.MarshalledString или System.SysUtils.TStringBuiler Только вот, если использовать MarshalledString, то при попытке получить значение приложение просто намертво зависает и все. Потом я подумал, так как библиотека написана на Java (вероятно), то может стоит попробовать использовать JNI в работе с ней, так как в Java файле, который прилагался вместе с библиотекой. Там я нашел объявления этих функций и заметил, что тип возвращаемого значения Object (ну, не зная Java я просто предположил, что это тоже просто ссылка на значение, например как PAnsiChar в Delphi на Windows). Но, при попытке как-либо использовать это натыкаюсь на проблемы в виде ошибки компиляции, либо очередном зависании приложения. Так как возвращается Object, то решил попробовать вариант с JObject и JString, но ни один вариант не хочет работать, опять ошибки на стадии компиляции, либо зависание приложение. Может быть, я что-то не так делаю. В общем, буду признателен за помощь!
×
×
  • Создать...