您的位置:首页 > 其它

音乐播放器:添加了广播和后台服务、通知

2015-08-10 19:22 363 查看
public class NewKugouMainActivity extends Activity implements OnClickListener,
OnSeekBarChangeListener {

private ImageView mUpMusicBtn, mStartAndSuspendMusicBtn, mNextMusicBtn,
mListMusicBtn;
public TextView mTitleMusicNameText;
private TextView mCurrentTimeText;
private TextView mAllTimeText;
private SeekBar mSeekBar;
private Handler mHander = new Handler();

private boolean timeSwitch = true;

// 弹出歌曲列表
private PopupWindow mPopupWindom;
private LayoutInflater mInflater;
// SD卡的目录
private File allFile = Environment.getExternalStorageDirectory();
// 装遍历出来的音乐文件的名字
private List<File> fileName = new ArrayList<File>();
private ArrayList<MusicWayBean> musicBeanList = new ArrayList<MusicWayBean>();

// 装遍历出来的音乐文件的名字,是分割过后的音乐文件名字,没有后缀名
private ArrayList<String> sdcardMusicName = new ArrayList<String>();

// 在点击ListView中会初次实例化,是当前选择的ListView中的哪一项,用于上一首,下一首,和名字数组中取名字,会在点击上一首,下一首中再次实例化
private int checkMusicNumber = -1;
// 服务定义的接口
private ICopyMusicService mIMusicService;
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {

}

public void onServiceConnected(ComponentName name, IBinder service) {
mIMusicService = (ICopyMusicService) service;

}
};

String mDivicionUpName;// 点击上一首时取得上一首歌曲的名字
String mDivicionNextName;// 点击下一首时取得下一首歌曲的名字
String mNotificationName;// 通知处的音乐名字
String blankString;
// ---------界面销毁后,点击通知传进来当前歌曲的时间--------------
private int mAllNotifiTime;
private int mCurrentNotifiTime;

// ----------活动法广播-------------
public final String ACTIVITY_UP_CLICK = "com.kugou.activity.up_click_musicbtn";
public final String ACTIVITY_NEXT_CLICK = "com.kugou.activity.next_click_musicbtn";
public final String ACTIVITY_START_AND_SUSPEND_CLICK = "com.kugou.activity.start_and_suspend_click_musicbtn";
public final String ACTIVITY_LISTVIEW_CLICK = "com.kugou.activity.listView_click_musicbtn";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_kugou_music);

getFileWithMusic(allFile);// 遍历文件获取音乐文件
example();// 实例化控件

mStartAndSuspendMusicBtn
.setImageResource(R.drawable.kg_lock_screen_play_button_pressed);

Intent serviceIntent = new Intent(NewKugouMainActivity.this,
MusicService.class);
Log.i("11","启动服务");
startService(serviceIntent);
bindService(serviceIntent, mConnection, BIND_AUTO_CREATE);

new Thread(new MusicRefrshTime()).start();

mListMusicBtn.setOnClickListener(this);
mUpMusicBtn.setOnClickListener(this);
mStartAndSuspendMusicBtn.setOnClickListener(this);
mNextMusicBtn.setOnClickListener(this);
mSeekBar.setOnSeekBarChangeListener(this);
}

public void onClick(View v) {
switch (v.getId()) {
case R.id.new_kuguo_up_music_btn:
Log.i("11", "检测上一曲前>>>"+checkMusicNumber);
if (checkMusicNumber < 0) {
Toast.makeText(this, "当前没有音乐可以播放", 0).show();
return;
} else {
upMusic(checkMusicNumber);
}
break;
case R.id.new_kuguo_start_and_suspend_music_btn:
if (checkMusicNumber < 0) {
Toast.makeText(this, "当前没有音乐可以播放", 0).show();
return;
} else {
boolean falg = mIMusicService.iStartAndSuspendMusic();
startORsuspendMusic(falg);

}
break;
case R.id.new_kuguo_next_music_btn:
Log.i("11", "检测下一曲前>>>"+checkMusicNumber);
if (checkMusicNumber < 0) {
Toast.makeText(this, "当前没有音乐可以播放", 0).show();
return;
} else {
nextMusic(checkMusicNumber);
}
break;
case R.id.new_kugou_list_music_imagebtn:
if (!isUseable()) {// 判断SD卡是否能用
Toast.makeText(NewKugouMainActivity.this, "外部存储不可用",
Toast.LENGTH_SHORT).show();
return;
} else {
listMusicForPopupWindom();
}
break;
}
}

