如何修复NoClassDefFoundError:android.media.session.MediaSessionManager
我制作了一个应用程序,它在api 20+中运行得非常完美,但对于android版本4.4及以下版本,它会崩溃,出现错误NoClassDefFoundError:android.media.session.MediaSessionManager这是我在开发者控制台中获得的堆栈跟踪如何修复NoClassDefFoundError:android.media.session.MediaSessionManager,android,runtime-error,android-mediaplayer,android-mediasession,Android,Runtime Error,Android Mediaplayer,Android Mediasession,我制作了一个应用程序,它在api 20+中运行得非常完美,但对于android版本4.4及以下版本,它会崩溃,出现错误NoClassDefFoundError:android.media.session.MediaSessionManager这是我在开发者控制台中获得的堆栈跟踪 java.lang.NoClassDefFoundError: android.media.session.MediaSessionManager at beatbox.neelay.beatbox.MediaServi
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及以下的设备会出现崩溃,以及我如何解决这个问题。我在谷歌上搜索并得到了这篇文章,但这篇文章没有说明如何解决这个问题。似乎原因可能是多索引。检查您的apk方法计数 可以通过添加依赖项来启用多索引
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
}
MediaSessionManager仅在api 21 5.0中添加
如果绝对有必要使用它,那么您可以将min sdk设置为21或使用以下工具检查您的版本号:
android.os.Build.VERSION.SDK
不要在SDK较低的设备上调用此服务我也遵循相同的教程,遇到了相同的问题。我找到了解决办法。只需检查您的SDK是否>21,然后只使用initMediaSession方法 兄弟计数是36970这意味着什么?我需要在活动中调用multidex吗?它在4.4中发生。而小版本5+正在完美地工作。不,您不需要实现。只有当方法计数超过65KSo时才需要,问题是什么bro以及我如何解决这个问题检查这个:是的,我也知道这一点,并且没有替代品,那么api@savy如何解决这个问题,你在哪里使用MediaSessionManager?我在服务类中使用它来发挥作用song@SAVVY用什么方法您使用的是MediaSessionManager吗?先生,initMediaSession是我使用MediaSessionManager方法的地方。