Как получить seekbar в действии от сервиса медиаплеера? - PullRequest
2 голосов
/ 29 августа 2011

Я создаю сервис медиаплеера для воспроизведения медиа-файла из Интернета, например:

public class MyService extends Service{
private static final String TAG = "MyService";
MediaPlayer mediaPlayer;    
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onCreate");

    mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
}

@Override
public void onDestroy() {
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onDestroy");
    mediaPlayer.stop();
}

@Override
public void onStart(Intent intent, int startid) {
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onStart");
    String rtsp;
    Bundle re= intent.getExtras();
    rtsp=re.getString("rtsp");
    try {
        mediaPlayer.setDataSource(rtsp);
        mediaPlayer.prepare();
    } catch (IllegalArgumentException 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();
    }       
    mediaPlayer.start();

}
}

Теперь я хочу получить панель поиска из действия, подобного этому:

SeekBar seekbar= (SeekBar)findviewbyid(R.id.seekbar);

Но я не могу :( Пожалуйста, помогите мне, как это сделать!

РЕДАКТИРОВАТЬ

Я нашел другой способ решить мою проблему без использования сервиса Bind :)Вот оно:

В своем классе обслуживания создайте статический метод, подобный следующему:

public static void setMainActivity(Player_Activity mainActivity)
{
    MAIN_ACTIVITY=mainActivity;
}

Конечно, вы должны объявить статическую переменную:

private static Player_Activity  MAIN_ACTIVITY;

Далеев своей деятельности, прежде чем вызывать startService (), вы должны вызвать этот метод, чтобы настроить основной вид деятельности для своего сервиса следующим образом:

MyService.setMainActivity(Player_Activity.this);
Intent myservice= new Intent(this,MyService.class);
startService(myservice);

И, наконец, вы можете делать все, что угодно с вашим действием в вашем сервисе.вот так:

final TextView tv_test=(TextView)MAIN_ACTIVITY.findViewById(R.id.textview);

Вот и все!Надеюсь, что это поможет:)

Простите, если я ошибаюсь в английском;), мой английский не очень хорош:)

Ответы [ 2 ]

1 голос
/ 22 марта 2017

Я знаю, что на него уже ответили. Но я попробовал приведенный ниже код, который работал для меня. Может быть полезным для кого-то.

public class MediaPlayerService extends Service implements MediaPlayer.OnPreparedListener,MediaPlayer.OnCompletionListener{
String ExactPath;
int total,CurrentPosition;
MediaPlayer mp;
private final IBinder mBinder=new LocalBinder();
public class LocalBinder extends Binder {
    MediaPlayerService getService(){
        return MediaPlayerService.this;
    }
}

@Override
public IBinder onBind(Intent intent) {

    return mBinder;
}



@Override
public void onCreate() {
    mp=new MediaPlayer();
    mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mp.setOnPreparedListener(this);

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    ExactPath=intent.getStringExtra("pos");
    PrepareMediaPlayer();
    if(!mp.isPlaying()){
        mp.start();
    }else{
        mp.pause();
    }
    return START_STICKY;
}
public void PrepareMediaPlayer(){

    try {
        mp.setDataSource(ExactPath);
        mp.prepareAsync();

    } catch (IOException e) {
        e.printStackTrace();
    }catch (IllegalStateException e){ }
    catch(IllegalFormatException e){ }

}

@Override
public void onPrepared(MediaPlayer mediaPlayer) {
    mp.start();


}

@Override
public void onCompletion(MediaPlayer mediaPlayer) {
    stopSelf();
}



public int seekBarGetCurrentPosition(){    //This method is created to get SongCurrentPosition from mediaplayer for seekbar
    if(mp!=null&&mp.isPlaying()){
        CurrentPosition=mp.getCurrentPosition();
    }
    return CurrentPosition;
}


@Override
public void onDestroy() {
    if(mp.isPlaying()){
        mp.stop();
    }
    mp.release();
}

}

Примечание. В классе обслуживания у меня возникла проблема с получением продолжительности MediaPlayer. Я не получаю правильный результат, когда моя активность запрашивает продолжительность от службы. Итак, я реализовал метод, который получает продолжительность прямо из активности. Надеюсь, вы можете установить продолжительность в самой службе. Но этот код работал для меня.

Затем в вашей активности после метода onCreate ().

 /**The below method songDuration() is created as substitution for getMediaPlayerDuration() method
 * if getMediaPlayerDuration() failed to get the duration from mediaPlayer via service this method
 * helps to avoid returning zero or null value . Because it has been observed that service takes
 * quite a long time to return a value, if it is called frequently with in a span of seconds say, pressing
 * Next button continuously.
 */
public int songDuration(){
    MediaMetadataRetriever mmr=new MediaMetadataRetriever();
    mmr.setDataSource(path);
    String Dur=mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
    Integer Duration=Integer.parseInt(Dur);
    return Duration;


}




 @Override
protected void onStart() {
    super.onStart();
    Intent intent=new Intent(Player.this,MediaPlayerService.class);
    bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE);
    getSeekBarStatus();//This method is called onBinding process so that it gets updated with player.

}

@Override
protected void onStop() {
    super.onStop();
    if(ServiceBinding){
        unbindService(mServiceConnection);
        ServiceBinding=false;
    }
}

//This method gets the MediaPlayer Duration from service.
public int getMediaPlayerDuration(){
    if(ServiceBinding){
        if(mediaPlayerServiceObject.mp!=null){
            Duration=mediaPlayerServiceObject.seekBarDuration();
        }
    }
    return Duration;
}
    //This method get MediaPlayerCurrent Position from service
public int getMediaPlayerCurrentPosition(){
    if(ServiceBinding){
        if(mediaPlayerServiceObject.mp!=null){
            currentPosition=mediaPlayerServiceObject.seekBarGetCurrentPosition();
        }
    }
    return currentPosition;
}
    //This method is used to update seekBar status by getting Player Current Position from service.
public void getSeekBarStatus(){
    new Thread(new Runnable() {
        @Override
        public void run() {

            int total=songDuration();
            int CurrentPosition=0;
            seekBar.setMax(total);

            while(CurrentPosition<total){
                try {
                    Thread.sleep(1000);
                    CurrentPosition=getMediaPlayerCurrentPosition();
                    Log.d(TAG,String.valueOf(CurrentPosition));
                } catch (InterruptedException e) {
                    return;
                }seekBar.setProgress(CurrentPosition);
            }
        }
    }).start();

    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(final SeekBar seekBar, int ProgressValue, boolean fromUser) {
           // if(fromUser){
             //   mp.seekTo(ProgressValue);
            //}
            final long Minutes=((ProgressValue/1000)/60);
            final int Seconds=((ProgressValue/1000)%60);
            SongProgress.setText(Minutes+":"+Seconds);


        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

}


private ServiceConnection mServiceConnection=new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        MediaPlayerService.LocalBinder binder=(MediaPlayerService.LocalBinder)iBinder;
        mediaPlayerServiceObject=binder.getService();
        ServiceBinding=true;
        getSeekBarStatus();

    }

    @Override
    public void onServiceDisconnected(ComponentName componentName) {
        stopService(PlayerServiceIntent);
        onStop();
        ServiceBinding=false;
    }
};
1 голос
/ 29 августа 2011

Вы воспроизводите мультимедиа на сервисе, поэтому для связи с сервисом вам необходимо bind активность с сервисом.

Для получения дополнительной информации о Bind см. Документ ниже

Нажмитездесь

РЕДАКТИРОВАТЬ

Также см. учебное руководство ниже

Нажмите здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...