Как транслировать видео с помощью расширения ExoPlayer cast из модуля динамических функций

У меня происходит сбой, когда я пытаюсь транслировать HLS-видео из моего приложения в Chromecast. Я использую расширение ExoPlayer cast.

Я использую версию exoplayer 2.11.1 & play services cast framework version 18.0.0. Код вызывается из динамического модуля (apply plugin: 'com.android.dynamic-feature'находится в модуле build.gradle). Вот моя реализация:

Когда мы создаем Фрагмент:

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

Когда пользователь нажимает кнопку трансляции:

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()
            }
        }
    })
}

Когда пользователь нажимает кнопку трансляции в моем приложении, а затем на устройстве, которое он хочет транслировать в диалоговом окне, приложение систематически вылетает. Вот 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)

Приложение вылетает только на Pixel 3 и Pixel 3a, но не на Samsung S9.

Может кто-нибудь скажет мне, что мне не хватает, пожалуйста?

1 ответ

После недели расследования возникли две проблемы с Github (на Glide и ExoPlayer), я все еще не нашел никакого решения. Итак, я в конечном итоге понизил версию фреймворка для игровых сервисов с18.0.0 к 17.0.0. По крайней мере, мое приложение перестало давать сбой и ведет себя так, как я хочу.

Я надеюсь найти лучшее решение.

Другие вопросы по тегам