5

我正在尝试下载视频文件,然后在应用程序中播放,如果我将视频文件放在 res 文件夹中,我可以毫无问题地播放它,但是当我尝试下载视频然后播放它时,我获取 VideoView 错误:1,-2147483648。

这是我用来下载视频的代码:

    try
    {

        URL url = new URL(videoURL);
        URLConnection conexion = url.openConnection();
        conexion.connect();

        int lengthOfFile = conexion.getContentLength();
        Log.d("ANDRO_ASYNC", "Length of file: " + lengthOfFile);

        InputStream input = new BufferedInputStream(url.openStream());




        final File dir = new File(this.getFilesDir() + "/videos");
        dir.mkdirs(); //create folders where write files
        final File file = new File(dir, "my_video.mp4");

        Log.d("writePath", file.getPath());

        FileOutputStream output = new FileOutputStream(file);

        byte data[] = new byte[1024];
        long total = 0;

        while((count = input.read(data)) != -1)
        {
            total += count;
            //publishProgress("" + (int)((total*100) / lengthOfFile));
            output.write(data, 0, count);
        }

        output.flush();
        output.close();
        input.close();

        Log.d("download", "finished");

    }
    catch(Exception e)
    {

        Log.d("Exception", e.getMessage());
    }

这似乎成功完成,但是当我尝试使用以下代码播放文件时,出现错误。

 // Play Video
    videoView = (VideoView)findViewById(R.id.surface_view);
    //

    File f = new File("/data/data/com.companyname.appname/files/videos/videoFilename.mp4");



    if(f.exists())
    {
        long len = f.length();
        String length = String.valueOf(len);
        Log.d("file", "exists");
        Log.d("length", (String)length);
    }
    else
    {
        Log.d("file", "does not exist");
    }

    //






    videoView.setMediaController(new MediaController(this));


    videoView.setVideoPath(f.getPath());
    videoView.start();

如代码所示,在播放之前我检查文件是否存在以及它的大小(它与下载的文件大小相同)但它不会播放,我猜文件已损坏但我不知道为什么。

我在清单中设置了以下权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_INTERAL_STORAGE" />
4

4 回答 4

1

在我的情况下,错误是由于媒体播放器对本地存储的视频没有文件权限。尝试将视频存储到外部存储中。

于 2012-09-10T06:19:46.343 回答
0

只是一个问题,为什么不将视频的 URL 直接传递给 VideoView 呢?通常你在网上看到的所有例子都是这样做的:

VideoView video = new VideoView(mContext);
video.setMediaController(new MediaController(mContext));
video.setVideoURI(Uri.parse(this.url));

其中“mContext”在您的应用程序上下文中,“this.url”是您需要在 VideoView 中加载的 URL。

于 2012-08-27T14:49:15.793 回答
0

它发生在我身上一次,问题出在权限上。下载文件时你必须做的,你必须给它读/写权限。所以下载文件后,添加这些行并尝试:

                            file.setExecutable(true, false);
                            file.setReadable(true, false);
                            file.setWritable(true, false);
于 2012-08-21T07:46:43.560 回答
0

据我了解,这是一个权限问题。该文件需要是世界可读的,但我假设您不想强迫用户根他/她的手机以能够运行正确的 linux 命令。

这让您有两个选择:

  1. 由于应用程序拥有文件,您可以使用 FileDescriptor 打开文件

    FileInputStream fileInputStream = new FileInputStream("/data/data/com.mypackage/myfile"); mediaPlayer.setDataSource(fileInputStream.getFD());

    但由于您没有使用 MediaPlayer,我想这不是一个选择。

  2. 获取文件时设置权限。

    String basedir = ("/data/data/com.companyname.appname/files/videos/videoFilename.mp4"); 文件文件 = this.ctx.getDir(basedir, Context.MODE_WORLD_READABLE);

希望能帮助到你!干杯。

于 2012-08-28T06:56:09.137 回答