/**
* 实例化控件
*/
public void example() {
mUpMusicBtn = (ImageView) findViewById(R.id.new_kuguo_up_music_btn);
mStartAndSuspendMusicBtn = (ImageView) findViewById(R.id.new_kuguo_start_and_suspend_music_btn);
mNextMusicBtn = (ImageView) findViewById(R.id.new_kuguo_next_music_btn);
mListMusicBtn = (ImageView) findViewById(R.id.new_kugou_list_music_imagebtn);

mTitleMusicNameText = (TextView) findViewById(R.id.new_music_name_text);
mAllTimeText = (TextView) findViewById(R.id.new_kuguo_all_time_text);
mCurrentTimeText = (TextView) findViewById(R.id.new_kuguo_current_time_text);

mSeekBar = (SeekBar) findViewById(R.id.new_kuguo_seekbar);
mInflater = LayoutInflater.from(this);
}

/**
* 点击Title最右边的按钮弹出音乐列表窗口,用PopupWindom来实现
*/
public void listMusicForPopupWindom() {
// 高度要适当的设置
mPopupWindom = new PopupWindow(getListViewForPopupWindom(), 700, 500);
mPopupWindom.setFocusable(true);// 此方法可以保证PopupWindom里面嵌套的ListView有点击响应
// 下面这三行代码可以让你点击空白处来关闭PopWindow 弹出的窗口
mPopupWindom.setTouchable(true);
mPopupWindom.setOutsideTouchable(true);
mPopupWindom.setBackgroundDrawable(new BitmapDrawable());
mPopupWindom.getContentView().setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
mPopupWindom.setFocusable(false);// 失去焦点
mPopupWindom.dismiss();// 消除pw
return true;
}
});

// 点击按钮就弹出窗口
mListMusicBtn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (mPopupWindom.isShowing()) {// 判断窗口是否已经弹出弹出
mPopupWindom.dismiss();// 关闭窗口
} else {
mPopupWindom.showAsDropDown(v);// 弹出窗口
}

}
});
}

/**
* 把装有ListView的布局返回给PopupWindom的实例化中,才有弹窗的布局类型
*/
public View getListViewForPopupWindom() {
View v = mInflater.inflate(R.layout.copykugou_listview_music_layout,
null);
ListView mListview = (ListView) v
.findViewById(R.id.copykugou_listview_to_musicname);
TextView allMusicPopupText = (TextView) v
.findViewById(R.id.popupwindow_allmusic_to_text);
allMusicPopupText.setText("总共" + fileName.size() + "首歌曲");
ListMusicAdapter listBaseadapter = new ListMusicAdapter(this);
mListview.setAdapter(listBaseadapter);
listBaseadapter.setData(fileName);
// 点击事件,就启动服务,和添加歌曲的名字
mListview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
ListMusicAdapter backAdapter = (ListMusicAdapter) parent
.getAdapter();
File fileCheckMusic = (File) backAdapter.getItem(position);

String backPrepareMusic = fileCheckMusic.getPath();

Log.i("11",position+""+musicBeanList);
// --------发送广播-传递数组(地址、名字)和当前的选项------------
listSendBroacast(position,musicBeanList);

mStartAndSuspendMusicBtn
.setImageResource(R.drawable.kg_lock_screen_pause_button_pressed);

// 点击就初始化
checkMusicNumber = position;
// 分割后缀名,并显示当前点击的歌曲名字
String divisionNameAfter = divisionMusicName(fileCheckMusic
.getName());

mTitleMusicNameText.setText(divisionNameAfter);
// PopupWindow关闭
mPopupWindom.dismiss();
}
});

