2

我制作了一个应用程序,它在 api 20+ 中完美运行,但对于 android 版本 4.4 及以下版本,它因错误而崩溃,NoClassDefFoundError: android.media.session.MediaSessionManager这是我在开发者控制台中获得的堆栈跟踪。

java.lang.NoClassDefFoundError: android.media.session.MediaSessionManager
at beatbox.neelay.beatbox.MediaService.initMediaSession(MediaService.java:634)
at beatbox.neelay.beatbox.MediaService.onStartCommand(MediaService.java:170)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2913)
at android.app.ActivityThread.access$2100(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1442)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5339)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644)
at dalvik.system.NativeStart.main(Native Method)

我能从中理解的是错误在 initMediaSession 方法中。这是我的 initMediaSession 方法

private void initMediaSession() throws RemoteException {
    if (mediaSessionManager != null) return; //mediaSessionManager exists

    mediaSessionManager = (MediaSessionManager) getSystemService(Context.MEDIA_SESSION_SERVICE);
    // Create a new MediaSession
    mediaSession = new MediaSessionCompat(getApplicationContext(), "AudioPlayer");
    //Get MediaSessions transport controls
    transportControls = mediaSession.getController().getTransportControls();
    //set MediaSession -> ready to receive media commands
    mediaSession.setActive(true);
    //indicate that the MediaSession handles transport control commands
    // through its MediaSessionCompat.Callback.
    mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);

    //Set mediaSession's MetaData
    updateMetaData();
    // passing the data


    // Attach Callback to receive MediaSession updates
    mediaSession.setCallback(new MediaSessionCompat.Callback() {
        // Implement callbacks
        @Override
        public void onPlay() {
            super.onPlay();
            messagesent();
            a = false;
            resumeMedia();
            buildNotification(PlaybackStatus.PLAYING);
        }

        @Override
        public void onPause() {
            super.onPause();
            messagesent();
            a = true;
            pauseMedia();
            buildNotification(PlaybackStatus.PAUSED);
        }

        @Override
        public void onSkipToNext() {
            super.onSkipToNext();

            skipToNext();
            updateMetaData();
            buildNotification(PlaybackStatus.PLAYING);
        }

        @Override
        public void onSkipToPrevious() {
            super.onSkipToPrevious();

            skipToPrevious();
            updateMetaData();
            buildNotification(PlaybackStatus.PLAYING);
        }

        @Override
        public void onStop() {
            super.onStop();
            removeNotification();
            //Stop the service
            pauseMedia();
            messagesent();
            stopSelf();
        }

        @Override
        public void onSeekTo(long position) {
            super.onSeekTo(position);
        }
    });
}

我不明白为什么它会在 4.4 和更少的设备上崩溃,以及我该如何解决这个问题。我用谷歌搜索并得到了这个,但这篇文章没有告诉如何解决这个问题。

4

3 回答 3

2

MediaSessionManager仅在 api 21 (5.0) 中添加

如果绝对有必要使用它,那么您可以将 min sdk 设置为 21 或检查您的内部版本号:

android.os.Build.VERSION.SDK

并且不要使用具有较低 sdks 的设备调用此服务

于 2017-05-24T03:24:17.410 回答
1

我也在遵循相同的教程并遇到相同的问题。我找到了解决方案。只需检查您的 SDK >21 是否仅使用方法initMediaSession();

于 2017-08-28T05:51:28.897 回答
1

看来原因可能是multidex造成的。在Get Method Count检查您的 apk 方法计数

您可以通过添加依赖项来启用multidex

compile 'com.android.support:multidex:1.0.1'

然后在配置中启用

 defaultConfig {
        multiDexEnabled true      
    }

在您的 android 部分添加以下代码段

dexOptions {
        javaMaxHeapSize "4g"
        preDexLibraries false
    }

    afterEvaluate {
        tasks.matching {
            it.name.startsWith('dex')
        }.each { dx ->
            if (dx.additionalParameters == null) {
                dx.additionalParameters = []
            }
            dx.additionalParameters += '--multi-dex'

            // this is optional
            dx.additionalParameters += "--main-dex-list=$projectDir/multidex.keep".toString()
        }
    }

    compileOptions {
        incremental false
    }
于 2017-05-09T08:47:09.197 回答