Я хочу использовать библиотеку кэширования ExoPlayer, фактически не воспроизводя медиа на ExoPlayer.(Видео будет отображаться в WebView с помощью элементов HTML.) Цель состоит в том, чтобы реализовать постоянный кэш, чтобы приложение изящно обрабатывало при сбое подключения к Интернету.Проблема заключается в том, что для перехвата WebViewClient.shouldInterceptRequest(...)
, который я переопределяю, требуется InputStream как часть ответа, а MediaSource - такая высокоуровневая абстракция, что я не понял, как добраться до нижележащих байтов.
Exoplayer - это моя четвертая попытка получить надежную библиотеку кеширования в моей системе.
Первый - это простой класс в памяти, который я использую для тестирования.Он показывает, что система работает, но не является постоянной.
Далее я создал собственную простую библиотеку кэширования, которая отлично работает для небольших файлов, но не для больших видеофайлов (здесь яя только делаю прогрессивную загрузку / файлы mp4).
Я пытался https://github.com/danikula/AndroidVideoCache,, что интересно тем, как он раскручивает прокси-сервер для своей работы, но этовыбрасывает много IOException с закрытием сокетов.Также это чисто сквозной кеш.Мне нужно выборочно кэшировать и сбрасывать содержимое ... вещи, которые воспроизводятся во время интернет-соединений, - это не то же самое, что нужно хранить для восстановления после отказа.
- Наконец, я привел в подсистему кэширования exoplayer.Казалось, что в нем есть все, что мне нужно ... пока я не понял, что MediaSource не позволяет легко выводить из него данные.
Вот эскиз, где я пытаюсь перенести постоянный кеш вкод WebViewClient.Обратите внимание на INSERT_MAGIC_HERE()
вызов, для которого мне действительно нужно предложение.
public class MyWebviewFragment extends Fragment {
private WebView webView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// ...
webView = view.findViewById(R.id.web_view);
webView.setWebViewClient(new WebViewClient() {
// blocking call from a non-UI thread.
// returning null means call is not intercepted and Chromium engine handles it like normal.
@Override
public WebResourceResponse shouldInterceptRequest(final WebView view, WebResourceRequest request) {
// ...
// here I inspect the request and internet connectivity to
// update the persistent cache
// If I want to intercept the call and used cached data, I
// need to return a WebResourceResponse packed with an inputStream
MediaSource mediaSource = ProgressiveMediaSource.Factory(...).createMediaSorce(request.uri);
InputStream istream = INSERT_MAGIC_HERE(mediaSource)
return new WebResourceResponse(..., iStream, ...)
}
});
}
}
В качестве альтернативы, если это выходит за рамки возможностей ExoPlayer, я бы приветствовал альтернативное предложение.