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

Рекомендуемые сообщения

  • Модераторы
5 часов назад, aldi77 сказал:

ето получается когда я повернул устройство

Какое устройство? intel?

Ссылка на комментарий
  • 1 месяц спустя...

Добрый день

Тестирую покраску статус бара методом, описанным в блоге Равиля.

Не совсем понятен нюанс с добавлением styles.xml в RemotePath res\values-v21\.

Если так сделать, то при попытке компиляции проекта с SDK API Level, меньшим 19, среда выдает ошибки об отсутствии функций 

\res\values-v21\styles.xml:4: error: Error: No resource found that matches the given name: attr 'android:windowTranslucentNavigation

\res\values-v21\styles.xml:3: error: Error: No resource found that matches the given name: attr 'android:windowTranslucentStatus

Значит ли это, что приложения с этим статус баром не смогут работать под Android ниже 4.4? Даже если они и не поддерживают перекраску статус бара?

И как будет отображаться статус бар под Android 4.4?

Заранее спасибо! 

Ссылка на комментарий
  • Модераторы

Стиль наследуется, потому указан v21, что соответствует Lollipop. Ниже 21 сдк, не будет покраски, будет чёрный статус бар

Ссылка на комментарий

Да, включён.

Но переделан под 9 patch.

В деплойменте к названиям сплешей в конце добавлено _def.9.png и деактивирован файл splash_image_def.xml согласно инструкции http://docwiki.embarcadero.com/RADStudio/Berlin/en/Using_9-patch_Images_in_Android

Изменено пользователем Alex7wrt
Ссылка на комментарий
  • 2 месяца спустя...

Добрый день, сначала мне жаль, потому что я не знаю русского языка. Я использую переводчик Google.
У меня есть следующая проблема: я использую вашу библиотеку для изменения цвета панели состояния (ZenFone3, android 7) отлично работает, пока я не отключу «Включить всплывающее изображение» там, где он больше не компилируется, и возвращает мне следующую ошибку.

[Ошибка PAClient] E2312 D: \ OffersCap \ Mobile \ Android \ Release \ OfferCap \ res \ values-v21 \ styles.xml: 5: Ошибка: Ошибка: ресурс не найден, который соответствует указанному имени (на 'android: windowBackground 'со значением' @ drawable / splash_image_def ').

если вы можете мне помочь, спасибо

Ссылка на комментарий
  • Модераторы
16 часов назад, Alisson R Oliveira сказал:

если вы можете мне помочь, спасибо

решение может быть такое

не использовать стиль, тоже самое можно сделать программно. посмотрите этот модуль

Скрытый текст

unit FMX.StatusBar;

{
  author : ZuBy
  rzaripov1990@gmail.com
}

interface

uses
  System.UITypes, FMX.Platform
{$IFDEF ANDROID} ,
  Androidapi.JNI.GraphicsContentViewText, Androidapi.JNIBridge, Androidapi.Helpers,
  Androidapi.JNI.JavaTypes, Androidapi.JNI.App, FMX.Platform.Android, FMX.Helpers.Android
{$ELSEIF defined(IOS)}
    , FMX.Helpers.iOS, FMX.Platform.iOS, iOSapi.UIKit, iOSapi.Foundation, iOSapi.CoreGraphics, iOSapi.CoreImage
{$ENDIF};

{$IFDEF ANDROID}

type
  JWindowManager_LayoutParamsClassExt = interface(JWindowManager_LayoutParamsClass)
    ['{48861EC2-BC53-440A-B1B8-76FF4DF36F97}']
    { class } function _GetFLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS: Integer; cdecl;
    { class } property FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS: Integer read _GetFLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
  end;

  TJWindowManager_LayoutParamsExt = class(TJavaGenericImport<JWindowManager_LayoutParamsClassExt,
    JWindowManager_LayoutParams>)
  end;

  [JavaSignature('android/view/Window')]
  JWindowExt = interface(JWindow)
    ['{2810B178-9634-453D-8963-19CE145E6669}']
    procedure setStatusBarColor(color: Integer); cdecl;

    function getStatusBarColor: Integer; cdecl;
  end;

  TJWindowExt = class(TJavaGenericImport<JWindowClass, JWindowExt>)
  end;

