如何让 WebView 在后台播放视频或音频?
How can I make WebView keep a video or audio playing in the background?
让我们假设,我有以下基本应用程序:
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。 G。 https://www.w3schools.com/html/html5_video.asp,包括视频或音频(URL 我不知道,因为用户可以打开任何网站)并且用户打开另一个应用程序或关闭屏幕,视频或音频停止。
但是,我希望它继续。它应该类似于 Google Chrome 所做的:
我看到解决办法,启动背景音服务,但是,如果我不知道video/sound文件的URL,我怎么能找到呢?我需要注入一些 JavaScript 还是有更清洁的解决方案?
更新: 我可以通过 JavascriptInterface
获取视频 URL,但它通常是一个 blob(例如在 YouTube 中) .我该如何处理?
更新 2: 如您所见,我找到了解决方案。但是,我不确定这是否是一个干净的解决方案。有没有人有更好的解决方案——也许像 Chrome?
中那样在通知栏中使用控件
经过大量搜索,我找到了 个帖子。我做了类似的事情:只需扩展 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);
}
}
这样,如果屏幕锁定或打开其他应用程序,音频将继续播放。但是,通知栏和锁屏上不会有控件。
让我们假设,我有以下基本应用程序:
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。 G。 https://www.w3schools.com/html/html5_video.asp,包括视频或音频(URL 我不知道,因为用户可以打开任何网站)并且用户打开另一个应用程序或关闭屏幕,视频或音频停止。
但是,我希望它继续。它应该类似于 Google Chrome 所做的:
我看到解决办法,启动背景音服务,但是,如果我不知道video/sound文件的URL,我怎么能找到呢?我需要注入一些 JavaScript 还是有更清洁的解决方案?
更新: 我可以通过 JavascriptInterface
获取视频 URL,但它通常是一个 blob(例如在 YouTube 中) .我该如何处理?
更新 2: 如您所见,我找到了解决方案。但是,我不确定这是否是一个干净的解决方案。有没有人有更好的解决方案——也许像 Chrome?
中那样在通知栏中使用控件经过大量搜索,我找到了 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);
}
}
这样,如果屏幕锁定或打开其他应用程序,音频将继续播放。但是,通知栏和锁屏上不会有控件。