Android开机时崩溃 - MediaButtonReceiver可能为空。

6
我在Unity应用中遇到了问题,Android 4.3设备启动时崩溃。应用程序加载我编写的本地插件,用于在暂停应用程序时播放背景音乐。该插件使用Android MediaBrowser API,并使用“兼容”版本以继续支持先前版本的Android。
06-07 09:59:37.000: E/AndroidRuntime(1748): FATAL EXCEPTION: main
06-07 09:59:37.000: E/AndroidRuntime(1748): java.lang.Error: FATAL EXCEPTION [main]
06-07 09:59:37.000: E/AndroidRuntime(1748): Unity version     : 5.6.1f1
06-07 09:59:37.000: E/AndroidRuntime(1748): Device model      : samsung GT-I9300
06-07 09:59:37.000: E/AndroidRuntime(1748): Device fingerprint: samsung/m0xx/m0:4.3/JSS15J/I9300XXUGMK6:user/release-keys
06-07 09:59:37.000: E/AndroidRuntime(1748): Caused by: java.lang.RuntimeException: Unable to create service com.help.stressfree.mediabrowser.MusicService: java.lang.IllegalArgumentException: MediaButtonReceiver component may not be null.
06-07 09:59:37.000: E/AndroidRuntime(1748):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2697)
06-07 09:59:37.000: E/AndroidRuntime(1748):     at android.app.ActivityThread.access$1700(ActivityThread.java:159)
06-07 09:59:37.000: E/AndroidRuntime(1748):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1404)
06-07 09:59:37.000: E/AndroidRuntime(1748):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-07 09:59:37.000: E/AndroidRuntime(1748):     at android.os.Looper.loop(Looper.java:176)
06-07 09:59:37.000: E/AndroidRuntime(1748):     at android.app.ActivityThread.main(ActivityThread.java:5419)
06-07 09:59:37.000: E/AndroidRuntime(1748):     at java.lang.reflect.Method.invokeNative(Native Method)
06-07 09:59:37.000: E/AndroidRuntime(1748):     at java.lang.reflect.Method.invoke(Method.java:525)
06-07 09:59:37.000: E/AndroidRuntime(1748):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
06-07 09:59:37.000: E/AndroidRuntime(1748):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
06-07 09:59:37.000: E/AndroidRuntime(1748):     at dalvik.system.NativeStart.main(Native Method)
06-07 09:59:37.000: E/AndroidRuntime(1748): Caused by: java.lang.IllegalArgumentException: MediaButtonReceiver component may not be null.
06-07 09:59:37.000: E/AndroidRuntime(1748):     at android.support.v4.media.session.MediaSessionCompat$MediaSessionImplBase.<init>(MediaSessionCompat.java:1054)
06-07 09:59:37.000: E/AndroidRuntime(1748):     at android.support.v4.media.session.MediaSessionCompat.<init>(MediaSessionCompat.java:176)
06-07 09:59:37.000: E/AndroidRuntime(1748):     at android.support.v4.media.session.MediaSessionCompat.<init>(MediaSessionCompat.java:118)
06-07 09:59:37.000: E/AndroidRuntime(1748):     at com.help.stressfree.mediabrowser.MusicService.onCreate(MusicService.java:169)
06-07 09:59:37.000: E/AndroidRuntime(1748):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2687)
06-07 09:59:37.000: E/AndroidRuntime(1748):     ... 10 more

我的重写Unity活动在onCreate中有以下内容:

protected void onCreate(Bundle savedInstanceState) {

        // call UnityPlayerActivity.onCreate()
        super.onCreate(savedInstanceState);

        Instance = this;

        LogHelper.d(TAG, "ThriveUnityPlayerActivity.onCreate");

        //Intent intent = new Intent(this, MusicPlayerActivity.class);
        //startActivity(intent);

        Intent intent = new Intent(this, MusicService.class);
        startService(intent);
    }

