Dies ist der Code, der zum dynamischen Abrufen eines Dateinamens (.mp3) von einer anderen Klasse verwendet wird, da sich in meinem Assets-Ordner viele MP3-Dateien befinden:
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();
}
}
}
});
}
Log Cat:
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)
Zu beachtende Punkte: 1. Ich habe ähnliche Threads beim Stack-Überlauf überprüft. Die Antwort lautet "prepareAsync () 2". Ich habe prepareAsync () verwendet
Danke im Voraus.
Sie können auch die unten stehende onPrepared()
-Methode verwenden, um die start-Methode aufzurufen, sodass start()
aufgerufen wird, nachdem MediaPlayer
vorbereitet wurde.
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.start();
}
});
Anstatt diese preparedSync/prepare
-Methode von MediaPlayer
zu verwenden, können Sie den Dateipfad einfach in URI umwandeln an MediaPlayer.create()
übergeben.
MediaPlayer mediaPlayer = MediaPlayer.create(context, URI.parse("file://"+filePath));
dies wird es vorbereiten und anfangen zu spielen
Oder eine andere Möglichkeit ist die Verwendung von onPrepareListener()
von MediaPlayer
und dann ab dem vorbereiteten Spielbeginn
zustand 4 bedeutet, dass der Mediaplayer sich im Vorbereitungszustand befindet
und wir nennen andere Aktionen wie
Mediaplayer.start()
Mediaplayer.stop()
Mediaplayer.pause()
oder irgendetwas anderes.
Gemäß Ihrem Code ist dies Mediaplayer.start();
sie müssen eine onprepare-Methode schreiben
MediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.start();
}
});
Sobald die Onprepared () - Methode aufgerufen wurde, können Sie weitere Prozesse ausführen
einfach entfernen
mp.start()
nach dem
mp.prepareAsync();
Und du wirst gut gehen