function GetWindowExt: JWindowExt;
{$ENDIF}
function Darker(color: TAlphaColor; Percent: Byte): TAlphaColor;

procedure StatusBarGetBounds(out StatusBar, navigationBar: Integer);  // получаем размеры статус бара и нав бара
procedure StatusBarSetColor(const aColor: TAlphaColor); // устанавливаем цвет формы!!

implementation

uses
  System.SysUtils;

function MulDiv(nNumber, nNumerator, nDenominator: Integer): Integer;

  function MathRound(AValue: Extended): Int64; inline;
  begin
    if AValue >= 0 then
      Result := Trunc(AValue + 0.5)
    else
      Result := Trunc(AValue - 0.5);
  end;

begin
  if nDenominator = 0 then
    Result := -1
  else
    Result := MathRound(Int64(nNumber) * Int64(nNumerator) / nDenominator);
end;

function Darker(color: TAlphaColor; Percent: Byte): TAlphaColor;
var
  r, g, b: Byte;
begin
  r := TAlphaColorRec(color).r;
  g := TAlphaColorRec(color).g;
  b := TAlphaColorRec(color).b;
  r := r - MulDiv(r, Percent, 100);
  g := g - MulDiv(g, Percent, 100);
  b := b - MulDiv(b, Percent, 100);
  Result := TAlphaColorF.Create(r / 255, g / 255, b / 255, 1).ToAlphaColor;
end;

function Lighter(color: TAlphaColor; Percent: Byte): TAlphaColor;
var
  r, g, b: Byte;
begin
  r := TAlphaColorRec(color).r;
  g := TAlphaColorRec(color).g;
  b := TAlphaColorRec(color).b;
  r := r + MulDiv(255 - r, Percent, 100);
  g := g + MulDiv(255 - g, Percent, 100);
  b := b + MulDiv(255 - b, Percent, 100);
  Result := TAlphaColorF.Create(r / 255, g / 255, b / 255, 1).ToAlphaColor;
end;

{$IFDEF ANDROID}

function GetWindowExt: JWindowExt;
begin
  Result := TJWindowExt.Wrap((MainActivity.getWindow as ILocalObject).GetObjectID);
end;
{$ENDIF}

procedure StatusBarGetBounds(out StatusBar, navigationBar: Integer);
{$IFDEF ANDROID}
var
  KeyCharacterMap: JKeyCharacterMap;
  resourceID: Integer;
  ScreenService: IFMXScreenService;
  sScale: Single;
{$ENDIF}
begin
  navigationBar := 0;
  StatusBar := 0;
{$IFDEF ANDROID}
  if TOSVersion.Check(5, 0) then // вроде только работает с 5.0 ниже нет устройства проверить
  begin
    sScale := 1;
    if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then
      sScale := ScreenService.GetScreenScale; // получаем скейл

    resourceID := TAndroidHelper.Activity.getResources.getIdentifier(StringToJString('status_bar_height'),
      StringToJString('dimen'), StringToJString('android'));
    if resourceID > 0 then
      StatusBar := Trunc(TAndroidHelper.Activity.getResources.getDimensionPixelSize(resourceID) / sScale);

    if not TJKeyCharacterMap.JavaClass.deviceHasKey(TJKeyEvent.JavaClass.KEYCODE_BACK) then
    // проверка на существование наэкранных кнопок или физических
    begin
      resourceID := TAndroidHelper.Activity.getResources.getIdentifier(StringToJString('navigation_bar_height'),
        StringToJString('dimen'), StringToJString('android'));
      if resourceID > 0 then
        navigationBar := Trunc(TAndroidHelper.Activity.getResources.getDimensionPixelSize(resourceID) / sScale);
    end;
  end;
{$ENDIF}
end;

{$IFDEF IOS}

function GetStatusBarView: UIView;
var
  I: Integer;
  LViews: NSArray;
  LView: UIView;
