VideoView或WebView的文件协议支持?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VideoView或WebView的文件协议支持?相关的知识,希望对你有一定的参考价值。

在桌面计算机上的Google Chrome浏览器中,我可以使用以下链接流式传输驻留在我的服务器上的mp4视频文件:

file://192.168.0.1/Videos/video.mp4

我想在android应用程序中执行相同的操作但是当我尝试将此相同的链接放入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");

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

最后一段是重要的:

'文件'URI方案很不寻常,因为它没有为共享文件指定Internet协议或访问方法;因此,它在主机之间的网络协议中的效用是有限的。定义此类访问方法的文件服务器协议示例包括SMB / CIFS [MS-SMB2],NFS [RFC3530]和NCP [NOVELL]。

对于可行的解决方案:我建议为您的服务器搜索http / https视频流。

另一答案

该视频应采用Android支持的格式。您可以找到支持的视频格式here

file://也不是URL,它表示文件系统。您必须提供一个以httphttps开头的网址。

当您将计算机用作服务器时,请确保您的Android设备和计算机位于同一网络中。否则Android设备将无法找到您的视频。

以上是关于VideoView或WebView的文件协议支持?的主要内容,如果未能解决你的问题,请参考以下文章

android - 使用 webview 或 videoview 在应用程序中闪烁实时流

android平板videoview播放视频,webview播放flash能旋转180吗?

当上下文设置为 WebView 时,VideoView 不会播放

WebView 之上的 VideoView

我可以将 VideoView 作为 WebView 背景吗?

WebView 中的 VideoView 不会播放视频?