return v;
}

/**
* 点击listview也发广播,传递当前点击的某一项,和音乐列表
* @param position
* @param ListMusicBeanList
*/
public void listSendBroacast(int positions,
ArrayList<MusicWayBean> ListMusicBeanList) {

Intent activityBroadcastIntent = new Intent(ACTIVITY_LISTVIEW_CLICK);
activityBroadcastIntent.putExtra("LIST_V_CLICK_POSITON", positions);
activityBroadcastIntent.putParcelableArrayListExtra(
"LIST_V_CLICK_MUSICLIST", ListMusicBeanList);

sendBroadcast(activityBroadcastIntent);
Log.i("11","发送成功");
}

/**
* 无限遍历一个文件夹,找出音乐文件,并添加到List里面,然后设置给适配器
*/
public void getFileWithMusic(File fileAddress) {
if (fileAddress != null) {
File[] fileList = fileAddress.listFiles();
if (fileList != null) {
for (File f : fileList) {
if (f.isDirectory()) {
getFileWithMusic(f);

} else {
String s = f.getName();
if (s.endsWith(".mp3") || s.endsWith(".m4a")
|| s.endsWith(".amr")) {
fileName.add(f);// 添加的是地址
String namePostfix = divisionMusicName(s);// 返回的没有后缀名的音乐文件名

MusicWayBean bean = new MusicWayBean();

bean.setMusicPathBean("file://" + f.getPath());
bean.setMusicNameBean(namePostfix);

musicBeanList.add(bean);

sdcardMusicName.add(namePostfix);
}
}
}
}
}
}

/**
* 判断SD卡是否存在 返回的是true:存在
*
* @return
*/
public boolean isUseable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
} else {
return false;
}
}

/**
* 返回没有后缀名的音乐名字
*/
public String divisionMusicName(String s) {
String[] names = s.split("[.]");
return names[0];
}

/**
* 界面销毁时,就取消用户交互的连接
*/
protected void onDestroy() {
super.onDestroy();
Log.i("11", "销毁界面");
if (mConnection != null && mIMusicService != null) {
unbindService(mConnection);
mConnection = null;
timeSwitch = false;
}

}

/**
* 上一首歌曲
*/
public void upMusic(int nowNumb) {
Log.i("11", "检测上一曲前>>>"+checkMusicN
f988
umber);
if (nowNumb - 1 < 0) {// 数组从0开始计数
Toast.makeText(this, "已经是第一个了", 0).show();

nowNumb = 0;// 再一次赋值,更新
} else {
// 传入新的歌曲播放地址
mIMusicService.iUpMusic("File://" + fileName.get(nowNumb - 1));// 传入歌曲,
// 设置title上面显示的名字
mDivicionUpName = divisionMusicName(sdcardMusicName
.get(nowNumb - 1));
// Title处显示当前播放歌曲的名字
mTitleMusicNameText.setText(mDivicionUpName);

Log.i("11", "上一首的活动类>>" + checkMusicNumber);
activityBroadcastReceiver(ACTIVITY_UP_CLICK,
"activity_up_click_music", blankString, checkMusicNumber,
true);
checkMusicNumber = nowNumb - 1;// 再一次赋值,更新
}
}

/**
* 暂停会播放更改图片按钮
*/
public void startORsuspendMusic(boolean fals) {

if (fals == true) {
mStartAndSuspendMusicBtn
.setImageResource(R.drawable.kg_lock_screen_play_button_pressed);
activityBroadcastReceiver(ACTIVITY_START_AND_SUSPEND_CLICK,
blankString, "activity_startandsuspend_click_music", 0,
true);
} else {
mStartAndSuspendMusicBtn
.setImageResource(R.drawable.kg_lock_screen_pause_button_pressed);
activityBroadcastReceiver(ACTIVITY_START_AND_SUSPEND_CLICK,
blankString, "activity_startandsuspend_click_music", 0,
false);

}
}

