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