2014-02-04 4 views
0

Мне нужно скачать mp3-файл с URL-адреса, а затем воспроизвести его.Android: ошибка воспроизведения аудиофайла

Мой код, как показано ниже:

public class Mp3player extends Activity { 

private Button buttonPlayStop; 
private MediaPlayer mediaPlayer; 
private SeekBar seekBar; 

private final Handler handler = new Handler(); 
static final String AUDIO_PATH = 
      "http://sound18.mp3slash.net/indian/abcd/[Songs.PK]%20ABCD%20-%2002%20-%20Bezubaan.mp3"; 
// Here i override onCreate method. 
// 
// setContentView() method set the layout that you will see then 
// the application will starts 
// 
// initViews() method i create to init views components. 
@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 
    initViews(); 

} 

// This method set the setOnClickListener and method for it (buttonClick()) 
private void initViews() { 
    buttonPlayStop = (Button) findViewById(R.id.ButtonPlayStop); 
    buttonPlayStop.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      buttonClick(); 

     } 
    }); 

    try { 
     playAudio(AUDIO_PATH); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


    seekBar = (SeekBar) findViewById(R.id.SeekBar01); 
    seekBar.setMax(mediaPlayer.getDuration()); 
    seekBar.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      seekChange(v); 
      return false; 
     } 

    }); 

} 
private void playAudio(String url) throws Exception 
{ 
    killMediaPlayer(); 

    mediaPlayer = new MediaPlayer(); 
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    mediaPlayer.setDataSource(url); 
    mediaPlayer.prepare(); 
// mediaPlayer.start(); 
} 
    private void killMediaPlayer() { 
     if(mediaPlayer!=null) { 
      try { 
       mediaPlayer.release(); 
      } 
      catch(Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
public void startPlayProgressUpdater() { 
    seekBar.setProgress(mediaPlayer.getCurrentPosition()); 

    if (mediaPlayer.isPlaying()) { 
     Runnable notification = new Runnable() { 
      public void run() { 
       startPlayProgressUpdater(); 
      } 
     }; 
     handler.postDelayed(notification, 1000); 
    } else { 
     mediaPlayer.pause(); 
     buttonPlayStop.setText(getString(R.string.app_name)); 
     seekBar.setProgress(0); 
    } 
} 

// This is event handler thumb moving event 
private void seekChange(View v) { 
    if (mediaPlayer.isPlaying()) { 
     SeekBar sb = (SeekBar) v; 
     mediaPlayer.seekTo(sb.getProgress()); 
    } 
} 

// This is event handler for buttonClick event 
private void buttonClick() { 
    if (buttonPlayStop.getText() == getString(R.string.app_name)) { 
     buttonPlayStop.setText(getString(R.string.hello_world)); 
     try { 
      mediaPlayer.start(); 
      startPlayProgressUpdater(); 
     } catch (IllegalStateException e) { 
      mediaPlayer.pause(); 
     } 
    } else { 
     buttonPlayStop.setText(getString(R.string.app_name)); 
     mediaPlayer.pause(); 
    } 
} 
} 

Но я получаю ошибку, как показано ниже:

02-05 12:01:46.690: E/MediaPlayer(343): pause called in state 8 
02-05 12:01:46.690: E/MediaPlayer(343): error (-38, 0) 
02-05 12:01:46.761: E/MediaPlayer(343): Error (-38,0) 
02-05 12:01:50.421: E/MediaPlayer(343): start called in state 0 
02-05 12:01:50.421: E/MediaPlayer(343): error (-38, 0) 
02-05 12:01:50.421: E/MediaPlayer(343): pause called in state 0 
02-05 12:01:50.421: E/MediaPlayer(343): error (-38, 0) 
02-05 12:01:50.451: E/MediaPlayer(343): Error (-38,0) 
02-05 12:01:50.451: E/MediaPlayer(343): Error (-38,0) 
+0

Пожалуйста, ваши LogCat здесь как текст, а не ссылку на картинку. – Melquiades

+0

Думайте, что пользователь не знает, как скопировать данные журнала. Для них сначала выберите нужные строки журнала, а затем нажмите кнопку «Сохранить» (рядом с раскрывающимся списком) и сохраните их там, где хотите, и из этого экспортированного текстового файла скопируйте содержимое и отобразите его здесь. –

ответ

0

вы пытаетесь запустить игру, прежде чем подготовка завершена. Используйте метод setOnPreparedListener(), чтобы настроить прослушиватель подготовки и вызвать метод start() только после завершения подготовки.

mp.setDataSource(url); 
mp.setOnPreparedListener(this); 
mp.prepareAsync(); 

public void onPrepared(MediaPlayer player) { 
    player.start(); 
} 

для получения более подробной информации check this answer.

отредактирован: example of media player

0

Я думаю, что вы ошибаетесь здесь

if (mediaPlayer.isPlaying()) { 
    // you should pause only if its playing 
} 

вы делаете это в else части

Смежные вопросы