无法启动接收器android.support.v4.media.session.MediaButtonReceiver

时间:2017-11-06 15:47:13

标签: android

我在崩溃问题上遇到了这次崩溃,有没有人遇到这样的问题?

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)

2 个答案:

答案 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.