java - 如何让 WebView 保持视频或音频在后台播放?

标签 java android audio android-webview chromium

让我们假设,我有以下基本应用程序:

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");
   }

}

现在,如果是一个网站,例如。 G。 https://www.w3schools.com/html/html5_video.asp ,包括视频或音频(我不知道该 URL,因为用户可以打开任何网站),并且用户打开另一个应用程序或关闭屏幕,视频或音频将停止。

但是,我希望它继续下去。它应该类似于 Google Chrome 的做法:

Videos continue playing in background when using Google Chrome

我已经看到了解决方案,启动背景声音服务,但是,如果我不知道视频/声音文件的 URL,如何找到它?我需要注入(inject)一些 JavaScript 还是有更干净的解决方案?

更新:我可以通过 JavascriptInterface 获取视频 URL ,但它通常是一个 Blob (例如在 YouTube 中)。我该如何继续?

更新2:如您所见,我找到了解决方案。但是,我不确定这是否是一个干净的解决方案。有没有人有更好的解决方案 - 也许可以像 Chrome 一样使用通知栏中的控件?

最佳答案

经过一番搜索,我发现了this线。我做了类似的事情:只需扩展 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);
   }

}

这样,如果屏幕锁定或打开其他应用程序,音频将继续播放。但是,通知栏或锁定屏幕上不会有任何控件。

关于java - 如何让 WebView 保持视频或音频在后台播放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52028940/

相关文章:

ios - 如何增加声音文件(如uiimagefile)的值

java - Axon amqp 消息传递,未触发事件处理程序

java - RemoteServiceServlet 使用 getThreadLocalRequest() 返回 null

java - 如何在等待结束过程时真正显示 ProgressDialog

javascript - Android:在 webview 中使用 javascript 单击没有 id 或 class 的链接

android - 适用于 PC(非 Android)的 OpenSL 教程 ES

java - 在 swing 中将表格添加到框架

android - 如何降低android中搜索 View 的高度?

android - java.lang.RuntimeException : Error receiving broadcast Intent On install Apk 错误

python - 无法从服务器的Python脚本播放音频