Как я могу заставить WebView поддерживать воспроизведение видео или аудио в фоновом режиме? - PullRequest
0 голосов
/ 26 августа 2018

Допустим, у меня есть следующее основное приложение:

public class MainActivity extends AppCompatActivity {

   private WebView webView;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       webView = (WebView) findViewById(R.id.webview);
       webView.getSettings().setJavaScriptEnabled(true);

       webView.setWebViewClient(new WebViewClient(){

           @Override
           public boolean shouldOverrideUrlLoading(WebView view, String url){
               return true;
           }

       });

       webView.loadUrl("https://www.w3schools.com/html/html5_video.asp");
   }

}

Теперь, если веб-сайт, e.г.https://www.w3schools.com/html/html5_video.asp, включает видео или аудио (URL мне неизвестен, так как пользователь может открыть любой сайт), а пользователь открывает другое приложение или выключает экран, видео или аудио останавливается.

Однако я бы хотел продолжить.Это должно быть похоже на то, что делает Google Chrome:

Videos continue playing in background when using Google Chrome

Я видел решения, запускающие службу фонового звука, однако, как я могу найтиURL видео / звукового файла, если он мне неизвестен?Нужно ли вводить какой-то JavaScript или есть более чистое решение?

ОБНОВЛЕНИЕ: Я могу получить URL видео с JavascriptInterface, но эточасто капля (например, в YouTube).Как я могу продолжить это?

ОБНОВЛЕНИЕ 2: Как видите, я нашел решение.Однако я не уверен, является ли это чистым решением.У кого-нибудь есть лучшее решение - может быть, с элементами управления в панели уведомлений, как в Chrome?

1 Ответ

0 голосов
/ 27 августа 2018

После долгих поисков я нашел эту ветку.Я сделал нечто похожее: просто расширил WebView и переопределил onWindowVisibilityChanged.

public class MediaWebView extends WebView {

   public MediaWebView(Context context) {
       super(context);
   }

   public MediaWebView(Context context, AttributeSet attrs) {
       super(context, attrs);
   }

   public MediaWebView(Context context, AttributeSet attrs, int defStyleAttr) {
       super(context, attrs, defStyleAttr);
   }

   @Override
   protected void onWindowVisibilityChanged(int visibility) {
       if (visibility != View.GONE) super.onWindowVisibilityChanged(View.VISIBLE);
   }

}

. Таким образом, звук продолжает воспроизводиться, если экран заблокирован или открыто другое приложение.Однако в панели уведомлений или на экране блокировки не будет элементов управления.

...