问题描述
我正在使用 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 (将#修改为@)