/**
* 下一首歌曲
*/
public void nextMusic(int naexClickNumb) {
if (naexClickNumb + 1 < fileName.size()) {// 数组从0开始计数

// 传入新的歌曲播放地址
mIMusicService.iNextMusic("File://"
+ fileName.get(naexClickNumb + 1));// 传入歌曲,
// 设置title上面显示的名字
mDivicionNextName = divisionMusicName(sdcardMusicName
.get(naexClickNumb + 1));
mTitleMusicNameText.setText(mDivicionNextName);

checkMusicNumber = naexClickNumb + 1;// 再一次赋值,更新
Log.i("11", "下一首的活动类>>" + checkMusicNumber);
activityBroadcastReceiver(ACTIVITY_NEXT_CLICK,
"activity_next_click_music", blankString, checkMusicNumber,
true);
} else {
Toast.makeText(this, "已经是最后一个了", 0).show();
naexClickNumb = fileName.size();
}
}

/**
* 刷新进度条和文本书的时间
*
* @author Administrator
*
*/
public class MusicRefrshTime implements Runnable {

public void run() {
while (timeSwitch) {
if (mIMusicService != null) {

mHander.post(new Runnable() {
public void run() {

mAllNotifiTime = mIMusicService.iAllTimeMusic();
mCurrentNotifiTime = mIMusicService
.iCurrentTimeMusic();

mSeekBar.setMax(mAllNotifiTime);
mSeekBar.setProgress(mCurrentNotifiTime);

// 设置总的时间
int allTimePoint = (mAllNotifiTime / 1000) / 60;
int allTimeSec = (mAllNotifiTime / 1000) % 60;
if (allTimePoint < 10 && allTimeSec < 10) {
mAllTimeText.setText("0" + allTimePoint + ":0"
+ allTimeSec);
} else if (allTimePoint < 10 && allTimeSec >= 10) {
mAllTimeText.setText("0" + allTimePoint + ":"
+ allTimeSec);
} else if (allTimePoint > 10 && allTimeSec < 10) {
mAllTimeText.setText(allTimePoint + ":0"
+ allTimeSec);
} else if (allTimePoint > 10 && allTimeSec >= 10) {
mAllTimeText.setText(allTimePoint + ":0"
+ allTimeSec);
}

// 设置当前的时间
int currentPoint = (mCurrentNotifiTime / 1000) / 60;
int currentSec = (mCurrentNotifiTime / 1000) % 60;
if (currentPoint < 10 && currentSec < 10) {
mCurrentTimeText.setText("0" + currentPoint
+ ":0" + currentSec);
} else if (currentPoint < 10 && currentSec >= 10) {
mCurrentTimeText.setText("0" + currentPoint
+ ":" + currentSec);
} else if (currentPoint > 10 && currentSec < 10) {
mCurrentTimeText.setText(currentPoint + ":0"
+ currentSec);
} else if (currentPoint > 10 && currentSec >= 10) {
mCurrentTimeText.setText(currentPoint + ":"
+ currentSec);
}

//							if (allTimePoint == currentPoint
//									&& allTimeSec == currentSec) {
//								nextMusic(checkMusicNumber);
//							}

}
});
try {
// 设置刷新的时间
Thread.sleep(1000 - (mCurrentNotifiTime % 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}

// ------------进度条的控制---------------
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// fromUser判断是用户改变的滑块的值,拖动SeekBar的监听并响应
if (fromUser == true && mIMusicService != null) {
mIMusicService.iSeekBarcheck(progress);
}
}

// 该方法拖动进度条开始拖动的时候调用。
public void onStartTrackingTouch(SeekBar seekBar) {

}

// 该方法拖动进度条停止拖动的时候调用
public void onStopTrackingTouch(SeekBar seekBar) {

}

/**
* 界面点击上一首、(暂停、播放)、下/上一首发广播专用,暂停专用, (广播名、接收具体的对应,数组中已经跳到第几曲歌的下标,暂停按钮专用) 例如:
* activityBroadcastReceiver
* (ACTIVITY_NEXT_CLICK,"activity_next_click_music"
* ,str,checkMusicNumber,true); 你要传不同的参数时,就需要不同的标签,否则会被覆盖
*/
public void activityBroadcastReceiver(String activityBroadcast,
String upAndNextClickLable, String startAndSuspend,
int activityClickNumber, boolean temp) {

Intent activityBroadcastIntent = new Intent(activityBroadcast);
activityBroadcastIntent.putExtra(upAndNextClickLable,
activityClickNumber);
activityBroadcastIntent.putExtra(startAndSuspend, temp);
sendBroadcast(activityBroadcastIntent);
}

// -----------注册接收通知的广播---------------
public final String ACTION_UP_MUSIC = "com.kugou.up_music";
public final String ACTION_START_SUSPEND_MUSIC = "com.kugou.start_suspend_music";
public final String ACTION_NEXT_MUSIC = "com.kugou.next_music";

/**
* 接收广播改变音乐的名字和下面暂停、开始的 按钮的图片
*/
BroadcastReceiver notifiReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(ACTION_UP_MUSIC)) {// 上一首
int notifiUpTime = intent
.getIntExtra("UP_MUSIC_TIME_NOTIFI", 0);
// 设置title上面显示的名字
mDivicionUpName = divisionMusicName(sdcardMusicName
.get(notifiUpTime));
// Title处显示当前播放歌曲的名字
mTitleMusicNameText.setText(mDivicionUpName);
checkMusicNumber = notifiUpTime;
} else if (action.equals(ACTION_START_SUSPEND_MUSIC)) {

boolean notifiSwitch = intent.getBooleanExtra(
"SWITCH_START_SUSPEND_NOTIFI", false);
startORsuspendMusic(!notifiSwitch);

} else if (action.equals(ACTION_NEXT_MUSIC)) {// 下一首
int notifiNextTime = intent.getIntExtra(
"NEXT_MUSIC_TIME_NOTIFI", 0);
// 设置title上面显示的名字
mDivicionNextName = divisionMusicName(sdcardMusicName
.get(notifiNextTime));
mTitleMusicNameText.setText(mDivicionNextName);
checkMusicNumber = notifiNextTime;// 再一次赋值,更新
}
}
};

protected void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_UP_MUSIC);// 通知的 上一首
filter.addAction(ACTION_START_SUSPEND_MUSIC);// 通知的 暂停、开始
filter.addAction(ACTION_NEXT_MUSIC);// 通知的下一首

registerReceiver(notifiReceiver, filter);

};

