[英]Android MediaPlayer.getCurrentPosition() returns incorrect values
[英]Android MediaPlayer getCurrentPosition() returning wrong values
我有一項服務,我在其中創建了一個MediaPlayer
對象。 然后我綁定到該服務以獲取有關正在播放的媒體的信息,例如當前搜索位置。 出於測試目的,創建了一個調用MediaPlayer
的getCurrentPosition
() 方法的按鈕。 但是,每次它都會返回一些隨機值。 (我只在調用 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.