У меня есть приложение для потоковой передачи аудио, и когда я попытался реализовать поток, я получил эту ошибку «Переменная цикла не обновлена внутри цикла» Как я могу обновить цикл.
это сообщение отладки
E / MediaPlayerNative: попытка выполнить seekTo в неправильном состоянии: mPlayer = 0xa1577660, mCurrentState = 0 ошибка (-38, 0) Попытка вызвать getDuration в неправильном состоянии: mPlayer = 0xa1577660, mCurrentState = 0 ошибка (-38, 0)
и вот мой код
package com.excellentaccountant.mohammed.myapplication;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
Button playBt1;
SeekBar positionBar;
TextView elopsedtimeLable;
TextView remainingTimeLable;
MediaPlayer mp;
int totalTime;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
playBt1 = (Button)findViewById(R.id.playButton);
final String url = "URL"
final MediaPlayer mp = new MediaPlayer();
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
playBt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!mp.isPlaying()){
mp.start();
playBt1.setBackgroundResource(R.drawable.pause);
}
else {
mp.pause();
playBt1.setBackgroundResource(R.drawable.play);
}
}
});
mp.setDataSource(url);
} catch (IOException e) {
e.printStackTrace();
}
mp.prepareAsync(); // might take long! (for buffering, etc)
mp.start();
positionBar = (SeekBar)findViewById(R.id.positionBar);
positionBar.setMax(totalTime);
positionBar.setOnSeekBarChangeListener(
new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser){
mp.seekTo(progress);
positionBar.setProgress(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
}
);
new Thread(new Runnable() {
@Override
public void run() {
while (mp != null){
try {
Message msg = new Message();
msg.what = mp.getCurrentPosition();
handler.sendMessage(msg);
Thread.sleep(1000);
}catch (InterruptedException e){}
}
}
}).start();
}
private Handler handler = new Handler (){
@Override
public void handleMessage(Message msg) {
int currentPosition = msg.what;
positionBar.setProgress(currentPosition);
String elopsedTime = createTimeLable (currentPosition);
elopsedtimeLable.setText(elopsedTime);
String remainingtime = createTimeLable(totalTime-currentPosition);
remainingTimeLable.setText("- " + remainingtime);
}
};
public String createTimeLable (int time){
String timelable = "";
int min = time /1000/60;
int sec = time /1000 % 60;
timelable = min + ":";
if (sec < 10)timelable += "0";
timelable += sec;
return timelable;
}
}
@forpas на самом деле я реализовал эти коды из онлайн-руководства, и он работал со мной, когда я воспроизводил аудиофайлы из необработанной папки. Теперь я хочу транслировать с внешнего URL-адреса. Не могли бы вы помочь мне и сказать, что делать, потому что я не профессиональный программист. Спасибо
попробуйте добавить setOnPreparedListener () в свой медиаплеер и запустить медиаплеер из его метода onPrepared. ошибка (-38) обычно означает, что вы используете такие методы, как play () start () и т. д., на неподготовленном медиаплеере.
@Sahdeep Singh Я думаю, проблема в Thread. потому что все работало до того, как я добавил поток и обработчик. как только я реализовал поток и обработчик для синхронизации панели поиска с медиаплеером, приложение вылетело и показало эту ошибку
Возможно, проблема связана с потоком, я также реализовал это в своем приложении, вы можете получить от него ссылку github.com/iamSahdeep/Bop/blob/master/app/src/main/java/com/…
Почему вы устанавливаете
positionBar.setProgress(progress);внутриonProgressChanged(), если он уже имеет значениеprogress?