#java #android #android-studio
#java #Android #android-studio
Вопрос:
У меня проблема с ускорением работы моего MediaPlyer(). Он должен воспроизводить последовательность файлов, и из-за перерыва в воспроизведении я использовал функцию setNextMediaPlayer () и подготовил с помощью player1 свою следующую песню. Теперь я решил позволить пользователю выбирать скорость, с которой проигрыватель должен воспроизводить все звуки, но когда я использую player.setPlaybackParams
только для player
, я не получаю желаемого результата, и когда я использую его для player1
тоже, приложение вылетает.
Это мой код для воспроизведения функции:
@RequiresApi(api = Build.VERSION_CODES.M)
public void play(View v) throws InterruptedException {
for(i=0;i<brojac;i )
{
player = MediaPlayer.create(this,this.getResources().getIdentifier(lista.get(i).toString(),"raw",getPackageName()));
float speed = Float.parseFloat((String) textview.getText());
if(i==0) {
player.setPlaybackParams(player.getPlaybackParams().setSpeed(speed));
}
if(i!=brojac-1) {
player1 = MediaPlayer.create(this, this.getResources().getIdentifier(lista.get(i 1).toString(), "raw", getPackageName()));
player1.setPlaybackParams(player1.getPlaybackParams().setSpeed(speed));
player.setNextMediaPlayer(player1);
}
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
mp=null;
}
});
if(player1!=null) {
player1.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
mp = null;
}
});
}
player.start();
Thread.sleep((long) (player.getDuration()));
}
}
Любая помощь будет высоко оценена! Заранее спасибо!
Мой LogCat:
java.lang.IllegalStateException: Could not execute method for android:onClick
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:414)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.IllegalStateException
at android.media.MediaPlayer.setNextMediaPlayer(Native Method)
at com.lisstudio.songmaker.MainActivity.play(MainActivity.java:115)
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Ответ №1:
После некоторых исследований и попыток я нашел решение. Во-первых, важно быть осторожным с методом Thread.sleep, потому что вам нужно передать продолжительность песни, включая изменение скорости, поэтому player.getDuration()/speed . И, во-вторых, вам нужно установить скорость только для player, а не для player1.
Вот оно:
for(i=0;i<brojac;i )
{
player = MediaPlayer.create(this,this.getResources().getIdentifier(lista.get(i).toString(),"raw",getPackageName()));
float speed = Float.parseFloat((String) textview.getText());
player.setAudioAttributes();
player.setPlaybackParams(player.getPlaybackParams().setSpeed(speed));
if(i!=brojac-1) {
player1 = MediaPlayer.create(this, this.getResources().getIdentifier(lista.get(i 1).toString(), "raw", getPackageName()));
}
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
player.release();
player=null;
}
});
if(player1!=null) {
player1.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
if (player != null) {
player.setNextMediaPlayer(player1);
}
}
});
}
if(player1!=null) {
player1.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
player1.release();
player1 = null;
}
});
}
player.start();
Thread.sleep((long) (player.getDuration()/speed));
}