まあまあプレイリストではありませんが、アイデアは似ています。私はオーディオブックを作っています。また、オーディオデータは膨大で(書籍1本あたり90 MBになる可能性があります)、これらのデバイスに備わっているメモリの制限を認識しているため、メモリにすべてロードする必要はありません。アンドロイドアプリの再生リストを作成する必要があります
その代わりに私は文のバッチを取得することを考えました(はい、音声データは文で分割され、BLOBとしてローカルsqliteデータベースに格納されています)、10または20としてバイト配列に入れて、それらの10または20バイトの配列のそれぞれを一時ファイルに保存し(1つの単一バイト配列Android - Playing mp3 from byte[]についてここで説明するように、それぞれ一度に1つずつ)、そのファイルをMediaPlayerに与えます。
問題は、次の音符が始まるまで1つの文章が終了するのを待つ必要があるため、音を重ならないようにすることです。そのために、OnCompletionListenerを実装するMeadiaReaderを含むクラスを作成しました。したがって、文が終わるたびに、onCompletionメソッドが呼び出されます。このメソッドは、別の行を開始し、最後にonCopletionを呼び出します。
最終的には動作しますが、再帰的なものになり、アーキテクチャが完成した方法が嫌いです。どのように私はアプリでこの種の機能をよりよく実装することができますか?
--------------------------------------- EDIT ------ --------------------------------
これは説明のためのコードです。私はちょうどこのスタックトレースを返したこのNullPointerExceptionを得ました:
06-22 12:16:09.152: ERROR/AndroidRuntime(1163): java.lang.NullPointerException
06-22 12:16:09.152: ERROR/AndroidRuntime(1163): at com.spiral.android.IslamicAudioBook.SentencesReader.onCompletion(SentencesReader.java:163)
06-22 12:16:09.152: ERROR/AndroidRuntime(1163): at com.spiral.android.IslamicAudioBook.SentencesReader.playMp3(SentencesReader.java:123)
06-22 12:16:09.152: ERROR/AndroidRuntime(1163): at com.spiral.android.IslamicAudioBook.SentencesReader.onCompletion(SentencesReader.java:163)
06-22 12:16:09.152: ERROR/AndroidRuntime(1163): at com.spiral.android.IslamicAudioBook.SentencesReader.playMp3(SentencesReader.java:123)
....(別の10行ほどそうしています)。 例外自体は分かりやすく、関数呼び出しが再帰的に進行しているという事実を指摘しました。 playMp3方法は、私は上記渡されたリンクから1と非常に類似しており、onCompletionは多少このようなものです:あなたは簡単に私がdumblyバイトであるbatchOfSoundsを([チェックという理由だけ例外が発生見ることができるように
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
if(batchSize*batchIndex + sentenceIndex > totalNumberOfSentences){
return;
}
if(batchOfSounds == null){
return;
}
if(sentenceIndex == this.batchSize - 1){
Log.d(TAG,"All sentences from batch read, getting next batch");
this.batchOfSounds = this.getBatchOfSoundsFromDatabase(batchIndex);
}else{
Log.d(TAG,"Playing sentence index: "+sentenceIndex);
}
this.playMp3(batchOfSounds[sentenceIndex],0);
}
] []])を使用して、getBatchOfSoundsFromDatabaseメソッドが新しい参照を返す前にnullになっているので気にしないでください。
しかし、この2つのメソッドは、お互いを呼び出すと事は明確に再帰的に行くのですか?そして、それはまったくうまくいかないと思います..そうですか?両方のメソッドで新しい参照を作成していないのであれば容認できますか?この疑問をもう少し引き伸ばすと、再帰的な方法を持つことはいつ受け入れられますか?それについて考えるようになりました。新しいインスタンス変数が作成されなければ、それは受け入れられるかもしれないと私は信じています。私は正しい?
私はいつもオーディオブックは1つのファイルにあると思っていましたが、そうではありませんか?そうであれば、ファイル全体のパスをmediaplayerに渡すことはできませんか? – bluefalcon