begin
  Result := nil;
  LViews := SharedApplication.keyWindow.rootViewController.view.subviews;
  for I := 0 to LViews.count - 1 do
  begin
    LView := TUIView.Wrap(LViews.objectAtIndex(I));
    if CGRectEqualToRect(LView.frame, SharedApplication.statusBarFrame) <> 0 then
    begin
      Result := LView;
      Break;
    end;
  end;
end;

procedure SetStatusBarBackgroundColor(const ABackgroundColor: TAlphaColor);
var
  Red: Single;
  Green: Single;
  Blue: Single;
  ColorCI: CIColor;
  ColorUI: UIColor;
  StatusBarView: UIView;
begin
  StatusBarView := GetStatusBarView;
  if StatusBarView = nil then
    Exit;
  Red := TAlphaColorRec(ABackgroundColor).r / 255;
  Green := TAlphaColorRec(ABackgroundColor).g / 255;
  Blue := TAlphaColorRec(ABackgroundColor).b / 255;
  ColorCI := TCIColor.Wrap(TCIColor.OCClass.colorWithRed(Red, Green, Blue));
  ColorUI := TUIColor.Wrap(TUIColor.OCClass.colorWithCIColor(ColorCI));
  StatusBarView.setBackgroundColor(ColorUI);
  if TOSVersion.Check(7, 0) then
    SharedApplication.keyWindow.rootViewController.setNeedsStatusBarAppearanceUpdate;
end;
{$ENDIF}

procedure StatusBarSetColor(const aColor: TAlphaColor);
{$IFDEF ANDROID}
var
  Window: JWindowExt;
{$ENDIF}
begin
{$IFDEF ANDROID}
  CallInUIThread(
    procedure
    begin
      if TOSVersion.Check(5, 0) then
      begin
        Window := GetWindowExt;
        Window.setFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_TRANSLUCENT_STATUS,
          TJWindowManager_LayoutParams.JavaClass.FLAG_TRANSLUCENT_STATUS);
        Window.setFlags(TJWindowManager_LayoutParamsExt.JavaClass.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
          TJWindowManager_LayoutParamsExt.JavaClass.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        Window.setStatusBarColor(-16777216);
      end;
    end);
{$ENDIF}
{$IFDEF IOS}
  SetStatusBarBackgroundColor(aColor);
{$ENDIF}
end;

end.

 

Ссылка на комментарий

Он работал, теперь он рисует строку состояния, но экран идет позади ... Я не видел, чтобы функция могла получить высоту строки состояния, чтобы сделать интервал, например, один из предыдущего примера
"Layout.Margins.Top: = TmyWindow.StatusBarHeight;"
Не могли бы вы помочь мне, как мне это сделать с этим новым подразделением, которое вы показали?

благодарный

Ссылка на комментарий
  • Модераторы
1 час назад, Alisson R Oliveira сказал:

Он работал, теперь он рисует строку состояния, но экран идет позади ... Я не видел, чтобы функция могла получить высоту строки состояния, чтобы сделать интервал, например, один из предыдущего примера
"Layout.Margins.Top: = TmyWindow.StatusBarHeight;"
Не могли бы вы помочь мне, как мне это сделать с этим новым подразделением, которое вы показали?

благодарный

Использовать процедуру 

StatusBarGetBounds, там будет высота статус бара

Ссылка на комментарий

извините за мое понимание вашего подразделения. Процедура «StatusBarGetBounds» не является функцией, которая не возвращает мне значение высоты строки состояния, поэтому я говорю, что у меня есть много знаний о предмете, высота бара состояния и босса для всех версий android (от 5 ) и независимо от марки устройства (asus, samsung, lg и др.)? Как вы можете привести пример правильного использования описанных вами процедур.

еще раз спасибо

Ссылка на комментарий
  • Модераторы
2 часа назад, Alisson R Oliveira сказал:

извините за мое понимание вашего подразделения. Процедура «StatusBarGetBounds» не является функцией, которая не возвращает мне значение высоты строки состояния, поэтому я говорю, что у меня есть много знаний о предмете, высота бара состояния и босса для всех версий android (от 5 ) и независимо от марки устройства (asus, samsung, lg и др.)? Как вы можете привести пример правильного использования описанных вами процедур.

