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

それは私に一度起こりました、問題は許可にありました。ファイルをダウンロードするときにしなければならないことは、ファイルに読み取り/書き込み権限を与える必要があります。したがって、ファイルをダウンロードした後、これらの行を追加して試してください:

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

私が理解しているように、これは権限の問題です。ファイルは誰でも読み取り可能である必要がありますが、適切な Linux コマンドを実行できるようにするために、ユーザーに自分の電話をルート化することを強制したくないと思います。

これにより、次の 2 つのオプションが残ります。

  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"); ファイル file = this.ctx.getDir(basedir, Context.MODE_WORLD_READABLE);

それが役に立てば幸い!乾杯。

于 2012-08-28T06:56:09.137 に答える
0

1 つだけ質問があります。ビデオへの URL を直接 VideoView に渡さないのはなぜですか? 通常、Web で見られるすべての例はこれを行います。

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 に答える