Можно ли проверить, воспроизводит ли WebView видео в данный момент, и, если да, получить http: // ... .mp4 / URL этого видео для загрузки?
Я уже пробовал этот код:
public void onLoadResource(WebView view, final String url){
super.onLoadResource(view, url);
if (url.endsWith(".mp4") & !url.contains(".jpg") & !url.contains(".png")){
AlertDialog.Builder video_downloaden = new AlertDialog.Builder(SearchActivity.this);
video_downloaden.setTitle("Video downloaden?");
video_downloaden.setMessage("Download Video?");
video_downloaden.setPositiveButton("YES", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
DownloadManager.Request request_video = new DownloadManager.Request(Uri.parse(url));
request_video.allowScanningByMediaScanner();
request_video.setVisibleInDownloadsUi(false);
DownloadManager downloadManager2 = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
request_video.setDestinationInExternalFilesDir(getApplicationContext(), DIRECTORY_DOWNLOADS, File.separator + ".Videos" + File.separator + "video" + video_number);
downloadManager2.enqueue(request_video);
Toast.makeText(SearchActivity.this,"Download started",Toast.LENGTH_LONG).show();
}
});
video_downloaden.setNegativeButton("NO", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.cancel();
}
});
video_downloaden.show();
}
}
Но с onLoadResource() AlertDialog отображается все время, и загрузка не работает каждый раз ...
Итак, мой вопрос: есть ли другая возможность проверить, воспроизводит ли WebView видео, и получить URL-адрес видео?
Вы можете определить, воспроизводится ли видео, с помощью JavaScript.
Создайте файл .js в каталоге assets и объявите функцию JavaScript и jQuery следующим образом:
$("video").on("play", function() {
//You can call JavaScriptInterface here.
});
Вставьте этот файл .js на веб-страницу, содержащую видео. Я вставлял файл .js при вызове onPageFinished.
view?.context?.assets?.let {
val inputStream: InputStream = it.open(scriptFile)
val buffer = ByteArray(inputStream.available())
inputStream.read(buffer)
inputStream.close()
val encoded = Base64.encodeToString(buffer, Base64.NO_WRAP)
view.loadUrl("javascript:(function() {" +
"var parent = document.getElementsByTagName('head').item(0);" +
"var script = document.createElement('script');" +
"script.type = 'text/javascript';" +
"script.innerHTML = window.atob('$encoded');" +
"parent.appendChild(script)" +
"})()")
Если вы не знакомы с Kotlin, проверьте эту ссылку: Android Web-View: вставьте локальный файл Javascript на удаленную веб-страницу
Сделанный! Если вы используете JavaScriptInterface, вы можете делать все, что захотите, вот так.
class WebScriptInterface(val button: View) {
@JavascriptInterface
fun hideFloatingButton() {
if (button.visibility == View.VISIBLE) {
button.visibility = View.GONE
}
}
}
Установите webView, используйте JavaScriptInterface.
webView.addJavascriptInterface
(WebScriptInterface(binding.floatBrowserCollect), "App")
А потом звоните.
$("video").on("play", function() {
App.hideFloatingButton()
});
Надеюсь, это поможет тебе.
@NilsBe Смотрите это. Как добавить JavaScriptInterface И val используется в Kotlin. Отметьте номер 2 в моем ответе. Я связал URL-адрес того же кода в версии Java.
Большое спасибо, нет, это работает, но есть ли также возможность получить прямой URL-адрес видео, которое сейчас воспроизводится?
@NilsBe Я слышал, что есть способ получить URL-адрес видео с помощью JavaScript. Но я никогда не пробовал. Как насчет этого? Имейте один флаг (например, переменную логического типа, которая выражает, воспроизводится видео или нет), а в методе onLoadResources получите URL-адрес видео, только этот флаг имеет значение false (видео не воспроизводится).
Привет @ mel.j, я следил за вашим решением, но оно не работает. Не могли бы вы дать мне полный образец? Заранее спасибо!
Спасибо за ваш тент. Но у меня все еще есть проблемы: я не могу использовать
@JavaScriptInterface, потому что: Android Studio говорит: здесь нельзя использовать аннотации. И я не знаю, как использовать JavaScript (потому что я использую его впервые). Когда я копирую этот код, я получаю только ошибки. (Например,view?.context?.assets?.let {А что значит val? Извините за глупые вопросы, но я новичок в программировании ...