我在崩溃问题上遇到了这次崩溃,有没有人遇到这样的问题?
Thx,提前
异常java.lang.RuntimeException:无法启动接收器 android.support.v4.media.session.MediaButtonReceiver: java.lang.IllegalStateException:找不到任何服务 处理[REDACTED_DOMAIN_NAME] _BUTTON或媒体浏览器服务 实现android.app.ActivityThread.handleReceiver (ActivityThread.java:3643)android.app.ActivityThread.access $ 2000 (ActivityThread.java:222)android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1878)android.os.Handler.dispatchMessage (Handler.java:102)android.os.Looper.loop(Looper.java:158) android.app.ActivityThread.main(ActivityThread.java:7230) java.lang.reflect.Method.invoke(Method.java) com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1230)com.android.internal.os.ZygoteInit.main
(ZygoteInit.java:1120)引起的 java.lang.IllegalStateException:找不到任何服务 处理[REDACTED_DOMAIN_NAME] _BUTTON或媒体浏览器服务 履行 android.support.v4.media.session.MediaButtonReceiver.onReceive (MediaButtonReceiver.java:97) android.app.ActivityThread.handleReceiver(ActivityThread.java:3636) android.app.ActivityThread.access $ 2000(ActivityThread.java:222) android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1878) android.os.Handler.dispatchMessage(Handler.java:102) android.os.Looper.loop(Looper.java:158) android.app.ActivityThread.main(ActivityThread.java:7230) java.lang.reflect.Method.invoke(Method.java) com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1230)com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1120)
答案 0 :(得分:0)
Google官方文件的解释: 此类假定您的应用程序中有一个服务,该服务通过MediaSessionCompat控制媒体播放。 MediaButtonReceiver收到键事件后,此类将尝试查找可以处理Intent.ACTION_MEDIA_BUTTON的服务,以及依次处理的MediaBrowserServiceCompat。如果找到合适的服务,则此类将键事件转发到该服务。如果两者都不可用,或者找不到多个有效的服务/媒体浏览器服务,则将抛出IllegalStateException。因此,您的应用应具有下列服务之一,才能正确获取键事件。
您可以通过以下方式解决它: 1.服务可以通过包含处理Intent的Intent过滤器来接收键事件。
<service android:name="com.example.android.MediaPlaybackService" >
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</service>
然后可以通过调用handleIntent(MediaSessionCompat,Intent)在Service.onStartCommand(Intent,int,int)中处理事件,并传入当前的MediaSessionCompat: 私有MediaSessionCompat mMediaSessionCompat = ...;
public int onStartCommand(Intent intent, int flags, int startId) {
MediaButtonReceiver.handleIntent(mMediaSessionCompat, intent);
return super.onStartCommand(intent, flags, startId);
}
这可确保根据传入的KeyEvent触发对MediaSessionCompat.Callback的正确回调。
2.MediaBrowserService 如果您的应用程序中已有MediaBrowserServiceCompat,则默认情况下,MediaButtonReceiver会将接收到的按键事件传递给MediaBrowserServiceCompat。您可以在MediaSessionCompat.Callback中处理它们。
答案 1 :(得分:0)
如果您使用androidX依赖项更新项目,则必须导入
unit Unit2;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.StdCtrls, System.Generics.Collections,
FMX.Objects;
type
TForm2 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
mImageList: TList<TImage>;
mSwitch: boolean;
implementation
uses
Threading;
{$R *.fmx}
procedure TForm2.FormCreate(Sender: TObject);
var
cImage: TImage;
I: Integer;
begin
mImageList := TList<TImage>.create;
mSwitch := false;
for I := 0 to 3 do
begin
cImage := TImage.Create(nil);
cImage.Parent := Form2;
mImageList.Add(cImage);
end;
Form2.FullScreen := true;
timer1.Interval := 3000;
end;
procedure TForm2.Timer1Timer(Sender: TObject);
begin
TThread.CreateAnonymousThread(procedure
var
I: Integer;
heightSum: single;
path: string;
begin
if not(mSwitch) then
path := 'images\1\1 ('
else
path := 'images\2\2 (';
heightSum := 0;
for I := 0 to mImageList.Count - 1 do
begin
mImageList[I].Bitmap := nil;
end;
for I := 0 to mImageList.Count - 1 do
begin
mImageList[I].Bitmap.LoadFromFile(path + (i + 1).ToString + ').jpg');
mImageList[I].Width := mImageList[I].Bitmap.Width;
mImageList[I].Height := mImageList[I].Bitmap.Height;
mImageList[I].Position.X := Form2.Width / 2 - mImageList[I].Width / 2;
mImageList[I].Position.Y := heightSum;
heightSum := heightSum + mImageList[I].Height;
end;
TThread.Synchronize(nil, procedure
begin
end);
end).Start;
mSwitch := not(mSwitch);
end;
end.