0

プロジェクトでやりたいことは、ボックス api を使用しているボックス アカウント内にあるオーディオ ソングを再生することです。私が知っているように、Box api でオーディオ ファイルの直接オーディオ ストリーミングを提供できないため、プログレッシブ ダウンロードを実装し、sd カードからオーディオ ファイルを再生しようとしています。ダウンロードの完全な方法で曲を再生できることはわかっていますが、これはダウンロードに時間がかかり、ファイルを再生するよりも時間がかかります。そのために、ファイルをダウンロードする進行中のメソッド内でオーディオを再生するためのコードを書きましたが、同じ曲が一度に複数回再生されるため、このメソッドが何度も呼び出されます。

Box api でプログレッシブ オーディオ再生用のコードを記述する方法はありますか? はいの場合、どこに記述すればよいですか?

* Download a file and put it into the SD card. In your app, you can put the file wherever you have access to.
                 */
                final Box box = Box.getInstance(Constants.API_KEY);
                String PATH = Environment.getExternalStorageDirectory() + "/chaseyourmusic"+folderpath;
                File file = new File(PATH);
                file.mkdirs();
                final java.io.File destinationFile = new java.io.File(PATH + "/"
                        + URLEncoder.encode(items[position].name));
             /*   final java.io.File destinationFile = new java.io.File(Environment.getExternalStorageDirectory() + "/"
                                                                      + URLEncoder.encode(items[position].name));*/

                final ProgressDialog downloadDialog = new ProgressDialog(Browse.this);
                downloadDialog.setMessage("Downloading " + items[position].name);
                downloadDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                downloadDialog.setMax((int) items[position].file.getSize());
                downloadDialog.setCancelable(true);
                downloadDialog.show();

                Toast.makeText(getApplicationContext(), "Click BACK to cancel the download.", Toast.LENGTH_SHORT).show();

                final Cancelable cancelable = box.download(authToken, items[position].id, destinationFile, null, new FileDownloadListener() {

                    @Override
                    public void onComplete(final String status) {
                        downloadDialog.dismiss();
                        if (status.equals(FileDownloadListener.STATUS_DOWNLOAD_OK)) {
                        //Able to play audio here from sd card but this is playing after completion of download only which is taking more time . 


                        }
                        else if (status.equals(FileDownloadListener.STATUS_DOWNLOAD_CANCELLED)) {
                            Toast.makeText(getApplicationContext(), "Download canceled.", Toast.LENGTH_LONG).show();
                        }
                    }

                    @Override
                    public void onIOException(final IOException e) {
                        e.printStackTrace();
                        downloadDialog.dismiss();
                        Toast.makeText(getApplicationContext(), "Download failed " + e.getMessage(), Toast.LENGTH_LONG).show();
                    }

                    @Override
                    public void onProgress(final long bytesDownloaded) {
                         downloadDialog.setProgress((int) bytesDownloaded);
                      //Want to write code here but this method is getting called multiple times which is creating problem in playing audio files from sd card . 


                    }
                });
                downloadDialog.setOnCancelListener(new OnCancelListener() {

                    @Override
                    public void onCancel(DialogInterface dialog) {
                        cancelable.cancel();
                    }
                });

ありがとう

4

1 に答える 1

1

次のようなものを使用してください:
http://code.google.com/p/npr-android-app/source/browse/Npr/src/org/npr/android/news/StreamProxy.java?r=41487c03f461942a5747378d197320412fe99442
http:// www.java2s.com/Code/Android/File/StreamProxy.htm

基本的に、プログレッシブ ストリーミングの場合、通常どおり (バックグラウンドで) ダウンロードを続行し、ストリーム プロキシ (バックグラウンドでサーバーのように) を実行し、データをメディア プレーヤーにプッシュします (外部メディア プレーヤーを使用するか、 Android メディア フレームワークを使用した数行のコードのみです)。

私は非常によく似たものを使用して成功しました。
実際、私はこの投稿からの回答を使用しています(わずかな変更を加えて)
、mp3再生の開始時にMediaPlayerが途切れます

于 2014-01-09T14:43:04.190 に答える