2

我做了一個應用程序它完美運行在api 20+,但對於Android 4.4版本和更少它崩潰與錯誤NoClassDefFoundError: android.media.session.MediaSessionManager這是我得到的堆棧跟蹤開發者控制檯。如何解決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); 
     } 
    }); 
} 

我不明白爲什麼它越來越crashend 4.4和較低的設備和我怎樣才能解決這個問題。我搜索並得到this,但這篇文章不告訴如何tofix這一點。

+0

檢查此:https://code.tutsplus.com/tutorials/background-audio-in-android-with-mediasessioncompat--cms-27030 –

回答

1

看來,原因可能是由於multidex。檢查您的APK方法計數在Get Method Count

您可以通過添加依賴使multidex

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

然後啓用它在配置

defaultConfig { 
     multiDexEnabled true  
    } 

附加按照你的

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 
    } 
Android的部分片段
+0

兄弟計數是36970這是什麼意思?並且我還必須在活動中調用multidex – SAVVY

+0

,它正在發生4.4。和較低版本5+正在完美工作 – SAVVY

+0

不,您不需要實施。只有方法計數超過65K –

2

MediaSessionManager僅在api中添加21(5.0)

如果這是絕對必要使用它,那麼你可以在你的分SDK設置爲21或檢查你的版本號:

android.os.Build.VERSION.SDK 

,而不是調用與設備此服務以較低的SDK

+0

亞我也來了解這一點,並沒有替代這個那麼如何解決這一對API <21 API? – SAVVY

+0

@SAVVY你在哪裏使用MediaSessionManager? – pantos27

+0

我在服務類中使用此播放歌曲 – SAVVY

1

我也遵循相同的教程,並有相同的問題。我找到了解決辦法。只需檢查您的SDK> 21,然後只使用方法initMediaSession();