еще раз спасибо

Процедура возвращает результат в параметрах

var
  statusbar, navbar: integer;
begin
  StatusBarGetBounds(statusbar, navbar);
  Control.Margin.Top := statusbar;
end;

 

Ссылка на комментарий

Очень хорошая проблема позиционирования управления по отношению к разрешенной строке состояния, я искал функцию, которая возвращает мне целое число, плюс и процедуру.

кажется, что все работает отлично, за исключением одной детали, цвет, который я передаю как параметр, не используется для рисования строки состояния. и фиксированный цвет. анализируя процедуру, которая делает это «StatusBarSetColor» увидела, что он получает «const aColor: TAlphaColor» и только использует на устройствах iOS в Android фиксированное значение

procedure StatusBarSetColor(const aColor: TAlphaColor);
{$IFDEF ANDROID}
var
  Window: JWindowExt;
{$ENDIF}
begin
{$IFDEF ANDROID}
  CallInUIThread(
    procedure
    begin
      if TOSVersion.Check(5, 0) then
      begin
        Window := GetWindowExt;
        Window.setFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_TRANSLUCENT_STATUS,
          TJWindowManager_LayoutParams.JavaClass.FLAG_TRANSLUCENT_STATUS);
        Window.setFlags(TJWindowManager_LayoutParamsExt.JavaClass.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
          TJWindowManager_LayoutParamsExt.JavaClass.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        Window.setStatusBarColor(-16777216);
      end;
    end);
{$ENDIF}
{$IFDEF IOS}
  SetStatusBarBackgroundColor(aColor);
{$ENDIF}
end;

Screenshot_20171113-104835.jpg

Ссылка на комментарий
  • Модераторы
1 час назад, Alisson R Oliveira сказал:

Очень хорошая проблема позиционирования управления по отношению к разрешенной строке состояния, я искал функцию, которая возвращает мне целое число, плюс и процедуру.

кажется, что все работает отлично, за исключением одной детали, цвет, который я передаю как параметр, не используется для рисования строки состояния. и фиксированный цвет. анализируя процедуру, которая делает это «StatusBarSetColor» увидела, что он получает «const aColor: TAlphaColor» и только использует на устройствах iOS в Android фиксированное значение

procedure StatusBarSetColor(const aColor: TAlphaColor);
{$IFDEF ANDROID}
var
  Window: JWindowExt;
{$ENDIF}
begin
{$IFDEF ANDROID}
  CallInUIThread(
    procedure
    begin
      if TOSVersion.Check(5, 0) then
      begin
        Window := GetWindowExt;
        Window.setFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_TRANSLUCENT_STATUS,
          TJWindowManager_LayoutParams.JavaClass.FLAG_TRANSLUCENT_STATUS);
        Window.setFlags(TJWindowManager_LayoutParamsExt.JavaClass.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
          TJWindowManager_LayoutParamsExt.JavaClass.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        Window.setStatusBarColor(-16777216);
      end;
    end);
{$ENDIF}
{$IFDEF IOS}
  SetStatusBarBackgroundColor(aColor);
{$ENDIF}
end;

Screenshot_20171113-104835.jpg

Текущая реализация не позволяет нам менять цвет статус бара, потому что в FMX используется старая тема Holo.

Поэтому устанавливается полупрозрачный цвет для нативного окна, и регулируется цвет статус бара с помощью установки цвета формы. 

Так достигается эффект покраски статус бара

Ссылка на комментарий

Я понимаю, что я рассмотрю дорожную карту грузоотправителя, чтобы посмотреть, будет ли эта деталь изменена. С вашим объяснением и вашим устройством я помещаю TRectangle с желаемым цветом, чтобы быть backgroud, поэтому у меня был «желаемый результат».

Большое спасибо

Ссылка на комментарий
  • Модераторы
16 минут назад, haword сказал:

а тему поменять нельзя с Holo на Material в ресурсах?

наверное можно поменять, но не ясно на что это повлияет

Ссылка на комментарий
  • 2 месяца спустя...
