效果:
问题:可拖动进度条随进度条移动时,会致使音乐卡顿(待解决)
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.chenshuai.myapplication.ActivityMusic"
android:orientation="vertical">
<ProgressBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@android:style/Widget.ProgressBar.Horizontal"
android:id="@+id/pb"
/> <SeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/sbr" />
<TextView
android:layout_width="match_parent"
android:layout_height="40sp"
android:text="播放状态"
android:textSize="20sp"
android:gravity="center_horizontal"
android:id="@+id/tv_1"/> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"> <Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="播放"
android:onClick="play_onclick"/>
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="暂停"
android:onClick="pause_onclick"/>
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="停止"
android:onClick="stop_onclick"/>
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="退出"
android:onClick="exit_onclick"/>
</LinearLayout> </LinearLayout>
Service
package com.example.chenshuai.myapplication; import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder; public class MyServiceMusic extends Service { public MyServiceMusic() { } public class Mybind extends Binder
{
//获取歌曲长度
public int getMusicDuration()
{
int rtn = 0;
if (mediaPlayer != null)
{
rtn = mediaPlayer.getDuration();
} return rtn;
}
//获取当前播放进度
public int getMusicCurrentPosition()
{
int rtn = 0;
if (mediaPlayer != null)
{
rtn = mediaPlayer.getCurrentPosition(); } return rtn;
} public void seekTo(int position)
{
if (mediaPlayer != null)
{
mediaPlayer.seekTo(position);
}
} } @Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
//throw new UnsupportedOperationException("Not yet implemented");
return new Mybind();
}
private MediaPlayer mediaPlayer; @Override
public int onStartCommand(Intent intent, int flags, int startId) { //获取意图传递的信息
String action = intent.getStringExtra("action"); switch (action)
{
case "play":
if (mediaPlayer == null)
{
mediaPlayer = MediaPlayer.create(this,R.raw.onceagain); }
mediaPlayer.start(); break;
case "stop":
if (mediaPlayer !=null)
{
mediaPlayer.stop();
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer = null;
}
break;
case "pause":
if (mediaPlayer !=null && mediaPlayer.isPlaying())
{
mediaPlayer.pause();
}
break;
}
return super.onStartCommand(intent, flags, startId);
}
}
java
package com.example.chenshuai.myapplication; import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.SeekBar;
import android.widget.TextView; public class ActivityMusicservice extends AppCompatActivity { TextView tv_1;
ProgressBar pb;
SeekBar sbr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_activity_music); tv_1 = (TextView)findViewById(R.id.tv_1); tv_1.setText("播放状态11:停止播放。。。");
pb = (ProgressBar)findViewById(R.id.pb);
sbr = (SeekBar)findViewById(R.id.sbr); } ServiceConnection serviceConnection;
MyServiceMusic.Mybind mybind; public void play_onclick(View view)
{
Intent intent = new Intent(this,MyServiceMusic.class); intent.putExtra("action","play"); startService(intent); tv_1.setText("播放状态11:正在播放。。。"); if (serviceConnection == null) {
serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) { mybind = (MyServiceMusic.Mybind) service; //设置进度条的最大长度
int max = mybind.getMusicDuration();
pb.setMax(max); sbr.setMax(max);
sbr.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { mybind.seekTo(progress);
} @Override
public void onStartTrackingTouch(SeekBar seekBar) { } @Override
public void onStopTrackingTouch(SeekBar seekBar) { }
}); //连接之后启动子线程设置当前进度
new Thread()
{
public void run()
{ //改变当前进度条的值
//设置当前进度
while (true) {
pb.setProgress(mybind.getMusicCurrentPosition());
// sbr.setProgress(mybind.getMusicCurrentPosition()); try {
Thread.sleep(100);
} catch (Exception e) { e.printStackTrace();
}
}
} }.start(); } @Override
public void onServiceDisconnected(ComponentName name) { }
}; //以绑定方式连接服务
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); } } public void stop_onclick(View view)
{
Intent intent = new Intent(this,MyServiceMusic.class); intent.putExtra("action","stop"); startService(intent); tv_1.setText("播放状态11:停止播放。。。");
}
public void pause_onclick(View view)
{
Intent intent = new Intent(this, MyServiceMusic.class); intent.putExtra("action","pause"); startService(intent); tv_1.setText("播放状态11:暂停播放。。。"); }
public void exit_onclick(View view)
{
stop_onclick(view);
finish();
}
}
manifest.xml
<service
android:name=".MyServiceMusic"
android:enabled="true"
android:exported="true" />