音乐—带开始结束
2015-07-02 21:46
561 查看
在Android中一般用MediaPlayer类处理比较大的音频文件,用SoundPool类处理比较短促的音频文件。
设计一个额音乐播放类Music
图片示例
需要新建一个Servicem,自定义服务类,用于获取音频数据,并且调用方法,根据音频位置进行播放
MainActivity:(写明点击不同按钮时候的事件,对应作出的处理,设置相应的单机监听事件,通过不同的按钮单击传递不同的参数给Service.)
设计一个额音乐播放类Music
图片示例
需要新建一个Servicem,自定义服务类,用于获取音频数据,并且调用方法,根据音频位置进行播放
package com.bzu.xuyinghui; import java.io.IOException; import android.app.Service; import android.content.Intent; import android.database.Cursor; import android.media.MediaPlayer; import android.net.Uri; import android.os.IBinder; import android.provider.MediaStore; import android.widget.Toast; //定义音乐服务类 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(); } // 暂停时,结束服务 //暂停音乐播放 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); String info = c.getString(artistColumn) + " " + c.getString(titleColumn); return info; } // 服务结束时要释放MediaPlayer public void onDestroy() { super.onDestroy(); mMediaPlayer.release(); } }
MainActivity:(写明点击不同按钮时候的事件,对应作出的处理,设置相应的单机监听事件,通过不同的按钮单击传递不同的参数给Service.)
package com.bzu.xuyinghui; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; //定义了本实例的主要Activity 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); } // 按钮点击事件响应 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); } } }
相关文章推荐
- Android实现表情 抓取新浪表情
- 详解Android解析Xml的三种方式——DOM、SAX以及XMLpull
- android开发环境遇到adt无法启动的问题分析及解决方法
- Android开发 旋转屏幕导致Activity重建解决方法
- Android开发技巧之在a标签或TextView控件中单击链接弹出Activity(自定义动作)
- Android开发技巧之ViewStub控件惰性装载
- 分享10个很棒的学习Android开发的网站
- android开发之横向滚动/竖向滚动的ListView(固定列头)
- Android开发技巧之我的菜单我做主(自定义菜单)
- Windows下使用Apache Cordova开发ANDROID之HelloWorld
- 根据根据图片的url怎么取得图片ImageView对象
- [转] ADB server didn't ACK
- android开发的相关链接
- Android数据存储之SharedPreferences 共享首选项/偏好设置
- 基于NDK的Android防破解
- android开发学习如何一体化?从入门到高端开发的路如何走?
- Android入门到精通详解 电子书下载
- --暴走漫画系列--高仿淘宝收货地址(附demo)
- Android开发高手如何炼成?
- Android开发的真正难度并不在技术