效果图:
1.获取本地音乐
2.播放音乐
MediaPlayer 音乐播放类
MediaPlayer其实是一个封装的很好的音频、视频流媒体操作类,如果查看其源码,会发现其内部是调用的native方法,所以它其实是有C++实现的。
既然是一个流媒体操作类,那么必然涉及到,播放、暂停、停止等操作,实际上MediaPlayer也为我们提供了相应的方法来直接操作流媒体。
- void statr():开始或恢复播放。
- void stop():停止播放。
- void pause():暂停播放。
通过上面三个方法,只要设定好流媒体数据源,即可在应用中播放流媒体资源,为了更好的操作流媒体,MediaPlayer还为我们提供了一些其他的方法,这里列出一些常用的,详细内容参阅官方文档。
- int getDuration():获取流媒体的总播放时长,单位是毫秒。
- int getCurrentPosition():获取当前流媒体的播放的位置,单位是毫秒。
- void seekTo(int msec):设置当前MediaPlayer的播放位置,单位是毫秒。
- void setLooping(boolean looping):设置是否循环播放。
- boolean isLooping():判断是否循环播放。
- boolean isPlaying():判断是否正在播放。
- void prepare():同步的方式装载流媒体文件。
- void prepareAsync():异步的方式装载流媒体文件。
- void release ():回收流媒体资源。
- void setAudioStreamType(int streamtype):设置播放流媒体类型。
- void setWakeMode(Context context, int mode):设置CPU唤醒的状态。
- setNextMediaPlayer(MediaPlayer next):设置当前流媒体播放完毕,下一个播放的MediaPlayer。
一,本地音乐获取
package com.hejun.music.biz; import android.content.ContentResolver; import android.content.ContentUris; import android.content.Context; import android.content.res.Resources; import android.database.Cursor; import android.database.CursorIndexOutOfBoundsException; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.ParcelFileDescriptor; import android.provider.MediaStore; import com.hejun.music.R; import com.hejun.music.bean.Song; import java.io.FileDescriptor; import java.io.FileNotFoundException; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; public class SongBIZ { private static SongBIZ songBiz = null; public static SongBIZ getInstangce() { if (songBiz == null) { songBiz = new SongBIZ(); } return songBiz; } public List<Song> getAllMusic(Context context) { List<Song> songs = new ArrayList<>(); Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[]{ MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.YEAR, MediaStore.Audio.Media.MIME_TYPE, MediaStore.Audio.Media.SIZE, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.ALBUM_ID, }, MediaStore.Audio.Media.MIME_TYPE + "=? or " + MediaStore.Audio.Media.MIME_TYPE + "=?", new String[]{"audio/mpeg", "audio/x-ms-wma"}, null); if (cursor.moveToFirst()) { Song song = null; do { song = new Song(); // 文件名 song.setFileName(cursor.getString(1)); // 歌曲名 song.setTitle(cursor.getString(2)); // 时长 long time = cursor.getInt(3); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss");//12小时制 Date date = new Date(); date.setTime(time); String time1 = simpleDateFormat.format(date); song.setDuration(time1); // 歌手名 song.setSinger(cursor.getString(4)); // 专辑名 song.setAlbum(cursor.getString(5)); song.setAlbumID(cursor.getInt(10)); // 年代 if (cursor.getString(6) != null) { song.setYear(cursor.getString(6)); } else { song.setYear("未知"); } // 歌曲格式 if ("audio/mpeg".equals(cursor.getString(7).trim())) { song.setType("mp3"); } else if ("audio/x-ms-wma".equals(cursor.getString(7).trim())) { song.setType("wma"); } // 文件大小 if (cursor.getString(8) != null) { float size = cursor.getInt(8) / 1024f / 1024f; song.setSize((size + "").substring(0, 4) + "M"); } else { song.setSize("未知"); } // 文件路径 if (cursor.getString(9) != null) { song.setFileUrl(cursor.getString(9)); } songs.add(song); } while (cursor.moveToNext()); cursor.close(); } return songs; } public Bitmap getAlbumArt(Context context,int album_id) { String mUriAlbums = "content://media/external/audio/albums"; String[] projection = new String[]{"album_art"}; Cursor cur = context.getContentResolver().query(Uri.parse(mUriAlbums + "/" + Integer.toString(album_id)), projection, null, null, null); String album_art = null; if (cur.getCount() > 0 && cur.getColumnCount() > 0) { cur.moveToNext(); album_art = cur.getString(0); } cur.close(); Bitmap bm = null; if (album_art != null) { bm = BitmapFactory.decodeFile(album_art); } else { /* int[] pic = new int[]{ R.drawable.aelbum, R.drawable.first, R.drawable.second, R.drawable.third, }; int i = (int) (Math.random()*4);*/ bm = BitmapFactory.decodeResource(context.getResources(), R.drawable.first); } return bm; } }
Service类
package com.hejun.music; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.net.Uri; import android.os.Binder; import android.os.Environment; import android.os.IBinder; import android.util.Log; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class MusicService extends Service { public MediaPlayer mediaPlayer; private String path; public MusicService() { } @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { mediaPlayer = new MediaPlayer(); path = intent.getStringExtra("path"); try { path = intent.getStringExtra("path"); File file = new File(path); FileInputStream fis = new FileInputStream(file); mediaPlayer.setDataSource(fis.getFD()); mediaPlayer.prepare(); mediaPlayer.setLooping(true); // mediaPlayer.start(); } catch (Exception e) { e.printStackTrace(); } return super.onStartCommand(intent, flags, startId); } // 通过 Binder 来保持 Activity 和 Service 的通信 public MyBinder binder = new MyBinder(); public class MyBinder extends Binder { MusicService getService() { return MusicService.this; } } public void play() { Log.e("tag", "play: " + mediaPlayer ); mediaPlayer.start(); } public void pause() { if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); } } public void playOrPause() { if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); } else { mediaPlayer.start(); } } public void stop() { if (mediaPlayer != null) { mediaPlayer.stop(); try { mediaPlayer.reset(); mediaPlayer.setDataSource(path); mediaPlayer.prepare(); mediaPlayer.seekTo(0); } catch (Exception e) { e.printStackTrace(); } } } @Override public boolean onUnbind(Intent intent) { return super.onUnbind(intent); } @Override public IBinder onBind(Intent intent) { return binder; } }
主要播放流程:
启动activity ---> 获取歌曲信息-----> 绑定,启动服务(MediaPlayer加载资源)----->调用MediaPlayer.start()方法