Jump to content
View in the app

A better way to browse. Learn more.

FGX Native

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Проекту необходимо добавить аудиофайлы (музыка на заднем фоне и звук нажатия кнопок), как это можно реализовать в вашей библиотеке?

  • Author

Не подскажете, как именно это сделать и можно ли где-то найти примеры реализации?

Здравствуйте

У Ярослава в поставке есть файл Android.Api.Media.pas. Там реализован класс TJMediaPlayer.

Один из конструкторов которого

    class function create(const AArg0: TJContext; const AArg1: TJUri): TJMediaPlayer; overload;

Так же в этом классе есть методы

    procedure start;
    procedure stop;

Я думаю, Вам стоит посмотреть в этом направлении.

Спасибо

 

  • 2 months later...

Сделал так:

var
  m : JMediaPlayer;
  Asset: TfgAssetFile;
begin
  m := TJMediaPlayer.Create;

  if TfgAssetsManager.Current.Find<TfgAssetFile>(R.Files.MUZ_MP3, Asset) then
  begin    
    m.setDataSource(StringToJString(Asset.FileName));
    m.start;
  end;  
end;

image.png.9a367168ff3d276dc83ac5e47f242272.png

 

Но звука нет. Что не так сделал?

Сделал вот так: 

var
  Asset: TfgAssetFile;
  MP : JMediaPlayer;
  AudioObj: JObject;
begin
  if TfgAssetsManager.Current.Find<TfgAssetFile>(R.Files.MUZ_MP3, Asset) then
  begin
    MP := TJMediaPlayer.Create;
    MP.setDataSource(StringToJString(Asset.FileName));
    MP.setVolume(1, 1);
    MP.prepare;
    MP.start;
    FreeAndNil(MP);
  end;
end;

Звук играет. Однако не уверен в этом коде и есть пару вопросов:

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

2. Музыкальный файл  был взят длинный и не смотря на то, что после MP.Start идёт сразу FreeAndNil, музыка продолжает играть. Меня это устраивает, просто интересно нормально ли это и правильно ли это? Не будет ли каких либо утечек?

  • 4 months later...
23.05.2020 в 17:03, Yaroslav Brovin сказал:

Это можно сделать пока только через Android Api. 

Не подскажете а каким образом сейчас возможно на iOs воспроизвести звук, ну или какой то тоновый стандартный звук? Есть ли возможность? Необходимо звуковое сопровождение на реакцию.

@Yaroslav Brovin большое спасибо за направление, но был бы примерчик как его создать, вот это бы помогли. За ранее прошу прощения, но  никогда не делал подобного и беглый поиск ничего не дал. 

  • Administrators

В релизе 1.9.0.0 добавил хедеры для AVFoundation, в котором находится AVAudioPlayer. Как выйдет релиз, то вот код по воспроизведению аудио файла:

uses
  iOS.Api.AVFoundation, iOS.Api.Helpers, iOS.Api.Foundation;

var
  AudioPlayer: AVAudioPlayer;
  AudioFileUrl: NSURL;
  ErrorPtr: Pointer;
  Error: NSError;
begin
  AudioPlayer := TAVAudioPlayer.Create;
  AudioFileUrl := StrToNSUrl('Имя файла');
  AudioPlayer := TAVAudioPlayer.Wrap(AudioPlayer.initWithContentsOfURL(AudioFileUrl, @ErrorPtr));
  if ErrorPtr = nil then
  begin
    // Не удалось открыть файл
    Error := TNSError.Wrap(ErrorPtr);
    raise Exception.Create(NSStrToStr(Error.localizedDescription));
  end
  else
  begin
    AudioPlayer.prepareToPlay;
    AudioPlayer.play;
  end;
  • 2 weeks later...

Звук почему то все равно не воспроизводит.

Делаю вот так:
 