protected void onPause() {
super.onPause();
if (notifiReceiver != null) {
unregisterReceiver(notifiReceiver);
notifiReceiver = null;
}
}

}

我把通知放到了服务里面:

 

public class MusicService extends Service {
NotificationManager manger;
int notifinumber = 1;// 版本更新用
// --------动态注册广播>>通知的广播--------------
public final String ACTION_UP_MUSIC = "com.kugou.up_music";
public final String ACTION_START_SUSPEND_MUSIC = "com.kugou.start_suspend_music";
public final String ACTION_NEXT_MUSIC = "com.kugou.next_music";
public final String ACTION_CLEAN_NOTIFICATION = "com.kugou.clean_notification";
// -----------活动发出的广播----------
public final String ACTIVITY_UP_CLICK = "com.kugou.activity.up_click_musicbtn";
public final String ACTIVITY_NEXT_CLICK = "com.kugou.activity.next_click_musicbtn";
public final String ACTIVITY_START_AND_SUSPEND_CLICK = "com.kugou.activity.start_and_suspend_click_musicbtn";
public final String ACTIVITY_LISTVIEW_CLICK = "com.kugou.activity.listView_click_musicbtn";

private ArrayList<MusicWayBean> musicBeanList;// 接收带有地址和名字的数组
private int checknumber;// 接收传递点击的那一项,也可以作为每次点击更换的当前选值

private MediaPlayer mediaPlay = new MediaPlayer();
private MusicWayBean mBeanMusicList;
private String musicPath;
private String musicName;
private boolean mNitifiSwitch = false;

/**
* 定义上一首、下一首、暂停,开始的接口
*/
public interface ICopyMusicService {
/**
* 上一首歌曲
*/
public void iUpMusic(String upmusic);

/**
* 下一首歌曲
*/
public void iNextMusic(String nextmusic);

/**
* 暂停、播放歌曲
*/
public boolean iStartAndSuspendMusic();

/**
* 返回当前歌曲的总时间
*/
public int iAllTimeMusic();

/**
* 返回当前歌曲的正在播放时间
*/
public int iCurrentTimeMusic();

/**
* 进度条拖动的时间监听
*/
public void iSeekBarcheck(int checknumb);
}

/**
* 实现自己定义的接口和binder对象
*/

public class MusicBinderService extends Binder implements ICopyMusicService {

public void iUpMusic(String upmusic) {
musicMediaPlayerPrepare(upmusic);

}

public void iNextMusic(String nextmusic) {
musicMediaPlayerPrepare(nextmusic);

}

public boolean iStartAndSuspendMusic() {
return startAndSuspendMusic();
}

public int iAllTimeMusic() {
if (mediaPlay != null) {
return mediaPlay.getDuration();
} else {
return 0;
}
}

public int iCurrentTimeMusic() {
if (mediaPlay != null) {
return mediaPlay.getCurrentPosition();
} else {
return 0;
}

}

public void iSeekBarcheck(int checkNumb) {
seekBarCheck(checkNumb);

}

}

MusicBinderService mMusicBinderService = new MusicBinderService();

public void onCreate() {
super.onCreate();

}

public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null) {
mediaPlay.reset();

IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_UP_MUSIC);// 通知的上一首
filter.addAction(ACTION_START_SUSPEND_MUSIC);// 通知的 暂停、开始
filter.addAction(ACTION_NEXT_MUSIC);// 通知的下一首
filter.addAction(ACTION_CLEAN_NOTIFICATION);// 通知的 清除通知

