2017-09-09 到達点メモ
知恵を絞れば案外何とかなるものだなぁ。
昨日言っていたASUS ZenPad 7.0のAndroid5.0.2で音声ファイルがロードできない時があるという問題は対処することができた。
割と力業ではあるが要するに
ロードを失敗したファイルをロードできるまで
ロードすればいいだけの話である。
具体的には以下のように実装した
soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
Log.d(TAG,"sampleId = "+sampleId);
Log.d(TAG,"status = "+status);
if(status != 0){
Log.d(TAG,"failed_reload");
int failed_number = 1;
failed_number = soundPool.play(woman_voice, 0 ,0, 1, 0,(float)2.0);
if(failed_number == 0){
soundPool.unload(woman_voice);
woman_voice = soundPool.load(l_context, R.raw.woman_voice_short_c, 1);
}
failed_number = soundPool.play(man_voice, 0 ,0, 1, 0,(float)2.0);
if(failed_number == 0){
soundPool.unload(man_voice);
man_voice = soundPool.load(l_context, R.raw.man_voice_short_c, 1);
}
failed_number = soundPool.play(clock_alarm, 0 ,0, 1, 0,(float)2.0);
if(failed_number == 0){
soundPool.unload(clock_alarm);
clock_alarm = soundPool.load(l_context, R.raw.clock_alarmdig_short, 1);
}
//sampleIDは、unloadしても数は減らないので
//sampleIDが30になったら、全部で10回は試行して失敗しているので
//そのときはもうアプリを終了させて再度立ち上げたほうが良い
if(sampleId > 30){
Toast.makeText(l_context,R.string.message_when_audio_file_loading_failed,Toast.LENGTH_SHORT);
MainActivity.getInstace().finishAndRemoveTask();
}
}
}
});
コードに大体書いてあるのだが
sampleIDは事実上ロードした回数を指しているので
これをもとにピンポイントにロードすることができない。
その為、失敗したファイルのみをピンポイントで音声を再生する為には
別の工夫が必要である。
具体的には公式ドキュメントに音声再生できない場合は値が0で返ってくるので
再生できなかったファイルをunloadしてもう一度再生しなおせばよい。
公式ドキュメントを見てもonLoadCompleteのstatusについては、0が成功ぐらいしか
書いていないので何もわからないのだが、誰か-22の意味を知っている人はいないだろうか?
サンプル数は10も満たないので正確ではないが
自分がテストした限りでは、もう一度ロードすれば大体読み込めて
ロード失敗は多くても二回だけだった。
今日はこれを作ってほぼ満足したので今日はこれまで。
0 コメント:
コメントを投稿