简体   繁体   English

Android MediaPlayer getCurrentPosition() 返回错误值

[英]Android MediaPlayer getCurrentPosition() returning wrong values

I have a service where I have created a MediaPlayer Object.我有一项服务,我在其中创建了一个MediaPlayer对象。 I then bind to the service to get info about the media being played like current seek position.然后我绑定到该服务以获取有关正在播放的媒体的信息,例如当前搜索位置。 For testing purpose, created a button which invokes getCurrentPosition () method of the MediaPlayer .出于测试目的,创建了一个调用MediaPlayergetCurrentPosition () 方法的按钮。 However each time it returns some random value.但是,每次它都会返回一些随机值。 (I am calling getCurrentPosition only after the start() is called and the media is playing). (我只在调用 start() 并且正在播放媒体之后才调用getCurrentPosition )。 getDuration () is returning correct duration of the song. 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

Unfortunately, the MediaPlayer has an old issue when sometimes currentPosition returns wrong values (1) , (2)不幸的是, MediaPlayer有一个老问题,有时currentPosition返回错误值(1) , (2)

So here is workaround how to possibly handle it:所以这是解决方法如何处理它:

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
            }
        }
    }
}

where在哪里

 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