В 13/11/2017 в 12:15, Равиль Зарипов (ZuBy) сказал:

Текущая реализация не позволяет нам менять цвет статус бара, потому что в FMX используется старая тема Holo.

Поэтому устанавливается полупрозрачный цвет для нативного окна, и регулируется цвет статус бара с помощью установки цвета формы. 

Так достигается эффект покраски статус бара

Доброе утро ... жаль открывать тропик после долгого времени, но я утверждал приложение на других устройствах, что панель навигации не является физической (назад, дома, окнами), и с этим она становится полностью прозрачной, а элементы управления белыми, например могу я решить ???

благодарный

Ссылка на комментарий
  • Модераторы
21 час назад, Alisson R Oliveira сказал:

Доброе утро ... жаль открывать тропик после долгого времени, но я утверждал приложение на других устройствах, что панель навигации не является физической (назад, дома, окнами), и с этим она становится полностью прозрачной, а элементы управления белыми, например могу я решить ???

благодарный

попробуйте последнюю версию

Ссылка на комментарий
  • 1 год спустя...

Запустил код по ссылке на delphi 10.3.2, android 8.1 Xiaomi redmi 5 plus

В моем случае выяснилось, что поведение зависит от состояния Mainform.Borderstyle

Если none - ведет себя как Fullscreen, статусбар прячется

 

Дополнено! 

Чистый проект на 10.3.2 сам добавляет в Deployment файл styles-v21.xml

Его нужно отключить! 

image.png.ce012efcddf18ab37750c1e9c4e0051b.png

 

иначе будет только вариант Fullscreen (он же Borderstyle=none) когда статусбар скрыт и выезжает полупрозрачный, либо обычный неокрашенный статаусбар.

Если без него впоследствии что-то не взлетит, можно так же как с основным styles.xml добавить в deployment свой, модифицированный, со строками

        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowTranslucentNavigation">false</item>
 

У меня после отключения окрашивание статусбара работает корректно.

Изменено пользователем krapotkin
Ссылка на комментарий
  • 6 месяцев спустя...

Доброго времени сутки.

На Samsung Galaxy S8 Edge проект когда открываю выдаёт вот так:

image.thumb.png.9d595d85ae7aad0777df7dd089bdd6ed.png  

кто в курсе почему так происходит? вроде красный панель доле перекрывать NavigationBar?

заранее спасибо

