#1.bindService(intent,con,BIND_AUTO_CREATE)使得MusicPlayerService的OnCreate()方法执行(但是OnStartCommand()方法不会执行)。
在OnCreate()中获取音乐列表:
@Override
public void onCreate() {
super.onCreate();
// 获得音乐列表
getDataFromLocal();
}
/**
* 从本地的sdcard得到数据
* //1.遍历sdcard,后缀名
* //2.从内容提供者里面获取视频
* //3.如果是6.0的系统,动态获取读取sdcard的权限
*/
private void getDataFromLocal() {
// 因为服务本身默认在主线程执行,所以需要开启新线程
new Thread(){
@Override
public void run() {
super.run();
// isGrantExternalRW((Activity) context);
// SystemClock.sleep(2000);
mediaItems = new ArrayList<>();
ContentResolver resolver = getContentResolver();//服务本身就是一个Context
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String[] objs = {
MediaStore.Audio.Media.DISPLAY_NAME,//视频文件在sdcard的名称
MediaStore.Audio.Media.DURATION,//视频总时长
MediaStore.Audio.Media.SIZE,//视频的文件大小
MediaStore.Audio.Media.DATA,//视频的绝对地址
MediaStore.Audio.Media.ARTIST,//歌曲的演唱者
};
Cursor cursor = resolver.query(uri, objs, null, null, null);
if(cursor != null){
while (cursor.moveToNext()){
MediaItem mediaItem = new MediaItem();
mediaItems.add(mediaItem);//写在上面
String name = cursor.getString(0);//视频的名称
mediaItem.setName(name);
long duration = cursor.getLong(1);//视频的时长
mediaItem.setDuration(duration);
long size = cursor.getLong(2);//视频的文件大小
mediaItem.setSize(size);
String data = cursor.getString(3);//视频的播放地址
mediaItem.setData(data);
String artist = cursor.getString(4);//艺术家
mediaItem.setArtist(artist);
}
cursor.close();
}
}
}.start();
}
#2.开始播放音频
package com.example.player.service;
import android.app.Service;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.IBinder;
import android.os.RemoteException;
import android.provider.MediaStore;
import android.widget.Toast;
import com.example.player.IMusicPlayerService;
import com.example.player.domain.MediaItem;
import com.example.player.utils.LogUtil;
import java.io.IOException;
import java.util.ArrayList;
public class MusicPlayerService extends Service {
public MusicPlayerService() {
}
private ArrayList<MediaItem> mediaItems;//音乐列表
/**
* 当前播放的音频文件对象
*/
private MediaItem mediaItem;
private int position;
/**
* 播放音乐
*/
private MediaPlayer mediaPlayer;
@Override
public void onCreate() {
super.onCreate();
// 获得音乐列表
getDataFromLocal();
}
/**
* 从本地的sdcard得到数据
* //1.遍历sdcard,后缀名
* //2.从内容提供者里面获取视频
* //3.如果是6.0的系统,动态获取读取sdcard的权限
*/
private void getDataFromLocal() {
// 因为服务本身默认在主线程执行,所以需要开启新线程
new Thread(){
@Override
public void run() {
super.run();
// isGrantExternalRW((Activity) context);
// SystemClock.sleep(2000);
mediaItems = new ArrayList<>();
ContentResolver resolver = getContentResolver();//服务本身就是一个Context
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String[] objs = {
MediaStore.Audio.Media.DISPLAY_NAME,//视频文件在sdcard的名称
MediaStore.Audio.Media.DURATION,//视频总时长
MediaStore.Audio.Media.SIZE,//视频的文件大小
MediaStore.Audio.Media.DATA,//视频的绝对地址
MediaStore.Audio.Media.ARTIST,//歌曲的演唱者
};
Cursor cursor = resolver.query(uri, objs, null, null, null);
if(cursor != null){
while (cursor.moveToNext()){
MediaItem mediaItem = new MediaItem();
mediaItems.add(mediaItem);//写在上面
String name = cursor.getString(0);//视频的名称
mediaItem.setName(name);
long duration = cursor.getLong(1);//视频的时长
mediaItem.setDuration(duration);
long size = cursor.getLong(2);//视频的文件大小
mediaItem.setSize(size);
String data = cursor.getString(3);//视频的播放地址
mediaItem.setData(data);
String artist = cursor.getString(4);//艺术家
mediaItem.setArtist(artist);
}
cursor.close();
}
}
}.start();
}
@Override
public IBinder onBind(Intent intent) {
return stub;
}
IMusicPlayerService.Stub stub = new IMusicPlayerService.Stub() {
MusicPlayerService service = MusicPlayerService.this;
@Override
public void stop() throws RemoteException {
service.stop();
}
@Override
public void start() throws RemoteException {
service.start();
}
@Override
public void setPlayMode(int mode) throws RemoteException {
service.setPlayMode(mode);
}
@Override
public void pre() throws RemoteException {
service.pre();
}
@Override
public void pause() throws RemoteException {
service.pause();
}
@Override
public void openAudio(int position) throws RemoteException {
service.openAudio(position);
}
@Override
public void next() throws RemoteException {
service.next();
}
@Override
public int getPlayMode() throws RemoteException {
// TODO Auto-generated method stub
return service.getPlayMode();
}
@Override
public int getDuration() throws RemoteException {
// TODO Auto-generated method stub
return service.getDuration();
}
@Override
public int getCurrentPosition() throws RemoteException {
// TODO Auto-generated method stub
return service.getCurrentPosition();
}
@Override
public String getAudioName() throws RemoteException {
// TODO Auto-generated method stub
return service.getName();
}
@Override
public String getArtistName() throws RemoteException {
// TODO Auto-generated method stub
return service.getArtist();
}
};
/**
* 根据位置打开一个音频并且播放
*
* @param position
*/
public void openAudio(int position) {
LogUtil.e("public void openAudio(int position) {");
this.position = position;
if (mediaItems != null && mediaItems.size() > 0) {
mediaItem = mediaItems.get(position);
if (mediaPlayer != null) {
// mediaPlayer.release();
mediaPlayer.reset();
}
try {
mediaPlayer = new MediaPlayer();
//设置监听:播放出错,播放完成,准备好
mediaPlayer.setOnPreparedListener(new MyOnPreparedListener());
mediaPlayer.setOnCompletionListener(new MyOnCompletionListener());
mediaPlayer.setOnErrorListener(new MyOnErrorListener());
mediaPlayer.setDataSource(mediaItem.getData());
mediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
} else {
Toast.makeText(MusicPlayerService.this, "还没有数据", Toast.LENGTH_SHORT).show();
}
}
class MyOnErrorListener implements MediaPlayer.OnErrorListener {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
next();
return true;
}
}
class MyOnCompletionListener implements MediaPlayer.OnCompletionListener {
@Override
public void onCompletion(MediaPlayer mp) {
next();
}
}
class MyOnPreparedListener implements MediaPlayer.OnPreparedListener {
@Override
public void onPrepared(MediaPlayer mp) {
start();
}
}
/**
* 开始播放音频
*/
public void start() {
mediaPlayer.start();
}
/**
* 暂停
*/
public void pause() {
mediaPlayer.pause();
}
public void stop() {
}
/**
* 得到当前的播放进度
*
* @return
*/
private int getCurrentPosition() {
return mediaPlayer.getCurrentPosition();
}
/**
* 得到当前音频的总时长
*
* @return
*/
private int getDuration() {
return mediaPlayer.getDuration();
}
/**
* 得到艺术家
*
* @return
*/
private String getArtist() {
return mediaItem.getArtist();
}
/**
* 得到歌曲名字
*
* @return
*/
private String getName() {
return mediaItem.getName();
}
/**
* 得到歌曲播放的路径
*
* @return
*/
private String getAudioPath() {
return mediaItem.getData();
}
/**
* 播放下一首歌曲
*/
public void next() {
}
/**
* 播放上一首歌曲
*/
public void pre() {
}
/**
* 得到播放模式
*/
public int getPlayMode() {
return 0;
}
/**
* 设置播放模式
*/
public void setPlayMode(int mode) {
}
}