0

サーバーからファイルをダウンロードしています。大きなものも小さなものもあります。

protected Long doInBackground(Object... params) {
        Context context = (Context) params[0];
        String name = (String) params[1];
        String urlString = (String) params[2];
        File mediadir = context.getDir("tvr", Context.MODE_PRIVATE);
        try {
            URL url = new URL(urlString);
            URLConnection connection = url.openConnection();
            connection.connect();
            int lenghtOfFile = connection.getContentLength();
            InputStream is = url.openStream();
            Log.d("DOWNLOAD NAME",name);
            File new_file = new File(mediadir, name);
            FileOutputStream fos = new FileOutputStream(new_file.getPath());
            byte data[] = new byte[1024];
            int count = 0;
            long total = 0;
            int progress = 0;
            while ((count=is.read(data)) != -1){
                total += count;
                int progress_temp = (int)total*100/lenghtOfFile;
                if(progress_temp%10 == 0 && progress != progress_temp){
                    progress = progress_temp;
                }
                fos.write(data, 0, count);
            }
            is.close();
            fos.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            Log.e("DOWNLOAD ERROR", e.toString());
        }
        return null;
    }

私が理解しているように、ストリームを介してファイルをダウンロードし、データをファイルにストリーミングしています。したがって、実際には、ファイルはデータの最初のバイトから作成されます。

さて、物事の反対側では、ディレクトリ内のファイルを探して再生することで、内部ディレクトリからファイルを再生しています。

mediaPlayer = new MediaPlayer();
mediaPlayer.setOnCompletionListener(this);
mediaPlayer.setDisplay(holder);
FileInputStream fileInputStream = new FileInputStream(path);
mediaPlayer.setDataSource(fileInputStream.getFD());
fileInputStream.close();
mediaPlayer.prepare();
mediaPlayer.start();

この問題は、完全にダウンロードされていなくてもファイルが再生されることです。

これは本当ですか?その場合、ファイルを再生する前に、ファイルが完全かどうかを確認するにはどうすればよいですか?

4

1 に答える 1

3

はい、これは有効なシナリオです。多くの場合、ダウンロード速度はの読み取りおよび再生速度よりも遅くなりますMediaPlayer

AsyncTaskを使用しているので、メソッドの再生コードを呼び出すことでこの問題を修正できます。これは、メソッドのすべての作業が完了onPostExecute()した後にのみ実行されるためです。doInBackground()

于 2013-02-26T13:19:05.200 に答える