Tôi đang cố cập nhật trình phát nhạc SeekBar đang hoạt động nhưng không có gì xảy ra. Các dịch vụ bắt đầu ok trong hoạt động của tôi và ràng buộc chính xác (vì tôi có thể sử dụng một số phương pháp trong dịch vụ của tôi và chơi nhạc tốt). Đây là mã dịch vụ của tôi:Cập nhật MusicPlayer SeekBar trong Dịch vụ
public class MusicPlayerService extends Service {
MediaPlayer myMusicPlayer;
String path;
Intent getMusicId = new Intent();
// Binder given to clients
private final IBinder mBinder = new LocalBinder();
/**
* Class used for the client Binder. Because we know this service always
* runs in the same process as its clients, we don't need to deal with IPC.
*/
public class LocalBinder extends Binder {
MusicPlayerService getService() {
// Return this instance of LocalService so clients can call public methods
return MusicPlayerService.this;
}
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
myMusicPlayer = new MediaPlayer();
Log.d(getClass().getSimpleName(),"onCreate()");
super.onCreate();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
Log.d(getClass().getSimpleName(), "onStartCommand()");
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
path = intent.getStringExtra("musicID");
Log.e("Music path on SD received from intent", path);
try {
myMusicPlayer.setDataSource(path);
myMusicPlayer.setLooping(true);
myMusicPlayer.prepare();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
myMusicPlayer.start();
Log.d(getClass().getSimpleName(), "onBind()");
return mBinder;
}
/** method for clients */
public int getMusicDuration() {
return myMusicPlayer.getDuration();
}
public int getMusicCurPos(){
return myMusicPlayer.getCurrentPosition();
}
public void pauseMusic(){
myMusicPlayer.pause();
Log.d(getClass().getSimpleName(), "pauseMusic()");
}
public void playMusic(){
myMusicPlayer.start();
Log.d(getClass().getSimpleName(), "start()");
}
public void stopMusic(){
myMusicPlayer.stop();
Log.d(getClass().getSimpleName(), "stop()");
}
public void seekToPos (int pos){
myMusicPlayer.seekTo(pos);
}
}
phần Thú vị là, sau khi liên kết các dịch vụ cho hoạt động của tôi và chạy nó một số phương pháp của dịch vụ trở về giá trị null như getDuration()
và một số trong số họ làm việc thấy như onStart()
và onDestroy()
.
Xin cảm ơn trước.
Cập nhật:
Trong hoạt động của bạn, bạn phải kiểm tra xem dịch vụ ràng buộc bởi vì nó mất một thời gian để làm, sau đó sử dụng phương pháp nào mà nó cung cấp như:
//Bound Music service and pass the music path
Intent musicIntent = new Intent(this, MusicPlayerService.class);
musicIntent.putExtra("musicID", path); //Put Extra data for music player to play the exact file
bindService(musicIntent, mConnection, Context.BIND_AUTO_CREATE); //Bound the Music player service
//Music Handler for methods
musicMethodsHandler = new Handler();
musicRun = new Runnable() {
@Override
public void run() {
if (mBound == true){ // Check if service bounded
if (musicTotTime == null){ // Put data in it one time
musicTotTime = myMusicPlayer.getMusicDuration();
Log.v("Music Duration of Player in thread", musicTotTime.toString());
seekBar.setMax(musicTotTime);
}
musicCurTime = myMusicPlayer.getMusicCurPos();
Log.v("Music Duration of Player in thread", musicCurTime.toString());
seekBar.setProgress(musicCurTime);
}else if(mBound == false){ // if service is not bounded log it
Log.v("Still waiting to bound", Boolean.toString(mBound));
}
musicMethodsHandler.postDelayed(this, 1000);
}
};
musicMethodsHandler.postDelayed(musicRun, 1000);
/** Defines callbacks for service binding, passed to bindService() */
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className,
IBinder service) {
// We've bound to LocalService, cast the IBinder and get LocalService instance
LocalBinder binder = (LocalBinder) service;
myMusicPlayer = binder.getService();
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
mBound = false;
}
};
và giữ lưu ý rằng phương thức dịch vụ onCreate()
chạy đầu tiên và một lần.
Cảm ơn bạn đã trả lời Ken Wolf, nhưng tại sao tôi không thể nhận được thời lượng trình phát nhạc bằng cách gọi phương thức dịch vụ? – Sozi
Bạn nói nó trả về null nhưng bạn có nghĩa là nó trả về 0? –
Trong hoạt động của tôi sau khi ràng buộc và bắt đầu dịch vụ khi cố gắng lấy dữ liệu từ dịch vụ như 'Integer duration = myMediaPlayer.getDuration();' (myMediaPlayer là một đối tượng của lớp dịch vụ của tôi) nó ném một "NullPointerException". – Sozi