Android 如何获取类中的mediaplayer对象,将服务扩展到另一个片段类

Android 如何获取类中的mediaplayer对象,将服务扩展到另一个片段类,android,android-fragments,android-mediaplayer,Android,Android Fragments,Android Mediaplayer,我有一个活动,我通过intent调用服务类并将uri传递给服务类,在onstartcommand()的服务类中,我获取uri并创建mediaplayer对象,并使用mp.start()播放歌曲。在另一个片段类中,我使用intent并获取活动传递给服务类的相同uri,并生成mp对象,使用此对象,我能够获取getduration(),但无法获取在服务类中播放的mediaplayer对象的getCurrentposition() MusicService.java Fragment.java publ

我有一个活动,我通过intent调用服务类并将uri传递给服务类,在onstartcommand()的服务类中,我获取uri并创建mediaplayer对象,并使用mp.start()播放歌曲。在另一个片段类中,我使用intent并获取活动传递给服务类的相同uri,并生成mp对象,使用此对象,我能够获取getduration(),但无法获取在服务类中播放的mediaplayer对象的getCurrentposition()

MusicService.java

Fragment.java

public class Fraggy extends Fragment  {
ImageView iv;
MusicService m;
TextView endpos,startpos;
SeekBar seekbar;
public MediaPlayer mp1;
private double startTime=0;

private double endTime=0;
private Handler myhandler=new Handler();;
private int forwardTime=5000;
private int backwardTime=5000;
int oneTimeOnly;
int c;

@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub



    super.onCreate(savedInstanceState);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onViewCreated(view, savedInstanceState);
    Toast.makeText(getActivity(), "hello",Toast.LENGTH_LONG).show();
}
@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {



    View myview=inflater.inflate(R.layout.activity_mainlayout,container,false);
    endpos=(TextView) myview.findViewById(R.id.textView2);
    startpos=(TextView) myview.findViewById(R.id.textView1);
    seekbar=(SeekBar) myview.findViewById(R.id.seekBar1);



    Bundle extras1=getActivity().getIntent().getExtras();
    if(extras1!=null)
    {

        String d=extras1.getString("uri");
        Uri uri=Uri.parse(d);
        try {
            mp1=MediaPlayer.create(getActivity(), uri);

            startTime=mp1.getCurrentPosition();// Here i m not able to get the current position
            if(oneTimeOnly==0)
            {
                seekbar.setMax((int) endTime);
                oneTimeOnly=1;
            }
            c=mp1.getDuration();//This works fine

            endpos.setText(String.format("%d min,%d sec",TimeUnit.MILLISECONDS.toMinutes((long)c),TimeUnit.MILLISECONDS.toSeconds((long)c)-TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long)c))));
            startpos.setText(String.format("%d min,%d sec",TimeUnit.MILLISECONDS.toMinutes((long)startTime),TimeUnit.MILLISECONDS.toSeconds((long)startTime)-TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long)startTime))));

            seekbar.setProgress((int)startTime);
            myhandler.postDelayed(upDateSong,100);
        } catch (IllegalArgumentException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (SecurityException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IllegalStateException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }



    }

    TextView tv=(TextView) myview.findViewById(R.id.textView3);
    Bundle extras=getActivity().getIntent().getExtras();
    if(extras!=null)
    {
        String d=extras.getString("name");
        tv.setText(d);



        }

    }

    return myview;
}
private Runnable upDateSong=new Runnable()
{
    public void run()
    {
        startTime=mp1.getCurrentPosition();
        startpos.setText(String.format("%d min,%d sec",TimeUnit.MILLISECONDS.toMinutes((long)startTime),TimeUnit.MILLISECONDS.toSeconds((long)startTime)-TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long)startTime))));
        seekbar.setProgress((int)startTime);
        myhandler.postDelayed(upDateSong,100);
    }
        }};

您需要获得服务现在拥有的相同对象, 查找将服务绑定到活动的, , 将活动绑定到服务后,可以将同一对象用于两个位置。
然后您就可以执行所有控件。

我可以将服务绑定到片段吗,感谢您对我上一个问题的回答,这真的很有帮助。您可以从活动中绑定它,因为它需要上下文,您也可以从片段中访问它。因为您也可以在片段中获取活动字段。
public class Fraggy extends Fragment  {
ImageView iv;
MusicService m;
TextView endpos,startpos;
SeekBar seekbar;
public MediaPlayer mp1;
private double startTime=0;

private double endTime=0;
private Handler myhandler=new Handler();;
private int forwardTime=5000;
private int backwardTime=5000;
int oneTimeOnly;
int c;

@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub



    super.onCreate(savedInstanceState);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onViewCreated(view, savedInstanceState);
    Toast.makeText(getActivity(), "hello",Toast.LENGTH_LONG).show();
}
@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {



    View myview=inflater.inflate(R.layout.activity_mainlayout,container,false);
    endpos=(TextView) myview.findViewById(R.id.textView2);
    startpos=(TextView) myview.findViewById(R.id.textView1);
    seekbar=(SeekBar) myview.findViewById(R.id.seekBar1);



    Bundle extras1=getActivity().getIntent().getExtras();
    if(extras1!=null)
    {

        String d=extras1.getString("uri");
        Uri uri=Uri.parse(d);
        try {
            mp1=MediaPlayer.create(getActivity(), uri);

            startTime=mp1.getCurrentPosition();// Here i m not able to get the current position
            if(oneTimeOnly==0)
            {
                seekbar.setMax((int) endTime);
                oneTimeOnly=1;
            }
            c=mp1.getDuration();//This works fine

            endpos.setText(String.format("%d min,%d sec",TimeUnit.MILLISECONDS.toMinutes((long)c),TimeUnit.MILLISECONDS.toSeconds((long)c)-TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long)c))));
            startpos.setText(String.format("%d min,%d sec",TimeUnit.MILLISECONDS.toMinutes((long)startTime),TimeUnit.MILLISECONDS.toSeconds((long)startTime)-TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long)startTime))));

            seekbar.setProgress((int)startTime);
            myhandler.postDelayed(upDateSong,100);
        } catch (IllegalArgumentException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (SecurityException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IllegalStateException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }



    }

    TextView tv=(TextView) myview.findViewById(R.id.textView3);
    Bundle extras=getActivity().getIntent().getExtras();
    if(extras!=null)
    {
        String d=extras.getString("name");
        tv.setText(d);



        }

    }

    return myview;
}
private Runnable upDateSong=new Runnable()
{
    public void run()
    {
        startTime=mp1.getCurrentPosition();
        startpos.setText(String.format("%d min,%d sec",TimeUnit.MILLISECONDS.toMinutes((long)startTime),TimeUnit.MILLISECONDS.toSeconds((long)startTime)-TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long)startTime))));
        seekbar.setProgress((int)startTime);
        myhandler.postDelayed(upDateSong,100);
    }
        }};