これは、他のクラスからファイル名(.mp3)を動的にフェッチするために使用しているコードです。私のアセットフォルダに多数のmp3ファイルがあるためです。
playAudioButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v)
{
FileName audio=new FileName();
String audioName=audio.getAudioName(count).toString();
if(audioName=="NO Audio")
{
Toast.makeText(getApplicationContext(), "No Audio for this page", Toast.LENGTH_SHORT).show();
}
else
{
try {
afd=getAssets().openFd(audioName + ".mp3");
mp = new MediaPlayer();
mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
mp.prepareAsync();
mp.start();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
}
ログ猫:
03-20 11:21:28.726: E/SpannableStringBuilder(4418): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
03-20 11:21:28.726: E/SpannableStringBuilder(4418): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
03-20 11:22:24.968: D/libEGL(4579): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
03-20 11:22:24.976: D/libEGL(4579): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
03-20 11:22:24.984: D/libEGL(4579): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
03-20 11:22:25.070: D/OpenGLRenderer(4579): Enabling debug mode 0
03-20 11:22:38.773: E/MediaPlayer(4579): start called in state 4
03-20 11:22:38.773: E/MediaPlayer(4579): error (-38, 0)
03-20 11:22:38.773: E/MediaPlayer(4579): Error (-38,0)
注意点:1.スタックオーバーフローで同様のスレッドを確認しましたが、答えはprepareAsync()を使用しています2. prepareAsync()を使用しました
前もって感謝します。
以下のonPrepared()
メソッドを使用してstartメソッドを呼び出し、MediaPlayer
が準備された後にstart()
が呼び出されるようにすることもできます。
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.start();
}
});
MediaPlayer
のこの_preparedSync/prepare
_メソッドを使用する代わりに、ファイルパスをURIに変換してMediaPlayer.create()
に渡すだけです。
_MediaPlayer mediaPlayer = MediaPlayer.create(context, URI.parse("file://"+filePath));
_
これはそれを準備し、それ自体を再生し始めます
または別の方法は、MediaPlayer
のonPrepareListener()
を使用し、これから準備された再生を開始することです
状態4は、Mediaplayerが準備状態であることを意味します
そして私たちは他のアクションを
_Mediaplayer.start()
Mediaplayer.stop()
Mediaplayer.pause()
_
または他のもの。
あなたのコードによると、それはMediaplayer.start();
です
あなたはonprepareメソッドを書く必要があります
_MediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.start();
}
});
_
Onprepared()メソッドが呼び出されると、さらに処理を行うことができます
削除するだけ
_mp.start()
_
後
_mp.prepareAsync();
_
そして、あなたは行ってもいいでしょう
public class BackgroundSound extends AsyncTask<String, Void, Void> {
MediaPlayer mediaPlayerChatAudio;
@Override
protected Void doInBackground(String... params) {
String model = params[0];
final Uri uri = Uri.parse(model);
LogEm.e("EM", "::::::::::URI::::::::::" + model);
if (uri == null || uri == Uri.EMPTY) return null;
if (mediaPlayerChatAudio != null) mediaPlayerChatAudio.stop();
try {
mediaPlayerChatAudio = MediaPlayer.create(TextActivity.this, uri);
mediaPlayerChatAudio.setAudioStreamType(AudioManager.STREAM_MUSIC);
} catch (Exception e) {
// do nothing.
}
if (mediaPlayerChatAudio == null) return null;
mediaPlayerChatAudio.setVolume(1.0f, 1.0f);
mediaPlayerChatAudio.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mediaPlayerChatAudio.reset();
mediaPlayerChatAudio.release();
mediaPlayerChatAudio = null;
}
});
mediaPlayerChatAudio.start();
return null;
}
}