1

URL からいくつかのオーディオ ファイルとそれらにマッピングされた字幕を取得しています。今、ダウンロード ボタンをクリックしてその .mp3 ファイルと .srt ファイルをダウンロードしたいと考えています。 . また、sdcard の 2 つの異なるディレクトリに保存する必要があります。プログレスバー付きの単一ファイルのダウンロードを実装しました。どんな助けでも大歓迎です!

ありがとう。

更新:これらすべての回答は、まだこの種のものを探しています...

    String strGetFName;
    String strVipEpub;

    public DownloadFile()
    {
        strGetFName = getFilename();
        strVipEpub = getVipLessonEpubFilename();

    }

    @Override
    protected String doInBackground(String... sUrl) 
    {
        try 
        {
            URL url = new URL(sUrl[0]);
            URL urlePub = new URL(sUrl[1]);
            Log.e("urls"," "+sUrl[0]+","+sUrl[1]);
            URLConnection connection = url.openConnection();
            URLConnection connectionePub = urlePub.openConnection();
            Log.e("connection","done");
            connection.connect();
            connectionePub.connect();
            Log.e("connection","Connected");
            // this will be useful so that you can show a typical 0-100% progress bar
            int fileLength = connection.getContentLength();
            int fileLengthePub = connectionePub.getContentLength();
            Log.e("fileLength"," "+fileLength);
            int bytesFromMP3 = fileLength;
            int bytesFromSubtitle = fileLengthePub;
            int totalBytesToDownload = bytesFromMP3 + bytesFromSubtitle;
            Log.e("bytesFromMP3"," "+bytesFromMP3);
            Log.e("bytesFromSubtitle"," "+bytesFromSubtitle);
            Log.e("total"," "+totalBytesToDownload);

            int bytesDownloadedSoFar = 0;
            while(bytesDownloadedSoFar <= bytesFromSubtitle)
            {
                // download the file
                InputStream input = new BufferedInputStream(urlePub.openStream());

                OutputStream output = new FileOutputStream(strVipEpub);

                byte data[] = new byte[1024];
                long total = 0;
                int count;
                while ((count = input.read(data)) != -1) 
                {
                    total += count;
                    bytesDownloadedSoFar += count;
                    // publishing the progress....
                    publishProgress((int) (bytesDownloadedSoFar * 100 / totalBytesToDownload));
                    output.write(data, 0, count);
                }

                output.flush();
                output.close();
                input.close();
            }
            while(bytesDownloadedSoFar <= bytesFromMP3)
            {
                // download the file
                InputStream input = new BufferedInputStream(url.openStream());

                OutputStream output = new FileOutputStream(strGetFName);

                byte data[] = new byte[1024];
                long total = 0;
                int count;
                while ((count = input.read(data)) != -1) 
                {
                    total += count;
                    bytesDownloadedSoFar += count;
                    // publishing the progress....
                    publishProgress((int) (bytesDownloadedSoFar * 100 / totalBytesToDownload));
                    output.write(data, 0, count);
                }

                output.flush();
                output.close();
                input.close();
            }
        }
        catch (Exception e) 
        {
            Log.e("File"," Not Downloaded"+e.getMessage());
        }
        return null;
    }
    @Override
    protected void onPreExecute() 
    {
        super.onPreExecute();
    }

    @Override
    protected void onProgressUpdate(Integer... progress) 
    {
        super.onProgressUpdate(progress);
        pbDownloading.setProgress(progress[0]);
        tvProgress.setText(progress[0].toString()+"%");
    }

    @Override
    protected void onPostExecute(String result) 
    {
        super.onPostExecute(result);
        Log.e("is ","Downloading complete");
    }
4

1 に答える 1

4

複数のファイルをダウンロードする

単一のダウンロードが機能している場合は、コードを複製し、それを変更して.srtファイルをダウンロードするのと同じくらい簡単なはずです。AsyncTaskを設定すると、次々にダウンロードするように設定できます。

プログレスバーステータスの組み合わせ

このため、どちらかのファイルのダウンロードを開始する前に、各ファイルのサイズを取得する必要があると思います。プログレスバーを2つのサイズの合計に設定し、ダウンロードするときに、ダウンロードしたバイト数でプログレスバーを更新します。次のファイルをダウンロードするときに、現在のダウンロード値を継続する必要があります。

以下は、非常に大まかな擬似コードです。ファイルをどのようにダウンロードし、どのようにスレッド化するのかわかりません(うまくいけば、AsyncTaskのようなものです)。以下は、私が適用するロジックです。これまでのコードを表示していただければ、より具体的にすることができます。

int bytesFromMP3 = GetSizeOfFileAtURL(urlOfMP3File);
int bytesFromSubtitle = GetSizeOfFileAtURL(urlOfSubtitlesFile);
int totalBytesToDownload = bytesFromMP3 + bytesFromSubtitle;

progressBar.setMax(totalBytesToDownload);

int bytesDownloadedSoFar = 0;

//Start some loop to download the MP3 File
while(...) 
{
    //Download some data from the MP3 File
    ...

    //Update the number of bytes downloaded based on the size of the chunk you just downloaded
    bytesDownloadedSoFar += sizeOfChunkJustDownloaded

    //Update the progress bar
    progressBar.setProgress(bytesDownloadedSoFar);
}

//Repeat the loop, but this time download the subtitle info. Don't reset bytesDownloadedSoFar, just continue to add to it. 
while(...)
于 2012-05-11T17:08:02.500 に答える