if (TfgAssetsManager.Current.Find<TfgAssetFile>('muz', Asset)) then
  begin       
   AudioPlayer := TAVAudioPlayer.Create;
   AudioFileUrl := StrToNSUrl(Asset.FileName);
   AudioPlayer := TAVAudioPlayer.Wrap(AudioPlayer.initWithContentsOfURL(AudioFileUrl, @ErrorPtr));
   if ErrorPtr = nil then
   begin
    // Не удалось открыть файл
    Error := TNSError.Wrap(ErrorPtr);
    raise Exception.Create(NSStrToStr(Error.localizedDescription));
   end
   else
   begin
     AudioPlayer.prepareToPlay; // <-- на этом месте слетает и дальше не отрабатывает. Хотя ошибок нет
     AudioPlayer.play;
   end;
  end;

Что я делаю не так, подскажите пожалуйста.

  • Administrators

В целом посмотрел. Сделал все, как по документации, но пока не работает:

procedure TFormMain.PlaySound(const AAssetName: TfgAssetName);
var
  AudioFileUrl: NSURL;
  Asset: TfgAssetFile;
  ErrorPtr: Pointer;
  Error: NSError;
  Session: AVAudioSession;
  d: NSTimeInterval;
begin
  if TfgAssetsManager.Current.Find<TfgAssetFile>(AAssetName, Asset) then
  begin
    Session := TAVAudioSession.OCClass.sharedInstance;
    Session.setCategory(AVAudioSessionCategoryPlayback, @ErrorPtr);
    if ErrorPtr <> nil then
    begin
      // Не удалось задать категорию воспроизведения звуков
      Error := TNSError.Wrap(ErrorPtr);
      raise Exception.Create(NSStrToStr(Error.localizedDescription));
    end;

    FAudioPlayer := TAVAudioPlayer.Create;
    AudioFileUrl := StrToNSUrl(Asset.FileName);
    FAudioPlayer := TAVAudioPlayer.Wrap(FAudioPlayer.initWithContentsOfURL(AudioFileUrl, @ErrorPtr));
    if ErrorPtr <> nil then
    begin
      // Не удалось открыть файл
      Error := TNSError.Wrap(ErrorPtr);
      raise Exception.Create(NSStrToStr(Error.localizedDescription));
    end;
    if FAudioPlayer.prepareToPlay then
      FAudioPlayer.play;
  end
  else
    raise Exception.CreateFmt('Cannot play sound. Asset is not available: assetName="%s"', [AAssetName]);
end;

Завтра продолжу. Файл открывается, но не может забуферизироваться.

Однако, я тоже попробовал, кстати на FMX тоже не работает, может это SDK(13.5) или особенности трансляции хедеров?

Хотя  демка на свифте заработала

Если использовать TAVPlayer и Sex Pistols, то работает.

procedure TFormMain.PlaySound(const AAssetName: TfgAssetName);
var
  Asset: TfgAssetFile;
  ErrorPtr: Pointer;
  FName:string;
  Session: AVAudioSession;
begin
  if TfgAssetsManager.Current.Find<TfgAssetFile>(AAssetName, Asset) then
  begin
    FName:=Asset.FileName;
    FAudioPlayer := TAVPlayer.Create;
    FAudioPlayer := TAVPlayer.Wrap(FAudioPlayer.initWithURL(TNSURL.OCClass.fileURLWithPath(StrToNSStr(FName))));
    Session := TAVAudioSession.OCClass.sharedInstance;
    Session.setCategory(AVAudioSessionCategoryPlayback, @ErrorPtr);
    Session.setActive(True,@ErrorPtr);
    FAudioPlayer.play;

  end
  else
    raise Exception.CreateFmt('Cannot play sound. Asset is not available: assetName="%s"', [AAssetName]);
end;
 

testIosSound.zip

@Stasспасибо за ваше участие! Проверил у себя, звук работает, все отлично! 

На заметку, в ассет менеджере файл заливаем и ставим место распаковки: Закрытые документы (private)! Иначе чета он там файл не может создать и т.д. 

Create an account or sign in to comment

Recently Browsing 0

  • No registered users viewing this page.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.