Delphi 10.4.1 如何在JMediaSession.setCallback中使用Android JMediaSession_Callback

问题描述

我正在使用 Delphi 10.4.1 为 Android 编写媒体播放器。该应用有一项服务,该服务使用 JMediaSession 来显示正在播放的内容 (JMediaSession.setMetadata) 以及播放器所处的状态 (JMediaSession.setPlaybackState),该服务运行良好。

JMediaSession.Callback 是另外一回事!但是,多亏了 Dave Nottage,我现在才开始工作。

ExMediaSessionCallback.java 的内容

package se.infinitus.ExsurdoPlayer;

import android.media.session.MediaSession;

public class ExMediaSessionCallback extends MediaSession.Callback
{
    private static final String TAG = "ExMediaSessionCallback";
    private ExMediaSessionCallbackDelegate mDelegate;

    public ExMediaSessionCallback(MediaSession mediaSession,ExMediaSessionCallbackDelegate delegate)
    {
       mDelegate = delegate;
       mediaSession.setCallback(this);
    }

    @Override
    public void onPlay() {
      mDelegate.onPlay();
    }

    @Override
    public void onPause() {
      mDelegate.onPause();
    }

    @Override
    public void onSkipToNext() {
      mDelegate.onSkipToNext();
    }

    @Override
    public void onSkipToPrevIoUs() {
      mDelegate.onSkipToPrevIoUs();
    }

    @Override
    public void onStop() {
      mDelegate.onStop();
    }

}

ExMediaSessionCallbackDelegate.java 的内容

package se.infinitus.ExsurdoPlayer;

public interface ExMediaSessionCallbackDelegate {

            public void onPlay();
            public void onPause();
            public void onSkipToNext();
            public void onSkipToPrevIoUs();
            public void onStop();
}

使用 jdk1.8.0_66 的 javac.exe 编译。两个 .class 放在一个 .Jar 中,然后将 Jar 添加到我的项目中。

然后我运行 Java2OP.exe 来创建 ExMediaSessionCallback.pas

ExMediaSessionCallback.pas 的内容

unit ExMediaSessionCallback;

interface

uses
  Androidapi.JNIBridge,Androidapi.JNI.JavaTypes,Androidapi.JNI.Media;

type
// ===== Forward declarations =====

  JExMediaSessionCallback = interface;//se.infinitus.ExsurdoPlayer.ExMediaSessionCallback
  JExMediaSessionCallbackDelegate = interface;//se.infinitus.ExsurdoPlayer.ExMediaSessionCallbackDelegate

// ===== Interface declarations =====

  JExMediaSessionCallbackClass = interface(JMediaSession_CallbackClass)
    ['{E1A7600E-A146-4AB9-9973-C1602FBF4F50}']
    {class} function init(mediaSession: JMediaSession; exMediaSessionCallbackDelegate: JExMediaSessionCallbackDelegate): JExMediaSessionCallback; cdecl;
  end;

  [JavaSignature('se/infinitus/ExsurdoPlayer/ExMediaSessionCallback')]
  JExMediaSessionCallback = interface(JMediaSession_Callback)
    ['{4D614E2A-CE76-4C7A-827E-E72690A001EC}']
    procedure onPause; cdecl;
    procedure onPlay; cdecl;
    procedure onSkipToNext; cdecl;
    procedure onSkipToPrevIoUs; cdecl;
    procedure onStop; cdecl;
  end;
  TJExMediaSessionCallback = class(TJavaGenericImport<JExMediaSessionCallbackClass,JExMediaSessionCallback>) end;

  JExMediaSessionCallbackDelegateClass = interface(IJavaClass)
    ['{961E91BA-961D-4918-9EAC-A5B53ECDE70F}']
  end;

  [JavaSignature('se/infinitus/ExsurdoPlayer/ExMediaSessionCallbackDelegate')]
  JExMediaSessionCallbackDelegate = interface(IJavaInstance)
    ['{81A470A3-63F3-44B9-B4FC-1F0A0EC9513B}']
    procedure onPause; cdecl;
    procedure onPlay; cdecl;
    procedure onSkipToNext; cdecl;
    procedure onSkipToPrevIoUs; cdecl;
    procedure onStop; cdecl;
  end;
  TJExMediaSessionCallbackDelegate = class(TJavaGenericImport<JExMediaSessionCallbackDelegateClass,JExMediaSessionCallbackDelegate>) end;

implementation

procedure RegisterTypes;
begin
  TRegTypes.RegisterType('JavaInterfaces.JExMediaSessionCallback',TypeInfo(JavaInterfaces.JExMediaSessionCallback));
  TRegTypes.RegisterType('JavaInterfaces.JExMediaSessionCallbackDelegate',TypeInfo(JavaInterfaces.JExMediaSessionCallbackDelegate));
end;

initialization
  RegisterTypes;
end.

然后我像这样在我的服务中使用它:

 private     
   jms: JMediaSession;
   jexcallback: JExMediaSessionCallback;
   jexcallbackDelegate: TExMediaSessionCallbackDelegate;

 in ServiceCreate
 jms:= TJMediaSession.JavaClass.init(TAndroidHelper.Context,StringToJString('ExsurdoService'));
 jexcallbackDelegate:= TExMediaSessionCallbackDelegate.Create(self);
 jexcallback:= TJExMediaSessionCallback.JavaClass.init(jms,jexcallbackDelegate);
 jms.setActive(true);

相当多的步骤,但多亏了 Daves 的例子,只花了一天时间就搞定了!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)