I have a crash when I am trying to cast a HLS video from my app to a chromecast. I use the ExoPlayer cast extension.
I am using exoplayer version 2.11.1
& play services cast framework version 18.0.0
. The code is called from a dynamic module (apply plugin: 'com.android.dynamic-feature'
is found in the module's build.gradle
).
Here is my implementation :
When we create the Fragment :
private fun initCast() {
mediaRouteButton = view?.findViewById(R.id.media_route_button)
CastButtonFactory.setUpMediaRouteButton(activity?.applicationContext, mediaRouteButton)
val castContext = CastContext.getSharedInstance()
castContext?.addCastStateListener { state ->
if (isAdded) {
if (state == CastState.NO_DEVICES_AVAILABLE) {
isCastAvailable = false
} else {
isCastAvailable = true
mediaRouteButton?.visibility = videoTitle.visibility
}
}
}
}
When the user click the Cast button :
private fun prepareCast(title: String) {
CastContext.getSharedInstance()?.let {
castPlayer = CastPlayer(it)
}
val movieMetadata = MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE)
movieMetadata.putString(MediaMetadata.KEY_TITLE, title)
videoThumbnail?.let {
movieMetadata.addImage(WebImage(Uri.parse(it)))
}
val mediaInfo = MediaInfo.Builder(videoUrl)
.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
.setContentType(MimeTypes.VIDEO_UNKNOWN)
.setMetadata(movieMetadata).build()
val mediaItems = arrayOf(MediaQueueItem.Builder(mediaInfo).build())
castPlayer?.setSessionAvailabilityListener(object : SessionAvailabilityListener {
override fun onCastSessionAvailable() {
castPlayer?.loadItems(mediaItems, 0, playerViewModel.getVideoPosition(), Player.REPEAT_MODE_OFF)
playerViewModel.pauseVideo()
}
override fun onCastSessionUnavailable() {
castPlayer?.currentPosition?.let {
playerViewModel.setVideoPosition(it)
playerViewModel.playVideo()
}
}
})
}
When the user click on the cast button in my app and then on the device they want to cast on in the dialog, the app crash systematically. Here is the Stacktrace :
FATAL EXCEPTION: main
Process: media.brut.brut.debug, PID: 28644
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/common/api/HasApiKey;
at com.google.android.gms.internal.cast.zzr.zza(com.google.android.gms:play-services-cast-framework@@18.0.0:8)
at com.google.android.gms.cast.framework.CastSession.zzc(com.google.android.gms:play-services-cast-framework@@18.0.0:90)
at com.google.android.gms.cast.framework.CastSession.start(com.google.android.gms:play-services-cast-framework@@18.0.0:15)
at com.google.android.gms.cast.framework.Session$zza.start(com.google.android.gms:play-services-cast-framework@@18.0.0:6)
at com.google.android.gms.cast.framework.zzad.dispatchTransaction(com.google.android.gms:play-services-cast-framework@@18.0.0:17)
at com.google.android.gms.internal.cast.zza.onTransact(com.google.android.gms:play-services-cast@@18.0.0:13)
at android.os.Binder.transact(Binder.java:914)
at jx.b(:com.google.android.gms.dynamite_dynamitemodulesc@19831081@19.8.31 (120400-0):14)
at wb.b(:com.google.android.gms.dynamite_dynamitemodulesc@19831081@19.8.31 (120400-0):32)
at wk.a(:com.google.android.gms.dynamite_dynamitemodulesc@19831081@19.8.31 (120400-0):46)
at wv.c(:com.google.android.gms.dynamite_dynamitemodulesc@19831081@19.8.31 (120400-0):21)
at wt.a(:com.google.android.gms.dynamite_dynamitemodulesc@19831081@19.8.31 (120400-0):11)
at jy.onTransact(:com.google.android.gms.dynamite_dynamitemodulesc@19831081@19.8.31 (120400-0):5)
at android.os.Binder.transact(Binder.java:914)
at com.google.android.gms.internal.cast.zzb.zzb(com.google.android.gms:play-services-cast@@18.0.0:21)
at com.google.android.gms.internal.cast.zzaf.zzd(com.google.android.gms:play-services-cast-framework@@18.0.0:21)
at com.google.android.gms.internal.cast.zzaq.onRouteSelected(com.google.android.gms:play-services-cast-framework@@18.0.0:4)
at androidx.mediarouter.media.MediaRouter$GlobalMediaRouter$CallbackHandler.invokeCallback(MediaRouter.java:3218)
at androidx.mediarouter.media.MediaRouter$GlobalMediaRouter$CallbackHandler.handleMessage(MediaRouter.java:3168)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
The app crash only on the Pixel 3 & Pixel 3a but not on a Samsung S9.
Can someone tells me what am I missing please ?