Ссылка на комментарий
  • 4 месяца спустя...

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Похожий контент

    • Автор slav_z
      для GPU (Android и iOS) неверно работает установка цвета при следующих условиях: Rectangle.Fill.Color:=$3CF865F7 и Rectangle.Opacity=0.5 (одновременно установить цвет элемента с альфа-каналом < $FF и прозрачностью элемента < 1).
      Это может понадобиться, к примеру, для анимации "исчезающего" элемента. Ошибке много лет... исправляется внесением изменений в исходный код модуля FMX.Canvas.GPU.pas (необходимо скопировать модуль FMX.Canvas.GPU.pas к себе в проект и внести изменения ).
      Оригинальный код:

      Исправленный код:

    • Автор A_l_ex
      Уважаемые форумчане, искал на форуме, но возможно не нашел что-то похожее по своему вопросу ... 
      Нужна возможность использовать жесты в TWebBrowser. Стандартные жесты в FMX как я понял не работают, TWebBrowser очевидно благополучно игнорирует их.
      Читая API на developer.apple.com нашел то что нужно setAllowsBackForwardNavigationGestures. Данное действо доступно в модуле iOSapi.WebKit. 
      Как заставить TWebBrowser на форме выполнять это требование? 
      В попытках найти решение пытался выполнить такое извращение, явно осознавая что это не совсем то что нужно: 
      На форуме нашел такой запрос но он за 2014 год и проблема в том что мне нужно не создавать свой WebView а попытаться заставить родной TWebBrowser делать это. Но если это не возможно то прошу подсказать как воткнуть на форму свой WebView.
      Читал что есть возможность использовать Deligate но как именно это делать, пока не понятно.
      Буду рад любым вариантам!
      P.S. Забыл упомянуть. Студия разработки RAD Studio 10.4.2 Sydney. Аппаратура MacBook Pro 13 Big Sur 11.2.3 + XCode 12.5 + Apple iPhone 11(14.5).
    • Автор slav_z
      Все разработчики при работе с FMX рано или поздно сталкиваются с одной и той же проблемой: необходимо исключить "случайное" срабатывание нажатий элементов внутри скроллбокса во время его скроллинга. Идут годы, а решения так и нет. Давайте попробуем это исправить. Поехали!
      Запускаем IDE, создаем новый проект, кидаем на форму TVertScrollBox и на него чего-нибудь побольше... запускаем на мобильном устройстве, пытаемся скроллировать,

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

      Все. Переносим код в базовую форму, делаем его более гибким, убираем все те костыли, которые мы уже успели сделать ранее...
      Удачи!
      https://github.com/slav-libx/scroll-click.git
    • Автор uakmal
      Здравствуйте!
      Создаю медиаплеер для Android TV. 
      Запускаю плеер, нажимаю на условную кнопку, которая делает следующее: 
      MediaPlayer1.FileName:='/storage/emulated/0/download/1.mp4'; После нажатия вылетает окошко с надписью:
      java.lang.java.lang.illegalargumentexception после закрытия окошки нажимаю на play, но ничего не происходит.
      Подскажите, пожалуйста как исправить это?
    • Автор Delpher-X
      Итак, я пробовал использовать компоненты AppTethering для передачи данных между VCL-приложением работающим под Windows и мобильным FMX-приложением и потерпел неудачу, так как выяснилось что потоки данных данные компоненты на деле не передают. И у меня возник вопрос: а нет ли каких других компонентов в современной Embarcadero Studio, которые бы позволяли передавать как строковые данные, так и файлы между приложениями? Особенно меня интересуют все же файлы. 
    • Автор Delpher-X
      Доброе время суток. У меня есть код, который отправляет данные, в частности файлы, из одного приложения в другое, используя технологию 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-шнур, данные не проходят.  
    • Автор Delpher-X
      Здравствуйте. У меня такая проблема. 
      Пытаюсь скачать файл:
       
      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, то есть доступ запрещен. Но как его разрешить? Когда я устанавливаю приложение, система пишет, что никаких разрешений данная программа не требует.
    • Автор Delpher-X
      Здравствуйте. Как указываются пути к каталогам и файлам в Android? Скажем, в Windows я указываю такой путь:  C:/Windows/Folder, а как это делается в Android? Особенно меня интересует, как обратиться к корневому каталогу, для создания там новой папки или файла, в Windows это C:/, или D:/ а тут как? 
    • Автор destroyer86
      Всем привет, с помощью 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()); Как мы можем заметить этого метода в описании интерфейса нет, но есть в классе, как получить доступ к экземпляру класса?
    • Автор Yarpda
      Доброго дня уважаемые форумчане!
      Есть одна задача, но я не совсем уверен, что так можно, прошу совета.
      В общем есть приложение, в ней база данных SqlLite (файл базы данных деплоится в assets\internal\). Пользователь наполняет эту базу данных своими данными.
      Необходимо сделать возможность экспортирования этих данных на внешний носитель и последующего импортирования уже на другом устройстве.
      Вопрос, даст ли система экспортировать свой файл из assets\internal и главное импортировать его (т.е. фактически заменить существующий файл  базы данных) в папке assets\internal на другом устройстве? (предполагается что root прав у пользователя нет).
      Если да, то можно вкратце объяснить порядок действий (желательно с указанием запрашиваемых и статичных разрешений на это дело, путей обращения к файлам).
      Если нет, то каким образом тогда это можно сделать (формировать промежуточный файл с данными БД, а потом его обрабатывать на другом устройстве средствами СУБД)?
      P.S. Такая задача встала впервые, не очень разбираюсь в теме безопасности на Андроид устройствах и работе с файлами приложения напрямую, поэтому прошу помощи, может быть кто-то уже сталкивался с подобной задачей.
      Заранее спасибо! )
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...