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

"Display a Now Playing card" как отобразить карточку проигрываемого медиа


Игорь Маринин

Вопрос

Приложения для ТВ, воспроизводящие аудио, могут продолжать делать это после того, как пользователь возвращается на главный экран или переключается на другое приложение. Для этого приложение должно предоставить карточку Now Playing на главном экране. 

https://developer.android.com/training/tv/playback/now-playing

для теста набросал код, но ничего не происходит.

при старте активирую медиасессию CreateMediaSession(optActive: boolean);

при старте проигрывания UpdateMediaMetadata('name song', 'artist');

при остановке UpdateMediaMetadata('', '');

что не так? 

unit AndroidMedia;

interface
uses

   System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.IOUtils,
   Androidapi.JNI.Media, Androidapi.JNI.App;

   procedure CreateMediaSession(optActive: boolean);
   procedure UpdatePlaybackState(State: Integer);
   procedure UpdateMediaMetadata(Title, Artist: string);

var
  MediaSession: JMediaSession;


implementation
uses
  DateUtils,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.Helpers;

procedure CreateMediaSession(optActive: boolean);
var
  PendingIntent: JPendingIntent;
  Intent: JIntent;
begin

  if (not optActive) or (Assigned(MediaSession)) then begin
     if Assigned(MediaSession) then MediaSession.setActive(false);
     if (not optActive) then exit;
  end;

  Intent := TJIntent.JavaClass.init;
  Intent.setClassName(TAndroidHelper.Context.getPackageName, StringToJString('com.embarcadero.firemonkey.FMXNativeActivity'));

  PendingIntent := TJPendingIntent.JavaClass.getActivity(TAndroidHelper.Context, 99, Intent, TJPendingIntent.JavaClass.FLAG_UPDATE_CURRENT);

  MediaSession := TJMediaSession.JavaClass.init(TAndroidHelper.Context, StringToJString('myMediaSession'));
  MediaSession.setFlags(TJMediaSession.JavaClass.FLAG_HANDLES_MEDIA_BUTTONS or TJMediaSession.JavaClass.FLAG_HANDLES_TRANSPORT_CONTROLS);
  MediaSession.setSessionActivity(PendingIntent);
  MediaSession.setActive(True);

end;


procedure UpdatePlaybackState(State: Integer);
var
  PlaybackState: JPlaybackState_Builder;
  myPlaybackState: JPlaybackState;
begin
  if not Assigned(MediaSession) then exit;

  PlaybackState := TJPlaybackState_Builder.JavaClass.init;
  PlaybackState.setState(State, 0, 1.0, DateTimeToMilliseconds(now));
  myPlaybackState:= PlaybackState.build;
  MediaSession.setPlaybackState(myPlaybackState);
end;


procedure UpdateMediaMetadata(Title, Artist: string);
var
  MetadataBuilder: JMediaMetadata_Builder;
  Metadata: Jmedia_MediaMetadata;
begin
  if not Assigned(MediaSession) then exit;

  if title = '' then begin
    MediaSession.setMetadata(nil);
    exit;
  end;

  UpdatePlaybackState(TJPlaybackState.JavaClass.STATE_PLAYING);

  MetadataBuilder := TJMediaMetadata_Builder.JavaClass.init;
  MetadataBuilder.putString(TJmedia_MediaMetadata.JavaClass.METADATA_KEY_TITLE, StringToJString(Title));
  MetadataBuilder.putString(TJmedia_MediaMetadata.JavaClass.METADATA_KEY_ARTIST, StringToJString(Artist));
  Metadata := MetadataBuilder.build;
  MediaSession.setMetadata(Metadata);



end;

initialization
  MediaSession := nil;

end.

 

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

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

Ответов пока нет

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

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

Гость
Ответить на вопрос...

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

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

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

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

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

  • Последние посетители   0 пользователей онлайн

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