VideoView 或 WebView 的文件协议支持?
File protocol support for VideoView or WebView?
在我的桌面计算机上的 Google Chrome 浏览器中,我可以使用以下 link:
流式传输驻留在我服务器上的 mp4 视频文件
file://192.168.0.1/Videos/video.mp4
我想在 Android 应用程序中执行相同的操作,但是当我尝试将相同的 link 放入 VideoView 或 WebView 时,它会遇到错误。
在VideoView中会报错说不能播放这个文件,在WebView中会报文件权限错误。
VideoView 我使用的代码是:
// Declare variables
ProgressDialog pDialog;
VideoView videoview;
// Insert your Video URL
String VideoURL = "file://192.168.0.1/Videos/video.mp4";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get the layout from video_main.xml
setContentView(R.layout.videoview_main);
// Find your VideoView in your video_main.xml layout
videoview = (VideoView) findViewById(R.id.VideoView);
// Execute StreamVideo AsyncTask
// Create a progressbar
pDialog = new ProgressDialog(VideoViewActivity.this);
// Set progressbar title
pDialog.setTitle("Android Video Streaming Tutorial");
// Set progressbar message
pDialog.setMessage("Buffering...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
// Show progressbar
pDialog.show();
try {
// Start the MediaController
MediaController mediacontroller = new MediaController(
VideoViewActivity.this);
mediacontroller.setAnchorView(videoview);
// Get the URL from String VideoURL
Uri video = Uri.parse(VideoURL);
videoview.setMediaController(mediacontroller);
videoview.setVideoURI(video);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
videoview.requestFocus();
videoview.setOnPreparedListener(new OnPreparedListener() {
// Close the progress bar and play the video
public void onPrepared(MediaPlayer mp) {
pDialog.dismiss();
videoview.start();
}
});
}
WebView 代码为:
WebView webview = (WebView) findViewById(R.id.webView1);
webview.setWebViewClient(new WebViewClient());
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webview.getSettings().setPluginState(WebSettings.PluginState.ON);
webview.getSettings().setMediaPlaybackRequiresUserGesture(false);
webview.setWebChromeClient(new WebChromeClient());
webview.loadUrl("file://192.168.0.1/Videos/video.mp4");
文件协议的 link 格式在 VideoView 或 WebView 中是否不同导致这不起作用,或者这是一个不同的问题?
我猜您正在使用 Windows 或 Linux 机器作为服务器。如果您希望 VideoView 正常工作,您必须实施 Android 支持的视频流格式。
只是为了说明 file://
URI 方案没有指定网络协议和 'SMB/CIFS',其中 Windows 本机和 Linux 与 SAMBA 服务器用于文件共享不是 Android.
的本地人
发件人:https://tools.ietf.org/id/draft-kerwin-file-scheme-07.html#rfc.section.3.4
最后一段很重要:
The 'file' URI scheme is unusual in that it does not specify an
Internet protocol or access method for shared files; as such, its
utility in network protocols between hosts is limited. Examples of
file server protocols that do define such access methods include
SMB/CIFS [MS-SMB2], NFS [RFC3530], and NCP [NOVELL].
对于可行的解决方案:我建议为您的服务器搜索 http/https 视频流。
视频应采用 android 支持的格式。您可以找到支持的视频格式 here。
此外 file://
不是 URL,它表示文件系统。您必须提供以 http
或 https
.
开头的 URL
当您将计算机用作服务器时,请确保您的 android 设备和计算机处于同一网络中。否则 android 设备将找不到您的视频。
在我的桌面计算机上的 Google Chrome 浏览器中,我可以使用以下 link:
流式传输驻留在我服务器上的 mp4 视频文件file://192.168.0.1/Videos/video.mp4
我想在 Android 应用程序中执行相同的操作,但是当我尝试将相同的 link 放入 VideoView 或 WebView 时,它会遇到错误。
在VideoView中会报错说不能播放这个文件,在WebView中会报文件权限错误。
VideoView 我使用的代码是:
// Declare variables
ProgressDialog pDialog;
VideoView videoview;
// Insert your Video URL
String VideoURL = "file://192.168.0.1/Videos/video.mp4";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get the layout from video_main.xml
setContentView(R.layout.videoview_main);
// Find your VideoView in your video_main.xml layout
videoview = (VideoView) findViewById(R.id.VideoView);
// Execute StreamVideo AsyncTask
// Create a progressbar
pDialog = new ProgressDialog(VideoViewActivity.this);
// Set progressbar title
pDialog.setTitle("Android Video Streaming Tutorial");
// Set progressbar message
pDialog.setMessage("Buffering...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
// Show progressbar
pDialog.show();
try {
// Start the MediaController
MediaController mediacontroller = new MediaController(
VideoViewActivity.this);
mediacontroller.setAnchorView(videoview);
// Get the URL from String VideoURL
Uri video = Uri.parse(VideoURL);
videoview.setMediaController(mediacontroller);
videoview.setVideoURI(video);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
videoview.requestFocus();
videoview.setOnPreparedListener(new OnPreparedListener() {
// Close the progress bar and play the video
public void onPrepared(MediaPlayer mp) {
pDialog.dismiss();
videoview.start();
}
});
}
WebView 代码为:
WebView webview = (WebView) findViewById(R.id.webView1);
webview.setWebViewClient(new WebViewClient());
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webview.getSettings().setPluginState(WebSettings.PluginState.ON);
webview.getSettings().setMediaPlaybackRequiresUserGesture(false);
webview.setWebChromeClient(new WebChromeClient());
webview.loadUrl("file://192.168.0.1/Videos/video.mp4");
文件协议的 link 格式在 VideoView 或 WebView 中是否不同导致这不起作用,或者这是一个不同的问题?
我猜您正在使用 Windows 或 Linux 机器作为服务器。如果您希望 VideoView 正常工作,您必须实施 Android 支持的视频流格式。
只是为了说明 file://
URI 方案没有指定网络协议和 'SMB/CIFS',其中 Windows 本机和 Linux 与 SAMBA 服务器用于文件共享不是 Android.
发件人:https://tools.ietf.org/id/draft-kerwin-file-scheme-07.html#rfc.section.3.4
最后一段很重要:
The 'file' URI scheme is unusual in that it does not specify an Internet protocol or access method for shared files; as such, its utility in network protocols between hosts is limited. Examples of file server protocols that do define such access methods include SMB/CIFS [MS-SMB2], NFS [RFC3530], and NCP [NOVELL].
对于可行的解决方案:我建议为您的服务器搜索 http/https 视频流。
视频应采用 android 支持的格式。您可以找到支持的视频格式 here。
此外 file://
不是 URL,它表示文件系统。您必须提供以 http
或 https
.
当您将计算机用作服务器时,请确保您的 android 设备和计算机处于同一网络中。否则 android 设备将找不到您的视频。