我的MusicService类有以下onCreate函数。
@Override
     public void onCreate() {
         super.onCreate();
         LogHelper.d(TAG, "onCreate");

         //mPlayingQueue = new ArrayList<>();
         //mMusicProvider = new MusicProvider();
         //mPackageValidator = new PackageValidator(this);

         mMyServiceHandler = new Handler()
         {
             //here we will receive messages from activity(using sendMessage() from activity)
             public void handleMessage(Message msg)
             {
                 LogHelper.i(TAG,"handleMessage(Message msg)" );
                 switch(msg.what)
                 {
                     case 0:
                         PlayTrackByName((String) msg.obj);

                         break;

                     default:
                         break;
                 }
             }
         };

         // Start a new MediaSession
         mSession = new MediaSessionCompat(this, "MusicService");
         setSessionToken(mSession.getSessionToken());
         mSession.setCallback(new MediaSessionCallback());
         mSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
             MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);

         mPlayback = new Playback(this/*, mMusicProvider*/);
         mPlayback.setState(PlaybackStateCompat.STATE_NONE);
         mPlayback.setCallback(this);
         mPlayback.start();

         Context context = getApplicationContext();
         Intent intent = new Intent(context, MusicPlayerActivity.class);
         PendingIntent pi = PendingIntent.getActivity(context, 99 /*request code*/,
                 intent, PendingIntent.FLAG_UPDATE_CURRENT);
         mSession.setSessionActivity(pi);

         Bundle extras = new Bundle();
         //CarHelper.setSlotReservationFlags(extras, true, true, true);
         mSession.setExtras(extras);

         updatePlaybackState(null);

         mMediaNotificationManager = new MediaNotificationManager(this);
     }

有人知道这个崩溃意味着什么,以及我该如何修复它吗?


我遇到了与我的一些用户相同的问题。有可能是他们使用的设备无法在清单中注册媒体按钮操作的广播接收器组件。对于我的用户,存在此问题的设备是ALCATEL ONETOUCH Flash Plus:版本4.4.4。 - Zul
我的设备是一部Galaxy S3。 - Real World
嘿,你能解决这个问题吗?如果可以的话,你能分享答案吗? - SAVVY
我还没有机会回到这个问题,但我会的。 - Real World
@Zul 我也一样。需要帮忙吗? - sam_k
3个回答

22
尝试在控制媒体的活动下的清单中添加媒体按钮接收器。我在4.4上遇到了这个问题,但在更高版本上没有。
<receiver android:name="android.support.v4.media.session.MediaButtonReceiver" >
<intent-filter>
  <action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>

请仔细阅读; 媒体按钮接收器


2
实际上,这是针对棒棒糖之前版本的要求。Android团队提供了一个很好的示例媒体播放器应用程序,其中包含此代码 - rpattabi
5
如果使用AndroidX,则类是“androidx.media.session.MediaButtonReceiver”。更多信息请参见:https://developer.android.com/reference/androidx/media/session/MediaButtonReceiver - Tom11
@ThadeusAjayi,你认为我们在使用androidx开发时应该使用android.support.v4.media.session.MediaSessionCompat库吗? - juztcode
@juztcode 我猜不会。AndroidX显然会有一个不同的支持库来支持mediasession。 - Thadeus Ajayi

1

因为我的错误,我在 AndroidManifest.xml 中定义了两个 MEDIA_BUTTON 操作,所以我遇到了相同的问题。

<receiver android:name="android.support.v4.media.session.MediaButtonReceiver">
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </receiver>
    <receiver android:name=".receiver.MediaButtonIntentReceiver">
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_BUTTON" />
            <action android:name="android.media.AUDIO_BECOMING_NOISY" />
        </intent-filter>
    </receiver>

所以我删除了其中一个,错误消失了。

1

更新 AndroidX

<receiver android:name="androidx.media.session.MediaButtonReceiver" >
   <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
   </intent-filter>
</receiver>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接