音乐播放器

音乐播放器



1、 activity_main.xml
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"> 
     <Button
         android:id="+id/previous"
         android:layout_width="wrap_content"
         android:layout_height="fill_parent"
         android:layout_weight="1"
         android:text="上一首"
      />
     <Button
         android:id="+id/play"
         android:layout_width="wrap_content"
         android:layout_height="fill_parent"
         android:layout_weight="1"
         android:text="播放"
      />
     <Button
         android:id="+id/next"
         android:layout_width="wrap_content"
         android:layout_height="fill_parent"
         android:layout_weight="1"
         android:text="下一首"
      />
     <Button
         android:id="+id/pause"
         android:layout_width="wrap_content"
         android:layout_height="fill_parent"
         android:layout_weight="1"
         android:text="暂停"
      />
     </LinearLayout>

2、 mainactivty.java
public class MainActivity extends Activity implements OnClickListener {
        //初始化控件
    private Button mBtnPrevious; // 上一首
    private Button mBtnPlay; // 播放
    private Button mBtnNext; // 下一首
    private Button mBtnPause; // 暂停
    private ComponentName component; // 用于启动服务


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 得到布局中的控件
        findView();
        // 绑定控件事件
        setListener();
    }


    // 得到布局中的控件
    private void findView() {
        component = new ComponentName(this, MusicService.class);
        mBtnPrevious = (Button) findViewById(R.id.previous);
        mBtnPlay = (Button) findViewById(R.id.play);
        mBtnNext = (Button) findViewById(R.id.next);
        mBtnPause = (Button) findViewById(R.id.pause);
    }
    // 绑定控件事件
    private void setListener() {
        mBtnPrevious.setOnClickListener(this);
        mBtnPlay.setOnClickListener(this);
        mBtnNext.setOnClickListener(this);
        mBtnPause.setOnClickListener(this);
    }
    // 按钮点击事件响应
    public void onClick(View v) {
        // 如果点击前一首歌,就在intent中传递前一首歌参数
        if (v == mBtnPrevious) {
            Intent mIntent = new Intent(MusicService.PREVIOUS_ACTION);
            mIntent.setComponent(component);
            startService(mIntent);
        // 如果点击前播放歌曲,就在intent中传递播放当前歌参数
        } else if (v == mBtnPlay) {
            Intent mIntent = new Intent(MusicService.PLAY_ACTION);
            mIntent.setComponent(component);
            startService(mIntent);
        // 如果点击前一首歌,就在intent中传递下一首歌参数
        } else if (v == mBtnNext) {
            Intent mIntent = new Intent(MusicService.NEXT_ACTION);
            mIntent.setComponent(component);
            startService(mIntent);
        // 如果点击前一首歌,就在intent中传递暂停首歌参数
        } else {
            Intent mIntent = new Intent(MusicService.PAUSE_ACTION);
            mIntent.setComponent(component);
            startService(mIntent);
        }
    }
}

3、定义音乐服务类
//定义音乐服务类
public class MusicService extends Service {
    // 定义需要显示的音乐的字段
    String[] mCursorCols = new String[] {
            "audio._id AS _id", // index must match IDCOLIDX below
            MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM,
            MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA,
            MediaStore.Audio.Media.MIME_TYPE, MediaStore.Audio.Media.ALBUM_ID,
            MediaStore.Audio.Media.ARTIST_ID, MediaStore.Audio.Media.DURATION };
    private MediaPlayer mMediaPlayer; // 声明播放器
    private Cursor mCursor; // 声明游标
    private int mPlayPosition = 0; // 当前播放的歌曲


    // 注册意图
    public static final String PLAY_ACTION = "com.wyl.music.PLAY_ACTION";
    public static final String PAUSE_ACTION = "com.wyl.music.PAUSE_ACTION";
    public static final String NEXT_ACTION = "com.wyl.music.NEXT_ACTION";
    public static final String PREVIOUS_ACTION = "com.wyl.music.PREVIOUS_ACTION";


    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }


    @Override
    public void onCreate() {
        super.onCreate();
        mMediaPlayer = new MediaPlayer();
        Uri MUSIC_URL = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;// 通过一个URI可以获取所有音频文件
        //默认大于10秒的可以看作是系统音乐
        mCursor = getContentResolver().query(MUSIC_URL, mCursorCols,
                "duration > 10000", null, null);
    }


    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        // 根据不同的action,做不同的相应
        String action = intent.getAction();
        //播放
        if (action.equals(PLAY_ACTION)) {
            play();
        //暂停
        } else if (action.equals(PAUSE_ACTION)) {
            pause();
        //下一首
        } else if (action.equals(NEXT_ACTION)) {
            next();
        //前一首
        } else if (action.equals(PREVIOUS_ACTION)) {
            previous();
        }
    }


    // 播放音乐
    public void play() {
        //初始化音乐播放器
        inite();
    }


    // 暂停时,结束服务
    public void pause() {
        //暂停音乐播放
        stopSelf();
    }


    // 上一首
    public void previous() {
        //得到前一首的歌曲
        if (mPlayPosition == 0) {
            mPlayPosition = mCursor.getCount() - 1;
        } else {
            mPlayPosition--;
        }
        //开始播放
        inite();
    }


    // 下一首
    public void next() {
        //得到后一首歌曲
        if (mPlayPosition == mCursor.getCount() - 1) {
            mPlayPosition = 0;
        } else {
            mPlayPosition++;
        }
        //开始播放
        inite();
    }


    // 初始化播放器
    public void inite() {
        //充值MediaPlayer
        mMediaPlayer.reset();
        // 获取歌曲位置
        String dataSource = getDateByPosition(mCursor, mPlayPosition);
        // 歌曲信息
        String info = getInfoByPosition(mCursor, mPlayPosition);
        // 用Toast显示歌曲信息
        Toast.makeText(getApplicationContext(), info, Toast.LENGTH_SHORT)
                .show();
        try {
            // 播放器绑定资源
            mMediaPlayer.setDataSource(dataSource);
            // 播放器准备
            mMediaPlayer.prepare();
            // 播放
            mMediaPlayer.start();
        } catch (IllegalArgumentException e1) {
            e1.printStackTrace();
        } catch (IllegalStateException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }


    // 根据位置来获取歌曲位置
    public String getDateByPosition(Cursor c, int position) {
        c.moveToPosition(position);
        int dataColumn = c.getColumnIndex(MediaStore.Audio.Media.DATA);
        String data = c.getString(dataColumn);
        return data;
    }


    // 获取当前播放歌曲演唱者及歌名
    public String getInfoByPosition(Cursor c, int position) {
        c.moveToPosition(position);
        int titleColumn = c.getColumnIndex(MediaStore.Audio.Media.TITLE);
        int artistColumn = c.getColumnIndex(MediaStore.Audio.Media.ARTIST);
        String info = c.getString(artistColumn) + " "
                + c.getString(titleColumn);
        return info;


    }


    // 服务结束时要释放MediaPlayer
    public void onDestroy() {
        super.onDestroy();
        mMediaPlayer.release();
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值