filter.addAction(ACTIVITY_UP_CLICK);// 活动类发广播的上一首
filter.addAction(ACTIVITY_START_AND_SUSPEND_CLICK);// 活动类发广播的暂停、开始广播
filter.addAction(ACTIVITY_NEXT_CLICK);// 活动发广播的下一首
filter.addAction(ACTIVITY_LISTVIEW_CLICK);// 活动发广播的点击ListView播放音乐后

registerReceiver(notifiReceiver, filter);
// createNotification();// 启动 刷新通知
}
return super.onStartCommand(intent, flags, startId);
}

public IBinder onBind(Intent intent) {
return mMusicBinderService;
}

public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}

public void onDestroy() {
super.onDestroy();
if (mediaPlay != null) {
if (mediaPlay.isPlaying()) {
mediaPlay.stop();
}
mediaPlay.release();
mediaPlay = null;
}

}

/**
* 启动音乐播放器,要恶魔暂停,要么播放
*/

public boolean startAndSuspendMusic() {
if (!mediaPlay.isPlaying()) {
mediaPlay.start();// 播放
return false;
} else {
mediaPlay.pause();// 暂停
return true;
}
}

/**
* 播放器里面歌曲的准备阶段
*/
public void musicMediaPlayerPrepare(String s) {
try {
if (mediaPlay == null) {
mediaPlay = new MediaPlayer();
}
mediaPlay.reset();

mediaPlay.setDataSource(s);
mediaPlay.prepare();
mediaPlay.start();

} catch (IllegalArgumentException e) {
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

public void seekBarCheck(int n) {
mediaPlay.seekTo(n);
}

/**
* 启动一个通知
*/
public void createNotification() {
// ----------------状态上提示消息-----------------
NotificationCompat.Builder builder = new NotificationCompat.Builder(
this);
builder.setSmallIcon(R.drawable.common_m54);
builder.setTicker("欢迎使用播放器");// 任务栏里提示
// builder.setOngoing(true);// 设置为不可清除模式,流氓式通知
// ----------------定义点击通知后能跳转到主界面-----------------
Intent intents = new Intent(this, NewKugouMainActivity.class);
intents.putExtra("nameTimeNotifi", musicName);

PendingIntent pendIntent = PendingIntent.getActivity(this, 11, intents,
PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pendIntent);

// ------自定义notification界面
RemoteViews remoteView = new RemoteViews(getPackageName(),
R.layout.activity_kugou_music_notificstion_layout);
// -----------自定义通知按钮的监听,通过广播来执行-----------------

// ----------------通知的音乐名字更改-----------------

// remoteView.setTextViewText(R.id.notification_music_name_text,
// "酷狗音乐播放器");

remoteView
.setTextViewText(R.id.notification_music_name_text, musicName);

// ----------------上一首按钮-----------------
Intent upMusicIntent = new Intent(ACTION_UP_MUSIC);
if (checknumber == 0) {
upMusicIntent.putExtra("UP_MUSIC_TIME_NOTIFI", checknumber);
} else {
upMusicIntent.putExtra("UP_MUSIC_TIME_NOTIFI", checknumber - 1);
}
PendingIntent pendUpMusic = PendingIntent.getBroadcast(this, 2,
upMusicIntent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteView.setOnClickPendingIntent(R.id.notification_music_up_btn,
pendUpMusic);
// ----------------下一首按钮-----------------

Intent nextMusicIntent = new Intent(ACTION_NEXT_MUSIC);

if (checknumber < musicBeanList.size() - 1) {
nextMusicIntent.putExtra("NEXT_MUSIC_TIME_NOTIFI", checknumber + 1);
} else {
nextMusicIntent.putExtra("NEXT_MUSIC_TIME_NOTIFI", checknumber);
}
PendingIntent pendNextMusic = PendingIntent.getBroadcast(this, 2,
nextMusicIntent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteView.setOnClickPendingIntent(R.id.notification_next_btn,
pendNextMusic);
// ----------------暂停、开始按钮-----------------
Intent startAndSuspendMusicIntent = new Intent(
ACTION_START_SUSPEND_MUSIC);
startAndSuspendMusicIntent.putExtra("SWITCH_START_SUSPEND_NOTIFI",
mNitifiSwitch);
PendingIntent pendStartAndSuspendMusic = PendingIntent.getBroadcast(
this, 2, startAndSuspendMusicIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
// -----------更换暂停、播放的按钮背景图片------------
if (mediaPlay.isPlaying()) {
remoteView.setImageViewResource(
R.id.notification_music_start_suspend_btn,
R.drawable.minilyric_pause_button_press);
} else {
remoteView.setImageViewResource(
R.id.notification_music_start_suspend_btn,
R.drawable.minilyric_play_button_press);
}
remoteView.setOnClickPendingIntent(
R.id.notification_music_start_suspend_btn,
pendStartAndSuspendMusic);
// ----------------移除广播按钮-----------------
Intent cleanNotifiIntent = new Intent(ACTION_CLEAN_NOTIFICATION);
PendingIntent pendcleanNotifiMusic = PendingIntent.getBroadcast(this,
2, cleanNotifiIntent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteView.setOnClickPendingIntent(R.id.notification_destroy_btn,
pendcleanNotifiMusic);

builder.setContent(remoteView);
// -----------自定义通知的更新-----------------

manger = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manger.notify(notifinumber, builder.build());

}

BroadcastReceiver notifiReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(ACTION_UP_MUSIC)) {
// 服务里面的通知广播----上一首
if (checknumber - 1 < 0) {// 数组从0开始计数
checknumber = 0;// 再一次赋值,更新
} else {
musicPath = musicBeanList.get(checknumber - 1)
.getMusicPathBean();
musicName = musicBeanList.get(checknumber - 1)
.getMusicNameBean();

musicMediaPlayerPrepare(musicPath);
checknumber = checknumber - 1;// 再一次赋值,更新
createNotification();
}

} else if (action.equals(ACTION_START_SUSPEND_MUSIC)) {
// 服务里面的通知广播----播放、暂停
musicName = musicBeanList.get(checknumber).getMusicNameBean();
Log.i("11", "刷新前>>>" + musicName);
mNitifiSwitch = startAndSuspendMusic();
createNotification();

} else if (action.equals(ACTION_NEXT_MUSIC)) {
// 服务里面的通知广播----下一首

Log.i("11", "下一首提提前的值>>" + checknumber);
if (checknumber + 1 < musicBeanList.size()) {// 数组从0开始计数
musicPath = musicBeanList.get(checknumber + 1)
.getMusicPathBean();
musicName = musicBeanList.get(checknumber + 1)
.getMusicNameBean();
musicMediaPlayerPrepare(musicPath);

checknumber = checknumber + 1;// 再一次赋值,更新
createNotification();
} else {
checknumber = musicBeanList.size();
}

} else if (action.equals(ACTION_CLEAN_NOTIFICATION)) {
// 服务里面的通知广播----清除通知
manger.cancel(notifinumber);
} else if (action.equals(ACTIVITY_UP_CLICK)) {
// Activity类里面的通知广播----上一首
int activiUpClickNumb = intent.getIntExtra(
"activity_up_click_music", 0);
checknumber = activiUpClickNumb;
if (checknumber > 0) {
musicName = musicBeanList.get(checknumber - 1)
.getMusicNameBean();
createNotification();
}
} else if (action.equals(ACTIVITY_NEXT_CLICK)) {
// Activity类里面的通知广播----下一首
int activiNextClickNumb = intent.getIntExtra(
"activity_next_click_music", 0);

checknumber = activiNextClickNumb;
musicName = musicBeanList.get(checknumber).getMusicNameBean();
Log.i("11", "活动类下一首广播》》名字>>" + musicName);
createNotification();
} else if (action.equals(ACTIVITY_START_AND_SUSPEND_CLICK)) {
// Activity类里面的通知广播----播放、暂停
mNitifiSwitch = intent.getBooleanExtra(
"activity_startandsuspend_click_music", true);
createNotification();
} else if (action.equals(ACTIVITY_LISTVIEW_CLICK)) {
Log.i("11", "服务接收活动里的>>>>LISTVIEW的广播");
checknumber = intent.getIntExtra("LIST_V_CLICK_POSITON", 0);
musicBeanList = intent
.getParcelableArrayListExtra("LIST_V_CLICK_MUSICLIST");

mBeanMusicList = musicBeanList.get(checknumber);

musicPath = mBeanMusicList.getMusicPathBean();
musicName = mBeanMusicList.getMusicNameBean();

Log.i("11", musicPath);

musicMediaPlayerPrepare(musicPath);
createNotification();
}
}
};

}


感觉绕的地方应该是:自己定的那个计数器,就是随时更改播放的是ListView中哪一首,点击每个按钮都会发广播取改变那个值,然后点击之后,又要改变值.最好是提前用个白纸可以写下来,哪些地方会用到更改值,如果你运气不好,我估计会绕死在里面,现在还有一个BUG就是,点击通知进去的时候,进度条两边的时间不是想要的,也不能显示歌曲的名字(歌曲名字很好解决),但是当通知里面的那首歌曲播放到下一首,界面的进度条时间就会正常显示。通知的那个右上角X,在彻底销毁界面后也没有反应。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: