как обрабатывать исключение exoplayer2, когда URI источника медиа недоступен? - PullRequest
0 голосов
/ 12 июля 2020

Я использую Exoplayer 2.11. * Для создания приложения для потокового аудио на Android. Аудио размещается на удаленном сервере, а потоковая передача выполняется с помощью Icecast. Проблема в том, что сервер иногда не работает, и когда пользователь открывает приложение в этот раз, я хочу показать тост об этом. Сначала я делал это как:

final ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();

DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(
                getContext(),
                Util.getUserAgent(getContext(), "SUSTCast"),
                defaultBandwidthMeter);

Mediasource mediaSource = new ExtractorMediaSource(
                Uri.parse(iceURL),
                dataSourceFactory,
                extractorsFactory,
                new Handler(), error -> {
                 //shows a toast here
                }
        );

, но в этом случае тост отображается 3-4 раза, так как я думаю, что exoplayer пытается перезагрузить URI. В качестве альтернативы я попытался решить эту проблему с помощью блока try / catch ... но это просто не смогло отловить ошибку. Может ли кто-нибудь сказать мне, что еще я мог бы попробовать или что я здесь делаю не так? Это трассировка стека исключения, созданного во время неработающего сервера:

ExoPlayerImplInternal: Source error.
    com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 404
        at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:300)
        at com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:177)
        at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:83)
        at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:956)
        at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:391)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
        at java.lang.Thread.run(Thread.java:761)

1 Ответ

1 голос
/ 13 июля 2020

Вы должны обрабатывать ошибки, используя прослушиватели событий, которые прикреплены к самому exoplayer.

exoPlayer.addListener(object: Player.EventListener {
                        override fun onPlayerError(error: ExoPlaybackException) {
                            super.onPlayerError(error)
                            //show toast
                        }
                    })
...