package com.edu.sicnu.cs.zzy.mywork;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.provider.MediaStore;
import android.support.v4.app.NotificationCompat;
import android.text.TextUtils;
import android.widget.RemoteViews;
import java.io.IOException;
import java.util.ArrayList;
public class MusicService extends Service implements MediaPlayer.OnPreparedListener{
int current = -1;
boolean isfirst;
NotificationManager manager;
RemoteViews mRemoteViews;
NotificationCompat.Builder builder;
ArrayList<Music> musiclist = new ArrayList<>();
static MediaPlayer mediaPlayer;
final static String myChannel = "mymusicplayer";
public MusicService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
super.onCreate();
mediaPlayer = new MediaPlayer();
mediaPlayer.setOnPreparedListener(this);
getMusiclist();
//sendNotification();
//创建一个RemoteView实例
mRemoteViews = new RemoteViews(getPackageName(), R.layout.notification_window_layout);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//由于每次都要先获取position,可能导致发送pause等命令时拿不到"position"
int position = intent.getIntExtra("position",-1);
if(position == -1){
//position为-1时代表没有接受到PlayerActivity发来的信息,说明
position= current;
}
if(position != current){
isfirst = true;
}
initRemoteView();
initNotification();
//第一次进入PlayerActivity时直接播放
if(isfirst){
isfirst = false;
current = position;
playNew();
}else {
//之后可以接受其他命令
int operate = intent.getIntExtra("operate",-1);
switch (operate){
case 0:
goPlay();
break;
case 1:
play();
break;
case 2:
stop();
break;
case 3:
pause();
break;
case 4:
next();
break;
case 5:
prev();
break;
}
}
String action = intent.getAction();
int intExtra = intent.getIntExtra("index",-1);
//校验action
if(TextUtils.equals(action, "ntf")){
switch (intExtra){
case 1:
playNew();
break;
case 4:
next();
break;
case 5:
prev();
break;
}
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
mediaPlayer.release();
}
// public void sendNotification(){
// NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//
// //判断安卓版本是否大于API-26
// if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
// NotificationChannel channel = new NotificationChannel(myChannel,"my music notification", NotificationManager.IMPORTANCE_DEFAULT);
// manager.createNotificationChannel(channel);
//
// builder = new NotificationCompat.Builder(this,myChannel);
// builder.setSmallIcon(R.mipmap.ic_launcher).setContentTitle("MyMusicDemo:");
//
// //设置延时意图,点击通知进入界面
// Intent intent = new Intent(this,MainActivity.class);
// PendingIntent pendingIntent = PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
// builder.setContentIntent(pendingIntent);
// startForeground(1,builder.build());
// }
// }
public void getMusiclist(){
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,null,null,null);
while(cursor.moveToNext()){
String musicName = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
String musicPath = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
String musicArtist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
int duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
musiclist.add(new Music(musicName,musicPath,musicArtist,duration));
}
}
private void playNew() {
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(musiclist.get(current).getMusicPath());
mediaPlayer.prepareAsync(); //异步调用,防止阻塞
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer arg0) {
//如果当前歌曲播放完毕,自动播放下一首.
next();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
private void play(){
playNew();
}
private void stop(){
if(mediaPlayer.isPlaying()) mediaPlayer.stop();
}
private void pause(){
if(mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
}
//继续播放
public void goPlay(){
int position = getCurrentProgress();
mediaPlayer.seekTo(position);//设置当前MediaPlayer的播放位置,单位是毫秒。
try {
mediaPlayer.prepare();// 同步的方式装载流媒体文件。
} catch (Exception e) {
e.printStackTrace();
}
mediaPlayer.start();
}
// 获取当前进度
public static int getCurrentProgress() {
if (mediaPlayer != null & mediaPlayer.isPlaying()) {
return mediaPlayer.getCurrentPosition();
} else if (mediaPlayer != null & (!mediaPlayer.isPlaying())) {
return mediaPlayer.getCurrentPosition();
}
return 0;
}
private void next(){
current++;
current = current % musiclist.size();
playNew();
}
private void prev(){
current--;
if(current<0) current = musiclist.size()-1;
playNew();
}
private void initRemoteView() {
//实例化一个指向MusicService的intent
Intent intent = new Intent(this, MusicService.class);
intent.setAction("ntf");
//设置play按钮的点击事件
intent.putExtra("index", 1);
PendingIntent pendingIntent_play = PendingIntent.getService(this, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT);
mRemoteViews.setOnClickPendingIntent(R.id.ntf_btn_play, pendingIntent_play);
//设置next按钮的点击事件
intent.putExtra("index", 4);
PendingIntent pendingIntent_next = PendingIntent.getService(this, 4, intent, Pendin
没有合适的资源?快使用搜索试试~ 我知道了~
最近在学习安卓开发,但是发现很大部分的资源都在Android studio 2.X左右,甚至还有eclipse的,又正值需要完成期末项目,遂编写了一个简单实用的音乐播放器APP;内容涵盖了Android 四大件 ,各大主要控件以及UI的设计,适合初学者观看学习。
资源推荐
资源详情
资源评论




















收起资源包目录





































































































共 209 条
- 1
- 2
- 3
资源评论


I_Field
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制
