Подтвердить что ты не робот

Android: Как остановить воспроизведение мультимедиа (mp3) при появлении конкретных миллисекунд?

У меня есть mp3 файл, и я хочу воспроизвести в нем определенное слово. У меня есть время начала (6889 ms) и время окончания (7254 ms).

У меня есть эти коды:

package com.example.playword;

import java.io.IOException;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.widget.TextView;

public class PlayWord extends Activity {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final TextView tv = new TextView(this);

    tv.setText("Playing...");
    setContentView(tv);

    final MediaPlayer mPlayer = MediaPlayer.create(this, R.raw.nicholas);

    try {
      mPlayer.prepare();
    } catch (IllegalStateException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    mPlayer.seekTo(6889); //this is the start time
    mPlayer.start();
    //how can I end it at 7254 ms?
  }
}
4b9b3361

Ответ 1

Лучший подход - использовать обработчик для остановки остановки воспроизведения. Запустите плеер, а затем используйте обработчик postDelayed, чтобы запланировать выполнение Runnable, которое остановит игрока. Вы также должны запустить плеер только после завершения первоначального поиска. Что-то вроде этого:

public class PlayWord extends Activity implements MediaPlayer.OnSeekCompleteListener {
    Handler mHandler;
    MediaPlayer mPlayer;
    int mStartTime = 6889;
    int mEndTime = 7254;
    final Runnable mStopAction = new Runnable() {
        @Override
        public void run() {
            mPlayer.stop();
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);    
        final TextView tv = new TextView(this);
        tv.setText("Playing...");
        setContentView(tv);
        mHandler = new Handler();
        mPlayer = MediaPlayer.create(this, R.raw.nicholas);
        mPlayer.setOnSeekCompleteListener(this);
        mPlayer.seekTo(mStartTime);
    }

    @Override
    public void onDestroy() {
        mPlayer.release();
    }

    @Override
    public void onSeekComplete (MediaPlayer mp) {
        mPlayer.start();
        mHandler.postDelayed(mStopAction, mEndTime - mStartTime);
    }
}

Обратите внимание также, что метод MediaPlayer.create, который вы используете, возвращает уже подготовленный MediaPlayer, и prepare не следует вызывать снова, как вы делаете в своем коде на экране. Я также добавил вызов release(), когда действие завершено.

Кроме того, если вы хотите обновить интерфейс после завершения поиска, имейте в виду, что этот метод обычно вызывается из потока, отличного от UI. Вам придется использовать обработчик для публикации любых действий, связанных с пользовательским интерфейсом.

Ответ 2

In Oncreate Method ,use the below 4 lines code:


     MediaPlayer mPlayer = MediaPlayer.create(this, R.raw.nicholas);
     mPlayer.start();
     mPlayer.seekTo(startTime);   
     updatePlayerPostion(); 


private Handler handler=new Handler(){

            @Override
            public void handleMessage(Message msg) {
                        // TODO Auto-generated method stub
                        super.handleMessage(msg);
                        updatePlayerPostion();
                }
            };
            updatePlayerPostion()
            {
               handler.removeCallbacks(r);
               if(player.getCurrentPosition==7254)

              player.stop();


            else
               handler.postDelayed(r, 1); //1 millisecond

            }
        Runnable r=new Runnable(){
        @Override
                public void run() {
                    // TODO Auto-generated method stub
                     updatePlayerPostion()
                }
        };