簡體   English   中英

Android MediaPlayer getCurrentPosition() 返回錯誤值

[英]Android MediaPlayer getCurrentPosition() returning wrong values

我有一項服務,我在其中創建了一個MediaPlayer對象。 然后我綁定到該服務以獲取有關正在播放的媒體的信息,例如當前搜索位置。 出於測試目的,創建了一個調用MediaPlayergetCurrentPosition () 方法的按鈕。 但是,每次它都會返回一些隨機值。 (我只在調用 start() 並且正在播放媒體之后才調用getCurrentPosition )。 getDuration () 正在返回歌曲的正確持續時間。

public class SongPlayService extends Service {

    private static final String SERVICE_INTENT_KEY = "com.example.strehan.galleryapp.SERVICE_INTENT_KEY";

    private SongPlayThread mSongPlayThread;
    private String mSongData;
    private SongPlayServiceHandler mHandler;
    private MediaPlayer mMediaPlayer;

    public class SongPlayServiceBinder extends Binder {

        public  SongPlayService getSongPlayService() {
            return SongPlayService.this;
        }
    }

    public void onCreate() {
        super.onCreate();
        Log.d("SongPlayService", "onCreate()");
        mHandler = new SongPlayServiceHandler();
        mSongPlayThread = new SongPlayThread("SongPlay Thread", mHandler, getApplicationContext());
        mSongPlayThread.start();
        mSongPlayThread.initHandler(mSongPlayThread.getLooper());
        mMediaPlayer = mSongPlayThread.createMediaPlayer();
    }

    public IBinder onBind(Intent intent) {
        Log.d("SongPlayService", "onBind()");
        return  new SongPlayServiceBinder();
    }

    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("SongPlayService", "onStartCommand()");
        mSongData  = intent.getStringExtra(SERVICE_INTENT_KEY);
        Log.d("SongPlayService", "Song data rcvd at service: " + mSongData);
        if (mSongData != null) {
            mSongPlayThread.resetMediaPlayer();
            mSongPlayThread.prepareSong(mSongData);
            playSong();
        }
        return START_NOT_STICKY;
    }

    public int getSeekInfo() {
        return mMediaPlayer.getCurrentPosition();
    }
}


public class SongPlayThread extends HandlerThread implements MediaPlayer.OnCompletionListener,
        MediaPlayer.OnErrorListener, MediaPlayer.OnPreparedListener {


    private Handler mRequestHandler;
    private Handler mResponseHandler;
    private MediaPlayer mMediaPlayer;
    private Context mContext;

    public void initHandler(Looper looper) {

        mRequestHandler = new Handler(looper) {

            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case MSG_PREPARE_PLAYER:
                        Log.d("SongPlayThread", "Prepare song recvd: Song data:" + msg.obj);
                        Log.d("SongPlayThread", "Thread: " + Thread.currentThread().getName());
                        processPrepareMsg(msg.obj.toString());
                        break;

                    case  MSG_PLAY_SONG:
                        Log.d("SongPlayThread", "Play Song msg rcvd");
                        processPlayMsg();
                        break;
                }
            }
        };
    }

    private void processPlayMsg() {
        mMediaPlayer.start();
    }

    private void processPrepareMsg(String path) {
        try {

            Log.d("SongPlayThread", "Registering listeners: Thread: " + Thread.currentThread().getName());
            mMediaPlayer.setOnCompletionListener(this);
            mMediaPlayer.setOnErrorListener(this);

            Uri uri = Uri.fromFile(new File(path));
            mMediaPlayer.setDataSource(mContext, uri);
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mMediaPlayer.prepare();
        } catch (IOException ioException) {
                   ioException.printStackTrace();
        }
    }
}
 02-07 15:55:00.380 7379-7379/ D/SongPlayFragment﹕ Seek: 3275 02-07 15:55:00.825 7379-7379/ D/SongPlayFragment﹕ Seek Button pressed 02-07 15:55:00.825 7379-7379/ D/SongPlayFragment﹕ Service connected 02-07 15:55:00.826 7379-7379/ D/SongPlayFragment﹕ Seek: 3723 02-07 15:55:01.000 7379-7379/ D/SongPlayFragment﹕ Seek Button pressed 02-07 15:55:01.000 7379-7379/ D/SongPlayFragment﹕ Service connected 02-07 15:55:01.001 7379-7379/ D/SongPlayFragment﹕ Seek: 3898 02-07 15:55:01.194 7379-7379/ D/SongPlayFragment﹕ Seek Button pressed 02-07 15:55:01.194 7379-7379/ D/SongPlayFragment﹕ Service connected 02-07 15:55:01.196 7379-7379/ D/SongPlayFragment﹕ Seek: 4093 02-07 15:55:01.334 7379-7379/ D/SongPlayFragment﹕ Seek Button pressed 02-07 15:55:01.334 7379-7379/ D/SongPlayFragment﹕ Service connected 02-07 15:55:01.335 7379-7379/ D/SongPlayFragment﹕ Seek: 131 02-07 15:55:01.494 7379-7379/ D/SongPlayFragment﹕ Seek Button pressed 02-07 15:55:01.494 7379-7379/ D/SongPlayFragment﹕ Service connected 02-07 15:55:01.497 7379-7379/ D/SongPlayFragment﹕ Seek: 292 02-07 15:55:01.672 7379-7379/ D/SongPlayFragment﹕ Seek Button pressed 02-07 15:55:01.672 7379-7379/ D/SongPlayFragment﹕ Service connected 02-07 15:55:01.674 7379-7379/ D/SongPlayFragment﹕ Seek: 470

不幸的是, MediaPlayer有一個老問題,有時currentPosition返回錯誤值(1) , (2)

所以這是解決方法如何處理它:

fun runPlayerDurationUpdate(mediaPlayer: MediaPlayer) {
    playerCurrentDuration.value = 0

    durationJob?.cancel()
    durationJob = viewModelScope.launch {
        while (mediaPlayer.currentPosition != mediaPlayer.duration) {
            val progress = mediaPlayer.currentPosition * 100 / mediaPlayer.duration
            if (progress < playerCurrentDuration.value!!) {
                continue
            } else {
                delay(PLAYER_DELAY)
                playerCurrentDuration.value = progress
            }
        }
    }
}

在哪里

 private const val PLAYER_DELAY = 50L 
 private val playerCurrentDuration = MutableLiveData(0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM