2

J'ai fait une application il fonctionne parfaitement dans api 20+ mais pour android version 4.4 et moins, il se bloque avec erreur NoClassDefFoundError: android.media.session.MediaSessionManager c'est la trace de la pile que je reçois dans la console du développeur.Comment réparer 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) 

Tout ce que je suis en mesure de comprendre de tout cela est l'erreur est dans la méthode initMediaSession .ce est ma méthode de 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); 
     } 
    }); 
} 

Je ne comprends pas pourquoi il devient crashend pour 4,4 et moins de dispositifs et Comment puis-je résoudre ce problème. J'ai googlé et j'ai obtenu this mais ce message ne dit pas comment tofix this.

+0

vérifiez ceci: https://code.tutsplus.com/tutorials/background-audio-in-android-with-mediasessioncompat--cms-27030 –

Répondre

1

Il semble que la raison peut être due à multidex. Vérifiez votre compte de méthode apk à Get Method Count

Vous pouvez activer multidex en ajoutant la dépendance

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

permettent alors dans config

defaultConfig { 
     multiDexEnabled true  
    } 

add suivant extrait dans la section Android de votre

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 
    } 
+0

bro le nombre est 36970 qu'est-ce que cela signifie? et devrais-je appeler multidex dans l'activité également – SAVVY

+0

et il se passe pour 4.4. et moins la version 5+ fonctionne parfaitement – SAVVY

+0

Non, vous n'avez pas besoin de l'implémenter. Il est nécessaire seulement si le compte de la méthode dépasse 65K –

2

MediaSessionManager a été ajouté seulement dans l'API 21 (5,0)

S'il est absolument nécessaire de l'utiliser, vous pouvez régler votre min sdk à 21 ou vérifiez votre numéro de build avec:

android.os.Build.VERSION.SDK 

et pas appeler ce service avec des appareils avec sdks inférieurs

+0

ya je suis également venu à savoir à ce sujet et aussi il n'y a pas de substitution pour cela, alors comment résoudre ce problème pour api <21 api? – SAVVY

+0

@SAVVY où utilisez-vous MediaSessionManager? – pantos27

+0

Je l'utilise dans la classe de service pour jouer la chanson – SAVVY

1

Je suis également le même tutoriel et j'ai eu le même problème. J'ai trouvé la solution à cela. Vérifiez simplement si votre SDK> 21 utilise uniquement la méthode initMediaSession();