RyCarPlayer/app/src/main/java/com/zlm/hp/service/AudioPlayerService.java
如果当时 3d55b0914c #### 2022-02-13 V7.0.5
- *.[改进]启动软件时自动播放歌曲。
- *.[改进]当播放视频时,自动退出歌词界面。
- *.[改进]当播放歌曲时,自动进入歌词或视频界面。
- *.[修复]修复写真图片无法实现随机展现的BUG。
2022-02-13 22:15:53 +08:00

800 lines
31 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.zlm.hp.service;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.AudioManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.Process;
import android.view.View;
import android.widget.RemoteViews;
import com.zlm.hp.async.AsyncHandlerTask;
import com.zlm.hp.constants.ConfigInfo;
import com.zlm.hp.constants.ResourceConstants;
import com.zlm.hp.db.util.AudioInfoDB;
import com.zlm.hp.entity.AudioInfo;
import com.zlm.hp.entity.VideoInfo;
import com.zlm.hp.handler.WeakRefHandler;
import com.zlm.hp.manager.AudioPlayerManager;
import com.zlm.hp.receiver.AudioBroadcastReceiver;
import com.zlm.hp.ui.LocalVideoActivity;
import com.zlm.hp.ui.MainActivity;
import com.zlm.hp.ui.R;
import com.zlm.hp.ui.SearchMVActivity;
import com.zlm.hp.ui.VideoActivity;
import com.zlm.hp.util.AppOpsUtils;
import com.zlm.hp.util.DateUtil;
import com.zlm.hp.util.ImageUtil;
import com.zlm.hp.util.ResourceUtil;
import com.zlm.hp.util.ToastUtil;
import java.io.File;
import java.util.Date;
import tv.danmaku.ijk.media.player.IMediaPlayer;
import tv.danmaku.ijk.media.player.IjkMediaPlayer;
/**
* @Description: 音频服务器
* @param:
* @return:
* @throws
* @author: zhangliangming
* @date: 2018-10-09 21:13
*/
public class AudioPlayerService extends Service {
/**
* 处理ui任务
*/
public WeakRefHandler mUIHandler;
/**
* 子线程用于执行耗时任务
*/
public WeakRefHandler mWorkerHandler;
//创建异步HandlerThread
private HandlerThread mHandlerThread;
private AudioBroadcastReceiver mAudioBroadcastReceiver;
private Context mContext;
/**
* 播放器
*/
private IjkMediaPlayer mMediaPlayer;
/**
* 加载当前播放进度
*/
private final int MESSAGE_WHAT_LOADPLAYPROGRESSDATA = 0;
///////////////////////////////通知栏//////////////////////////////
private int mNotificationPlayBarId = 19900420;
/**
* 状态栏播放器视图
*/
private RemoteViews mNotifyPlayBarRemoteViews;
/**
*
*/
private Notification mPlayBarNotification;
/**
* 焦点
*/
private AudioManager mAudioManager;
//注册OnAudioFocusChangeListener监听
AudioManager.OnAudioFocusChangeListener mOfChangeListener = new AudioManager.OnAudioFocusChangeListener() {
public void onAudioFocusChange(int focusChange) {
if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
} else {
//已经失去音频焦点
if (AudioPlayerManager.newInstance(mContext).getPlayStatus() == AudioPlayerManager.PLAYING) {
AudioPlayerManager.newInstance(mContext).pause();
}
}
}
};
@Override
public void onCreate() {
super.onCreate();
mContext = getApplicationContext();
mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
mAudioBroadcastReceiver = new AudioBroadcastReceiver();
mAudioBroadcastReceiver.setReceiverListener(new AudioBroadcastReceiver.AudioReceiverListener() {
@Override
public void onReceive(Context context, final Intent intent, final int code) {
switch (code) {
case AudioBroadcastReceiver.ACTION_CODE_NOTIFY_PLAY:
if (getCurAudioInfo() != null) {
AudioPlayerManager.newInstance(mContext).play(getCurAudioInfo().getPlayProgress());
}
break;
case AudioBroadcastReceiver.ACTION_CODE_NOTIFY_PAUSE:
if (getCurAudioInfo() != null) {
AudioPlayerManager.newInstance(mContext).pause();
}
break;
case AudioBroadcastReceiver.ACTION_CODE_NOTIFY_NEXT:
AudioPlayerManager.newInstance(mContext).next();
break;
case AudioBroadcastReceiver.ACTION_CODE_NOTIFY_PRE:
AudioPlayerManager.newInstance(mContext).pre();
break;
case AudioBroadcastReceiver.ACTION_CODE_NOTIFY_UNLOCK:
ConfigInfo configInfo = ConfigInfo.obtain();
configInfo.setDesktopLrcCanMove(true).save();
case AudioBroadcastReceiver.ACTION_CODE_NOTIFY_LOCK:
case AudioBroadcastReceiver.ACTION_CODE_NOTIFY_DESLRC:
mUIHandler.post(new Runnable() {
@Override
public void run() {
doNotification(null, code, false);
}
});
break;
case AudioBroadcastReceiver.ACTION_CODE_NOTIFY_DESLRC_SHOW_ACTION:
if (!AppOpsUtils.allowFloatWindow(getApplication())) {
//没有权限
mUIHandler.post(new Runnable() {
@Override
public void run() {
ToastUtil.showTextToast(getApplicationContext(), getString(R.string.desktoplrc_tip));
}
});
}
break;
case AudioBroadcastReceiver.ACTION_CODE_NULL:
case AudioBroadcastReceiver.ACTION_CODE_PLAY:
case AudioBroadcastReceiver.ACTION_CODE_STOP:
if (code == AudioBroadcastReceiver.ACTION_CODE_STOP) {
//更新暂停时的进度
if (mMediaPlayer != null) {
AudioInfo curAudioInfo = getCurAudioInfo();
if (curAudioInfo != null)
curAudioInfo.setPlayProgress((int) mMediaPlayer.getCurrentPosition());
}
releasePlayer();
}
mUIHandler.post(new Runnable() {
@Override
public void run() {
doNotification(null, code, false);
}
});
break;
case AudioBroadcastReceiver.ACTION_CODE_NOTIFY_SINGERICONLOADED:
//
Bundle notifySingerLoadedBundle = intent.getBundleExtra(AudioBroadcastReceiver.ACTION_BUNDLEKEY);
final AudioInfo curAudioInfo = notifySingerLoadedBundle.getParcelable(AudioBroadcastReceiver.ACTION_DATA_KEY);
if (curAudioInfo != null && getCurAudioInfo() != null && curAudioInfo.getHash().equals(getCurAudioInfo().getHash())) {
mUIHandler.post(new Runnable() {
@Override
public void run() {
doNotification(curAudioInfo, code, false);
}
});
}
break;
case AudioBroadcastReceiver.ACTION_CODE_INIT:
Bundle initBundle = intent.getBundleExtra(AudioBroadcastReceiver.ACTION_BUNDLEKEY);
final AudioInfo initAudioInfo = initBundle.getParcelable(AudioBroadcastReceiver.ACTION_DATA_KEY);
mUIHandler.post(new Runnable() {
@Override
public void run() {
doNotification(initAudioInfo, code, false);
}
});
break;
//播放网络歌曲
case AudioBroadcastReceiver.ACTION_CODE_SERVICE_PLAYNETSONG:
//播放本地歌曲
case AudioBroadcastReceiver.ACTION_CODE_SERVICE_PLAYLOCALSONG:
mWorkerHandler.post(new Runnable() {
@Override
public void run() {
Bundle bundle = intent.getBundleExtra(AudioBroadcastReceiver.ACTION_BUNDLEKEY);
AudioInfo audioInfo = bundle.getParcelable(AudioBroadcastReceiver.ACTION_DATA_KEY);
handleSong(audioInfo);
}
});
break;
}
}
});
mAudioBroadcastReceiver.registerReceiver(mContext);
//创建ui handler
mUIHandler = new WeakRefHandler(Looper.getMainLooper(), this, new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
handleUIMessage(msg);
return true;
}
});
//创建异步HandlerThread
mHandlerThread = new HandlerThread("AudioPlayerServiceThread", Process.THREAD_PRIORITY_BACKGROUND);
//必须先开启线程
mHandlerThread.start();
//子线程Handler
mWorkerHandler = new WeakRefHandler(mHandlerThread.getLooper(), this, new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
handleWorkerMessage(msg);
return true;
}
});
//初始化通知栏
initNotificationView();
bindNotificationEvent();
loadNotificationData();
}
/**
*
*/
private void loadNotificationData() {
//加载数据
ConfigInfo configInfo = ConfigInfo.obtain();
AudioInfo audioInfo = AudioPlayerManager.newInstance(mContext).getCurSong(configInfo.getPlayHash());
if (audioInfo != null) {
doNotification(audioInfo, AudioBroadcastReceiver.ACTION_CODE_INIT, true);
} else {
doNotification(audioInfo, AudioBroadcastReceiver.ACTION_CODE_NULL, false);
}
}
/**
* @param msg
*/
private void handleWorkerMessage(Message msg) {
switch (msg.what) {
case MESSAGE_WHAT_LOADPLAYPROGRESSDATA:
if (getCurAudioInfo() != null && mMediaPlayer != null && mMediaPlayer.isPlaying()) {
getCurAudioInfo().setPlayProgress((int) mMediaPlayer.getCurrentPosition());
AudioBroadcastReceiver.sendPlayingReceiver(mContext, getCurAudioInfo());
}
//
mWorkerHandler.sendEmptyMessageDelayed(MESSAGE_WHAT_LOADPLAYPROGRESSDATA, 1000);
break;
}
}
/**
* @param msg
*/
private void handleUIMessage(Message msg) {
}
/**
*
*/
private void bindNotificationEvent() {
Intent buttonplayIntent = AudioBroadcastReceiver.getNotifiyIntent(AudioBroadcastReceiver.ACTION_CODE_NOTIFY_PLAY);
PendingIntent pendplayButtonIntent = PendingIntent.getBroadcast(
AudioPlayerService.this, AudioBroadcastReceiver.ACTION_CODE_NOTIFY_PLAY, buttonplayIntent, PendingIntent.FLAG_CANCEL_CURRENT);
mNotifyPlayBarRemoteViews.setOnClickPendingIntent(R.id.play,
pendplayButtonIntent);
Intent buttonpauseIntent = AudioBroadcastReceiver.getNotifiyIntent(AudioBroadcastReceiver.ACTION_CODE_NOTIFY_PAUSE);
PendingIntent pendpauseButtonIntent = PendingIntent.getBroadcast(
AudioPlayerService.this, AudioBroadcastReceiver.ACTION_CODE_NOTIFY_PAUSE, buttonpauseIntent, PendingIntent.FLAG_CANCEL_CURRENT);
mNotifyPlayBarRemoteViews.setOnClickPendingIntent(R.id.pause,
pendpauseButtonIntent);
Intent buttonnextIntent = AudioBroadcastReceiver.getNotifiyIntent(AudioBroadcastReceiver.ACTION_CODE_NOTIFY_NEXT);
PendingIntent pendnextButtonIntent = PendingIntent.getBroadcast(
AudioPlayerService.this, AudioBroadcastReceiver.ACTION_CODE_NOTIFY_NEXT, buttonnextIntent, PendingIntent.FLAG_CANCEL_CURRENT);
mNotifyPlayBarRemoteViews.setOnClickPendingIntent(R.id.next,
pendnextButtonIntent);
Intent buttonprewtIntent = AudioBroadcastReceiver.getNotifiyIntent(AudioBroadcastReceiver.ACTION_CODE_NOTIFY_PRE);
PendingIntent pendprewButtonIntent = PendingIntent.getBroadcast(
AudioPlayerService.this, AudioBroadcastReceiver.ACTION_CODE_NOTIFY_PRE, buttonprewtIntent, PendingIntent.FLAG_CANCEL_CURRENT);
mNotifyPlayBarRemoteViews.setOnClickPendingIntent(R.id.prew,
pendprewButtonIntent);
// 设置歌词显示状态和解锁歌词
Intent buttonDesLrcUnlockIntent = AudioBroadcastReceiver.getNotifiyIntent(AudioBroadcastReceiver.ACTION_CODE_NOTIFY_UNLOCK);
PendingIntent pendDesLrcUnlockIntent = PendingIntent.getBroadcast(
AudioPlayerService.this, AudioBroadcastReceiver.ACTION_CODE_NOTIFY_UNLOCK, buttonDesLrcUnlockIntent, PendingIntent.FLAG_CANCEL_CURRENT);
mNotifyPlayBarRemoteViews.setOnClickPendingIntent(R.id.deslrcUnlock,
pendDesLrcUnlockIntent);
Intent buttonDesLrcHideIntent = AudioBroadcastReceiver.getNotifiyIntent(AudioBroadcastReceiver.ACTION_CODE_NOTIFY_DESLRC_HIDE_ACTION);
PendingIntent pendDesLrcHideIntent = PendingIntent.getBroadcast(
AudioPlayerService.this, AudioBroadcastReceiver.ACTION_CODE_NOTIFY_DESLRC_HIDE_ACTION, buttonDesLrcHideIntent, PendingIntent.FLAG_CANCEL_CURRENT);
mNotifyPlayBarRemoteViews.setOnClickPendingIntent(R.id.showdeslrc,
pendDesLrcHideIntent);
Intent buttonDesLrcShowIntent = AudioBroadcastReceiver.getNotifiyIntent(AudioBroadcastReceiver.ACTION_CODE_NOTIFY_DESLRC_SHOW_ACTION);
PendingIntent pendDesLrcShowIntent = PendingIntent.getBroadcast(
AudioPlayerService.this, AudioBroadcastReceiver.ACTION_CODE_NOTIFY_DESLRC_SHOW_ACTION, buttonDesLrcShowIntent, PendingIntent.FLAG_CANCEL_CURRENT);
mNotifyPlayBarRemoteViews.setOnClickPendingIntent(R.id.hidedeslrc,
pendDesLrcShowIntent);
}
/**
* 处理通知栏视图
*/
private void doNotification(AudioInfo audioInfo, int code, boolean isFristToLoadIcon) {
ConfigInfo configInfo = ConfigInfo.obtain();
if (configInfo.isShowDesktopLrc()) {
if (configInfo.isDesktopLrcCanMove()) {
mNotifyPlayBarRemoteViews.setViewVisibility(R.id.showdeslrc,
View.VISIBLE);
mNotifyPlayBarRemoteViews.setViewVisibility(R.id.hidedeslrc,
View.INVISIBLE);
mNotifyPlayBarRemoteViews.setViewVisibility(
R.id.deslrcUnlock, View.INVISIBLE);
} else {
mNotifyPlayBarRemoteViews.setViewVisibility(
R.id.deslrcUnlock, View.VISIBLE);
mNotifyPlayBarRemoteViews.setViewVisibility(R.id.hidedeslrc,
View.INVISIBLE);
mNotifyPlayBarRemoteViews.setViewVisibility(R.id.showdeslrc,
View.INVISIBLE);
}
} else {
mNotifyPlayBarRemoteViews.setViewVisibility(R.id.hidedeslrc,
View.VISIBLE);
mNotifyPlayBarRemoteViews.setViewVisibility(R.id.showdeslrc,
View.INVISIBLE);
mNotifyPlayBarRemoteViews.setViewVisibility(R.id.deslrcUnlock,
View.INVISIBLE);
}
switch (code) {
case AudioBroadcastReceiver.ACTION_CODE_NULL:
//无歌曲
mNotifyPlayBarRemoteViews.setImageViewResource(R.id.singPic,
R.mipmap.bpz);// 显示专辑封面图片
mNotifyPlayBarRemoteViews.setTextViewText(R.id.titleName,
getString(R.string.def_text));
mNotifyPlayBarRemoteViews.setViewVisibility(R.id.play,
View.VISIBLE);
mNotifyPlayBarRemoteViews.setViewVisibility(R.id.pause,
View.INVISIBLE);
break;
case AudioBroadcastReceiver.ACTION_CODE_INIT:
//初始化
String titleName = audioInfo.getTitle();
mNotifyPlayBarRemoteViews.setTextViewText(R.id.titleName,
titleName);
//刚启动通知栏需要加载歌手图标
if (isFristToLoadIcon) {
//加载歌手头像
Bitmap curbm = ImageUtil.getNotifiIcon(mContext, audioInfo.getSingerName(), 400, 400, new AsyncHandlerTask(mUIHandler, mWorkerHandler));
if (curbm != null) {
mNotifyPlayBarRemoteViews.setImageViewBitmap(
R.id.singPic, curbm);// 显示专辑封面图片
}
} else {
mNotifyPlayBarRemoteViews.setImageViewResource(R.id.singPic,
R.mipmap.bpz);// 显示专辑封面图片
}
mNotifyPlayBarRemoteViews.setViewVisibility(R.id.play,
View.VISIBLE);
mNotifyPlayBarRemoteViews.setViewVisibility(R.id.pause,
View.INVISIBLE);
break;
case AudioBroadcastReceiver.ACTION_CODE_PLAY:
//播放
mNotifyPlayBarRemoteViews.setViewVisibility(R.id.play,
View.INVISIBLE);
mNotifyPlayBarRemoteViews.setViewVisibility(R.id.pause,
View.VISIBLE);
break;
case AudioBroadcastReceiver.ACTION_CODE_STOP:
//暂停
mNotifyPlayBarRemoteViews.setViewVisibility(R.id.play,
View.VISIBLE);
mNotifyPlayBarRemoteViews.setViewVisibility(R.id.pause,
View.INVISIBLE);
break;
case AudioBroadcastReceiver.ACTION_CODE_NOTIFY_SINGERICONLOADED:
//加载歌手头像
Bitmap cbbm = ImageUtil.getNotifiIcon(mContext, audioInfo.getSingerName(), 400, 400, new AsyncHandlerTask(mUIHandler, mWorkerHandler));
if (cbbm != null) {
mNotifyPlayBarRemoteViews.setImageViewBitmap(
R.id.singPic, cbbm);// 显示专辑封面图片
}
break;
}
mPlayBarNotification.contentView = mNotifyPlayBarRemoteViews;
startForeground(mNotificationPlayBarId, mPlayBarNotification);
}
/**
* 初始化通知栏
*/
private void initNotificationView() {
String tickerText = getString(R.string.def_artist);
//判断系统版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// 通知渠道的id
String CHANNEL_ID = "hp_channel";
String CHANNEL_NAME = "hp";
if (notificationManager.getNotificationChannel(CHANNEL_ID) == null) {
int importance = NotificationManager.IMPORTANCE_LOW;
NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, importance);
mChannel.enableLights(true);
notificationManager.createNotificationChannel(mChannel);
}
// Create a notification and set the notification channel.
mPlayBarNotification = new Notification.Builder(getApplicationContext())
.setContentTitle(tickerText)
.setContentText(getString(R.string.def_songName))
.setSmallIcon(R.mipmap.ic_launcher_foreground)
.setChannelId(CHANNEL_ID)
.setVisibility(Notification.VISIBILITY_PUBLIC)
.build();
} else {
//android5.0修改通知栏图标
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mPlayBarNotification = new Notification.Builder(getApplicationContext())
.setContentTitle(tickerText)
.setContentText(getString(R.string.def_songName))
.setSmallIcon(R.mipmap.ic_launcher_foreground)
.setVisibility(Notification.VISIBILITY_PUBLIC)
.build();
} else {
// Create a notification and set the notification channel.
mPlayBarNotification = new Notification.Builder(getApplicationContext())
.setContentTitle(tickerText)
.setContentText(getString(R.string.def_songName))
.setSmallIcon(R.mipmap.ic_launcher)
.build();
}
}
// FLAG_AUTO_CANCEL 该通知能被状态栏的清除按钮给清除掉
// FLAG_NO_CLEAR 该通知不能被状态栏的清除按钮给清除掉
// FLAG_ONGOING_EVENT 通知放置在正在运行
// FLAG_INSISTENT 是否一直进行,比如音乐一直播放,知道用户响应
mPlayBarNotification.flags |= Notification.FLAG_ONGOING_EVENT;
// mNotification.flags |= Notification.FLAG_NO_CLEAR;
// DEFAULT_ALL 使用所有默认值,比如声音,震动,闪屏等等
// DEFAULT_LIGHTS 使用默认闪光提示
// DEFAULT_SOUND 使用默认提示声音
// DEFAULT_VIBRATE 使用默认手机震动,需加上<uses-permission
// android:name="android.permission.VIBRATE" />权限
// mNotification.defaults = Notification.DEFAULT_SOUND;
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClass(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
PendingIntent pendingIntent = PendingIntent
.getActivity(this, 0, intent,
PendingIntent.FLAG_CANCEL_CURRENT);
mPlayBarNotification.contentIntent = pendingIntent;
mNotifyPlayBarRemoteViews = new RemoteViews(getPackageName(),
R.layout.layout_notify);
}
@Override
public void onDestroy() {
super.onDestroy();
if (mAudioManager != null)
mAudioManager.abandonAudioFocus(mOfChangeListener);
releaseHandle();
releasePlayer();
//关闭通知栏
stopForeground(true);
mAudioBroadcastReceiver.unregisterReceiver(mContext);
}
private void releaseHandle() {
//移除队列任务
if (mUIHandler != null) {
mUIHandler.removeCallbacksAndMessages(null);
}
//移除队列任务
if (mWorkerHandler != null) {
mWorkerHandler.removeCallbacksAndMessages(null);
}
//关闭线程
if (mHandlerThread != null)
mHandlerThread.quit();
}
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
/**
* 处理歌曲
*
* @param audioInfo
*/
private void handleSong(final AudioInfo audioInfo) {
//在播放的时候为AudioManager添加获取焦点的监听
mAudioManager.requestAudioFocus(mOfChangeListener,
AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN);
//添加到最近播放列表中去
if (AudioInfoDB.isRecentAudioExists(mContext, audioInfo.getHash())) {
AudioInfoDB.updateRecentAudio(mContext, audioInfo.getHash(), DateUtil.parseDateToString(new Date()));
} else {
AudioInfoDB.addRecentAudio(mContext, audioInfo,true);
}
try {
String fileName = audioInfo.getTitle();
//String filePath = ResourceUtil.getFilePath(mContext, ResourceConstants.PATH_AUDIO, fileName + "." + audioInfo.getFileExt());
String filePath =audioInfo.getFilePath();
String MvPath=audioInfo.getMvPath();
ConfigInfo configInfo = ConfigInfo.obtain();
//region 自动选择是否播放MV
if(audioInfo.getPlayProgress()==0) {
int MVPlayMode = configInfo.getMVPlayMode();
boolean isPlayMV = false;
if (MVPlayMode == 1) {
isPlayMV = true;
} else if (MVPlayMode == 2) {
int randomnum = (int) (Math.random() * 100);
if (randomnum > 40) { //一半的几率选择播放MV
isPlayMV = true;
}
}
audioInfo.setIsPlayMV(isPlayMV);
if ((isPlayMV && MvPath != null) || filePath == null || filePath.isEmpty()) { //如果会播放MV则进入下一步操作
File MVFile = new File(MvPath);
if (MVFile.exists()) //如果MV文件存在,则进行MV
{
//打开视频界面
Intent intent = new Intent(AudioPlayerService.this, LocalVideoActivity.class);
intent.putExtra(VideoInfo.DATA_KEY, audioInfo);
startUserActivity(intent);
return;
}
}
}
//endregion
File audioFile = new File(filePath);
if (!audioFile.exists()) {
//filePath = ResourceUtil.getFilePath(mContext, ResourceConstants.PATH_CACHE_AUDIO, audioInfo.getHash() + ".temp");
}
if (mMediaPlayer != null) {
releasePlayer();
}
mMediaPlayer = new IjkMediaPlayer();
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setDataSource(filePath);
mMediaPlayer.prepareAsync();
mMediaPlayer.setOnSeekCompleteListener(new IMediaPlayer.OnSeekCompleteListener() {
@Override
public void onSeekComplete(IMediaPlayer mp) {
//发送播放中广播
AudioBroadcastReceiver.sendPlayReceiver(mContext, audioInfo);
mWorkerHandler.removeMessages(MESSAGE_WHAT_LOADPLAYPROGRESSDATA);
mWorkerHandler.sendEmptyMessage(MESSAGE_WHAT_LOADPLAYPROGRESSDATA);
mMediaPlayer.start();
}
});
mMediaPlayer.setOnCompletionListener(new IMediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(IMediaPlayer mp) {
if (audioInfo.getType() == AudioInfo.TYPE_NET && mMediaPlayer.getCurrentPosition() < (audioInfo.getDuration() - 2 * 1000)) {
releasePlayer();
//网络歌曲未播放全部,需要重新调用播放歌曲
handleSong(audioInfo);
} else {
releasePlayer();
//播放完成,执行下一首操作
AudioPlayerManager.newInstance(mContext).next();
}
}
});
mMediaPlayer.setOnPreparedListener(new IMediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(IMediaPlayer mp) {
if (audioInfo.getPlayProgress() != 0) {
mMediaPlayer.seekTo(audioInfo.getPlayProgress());
} else {
//发送播放中广播
AudioBroadcastReceiver.sendPlayReceiver(mContext, audioInfo);
mWorkerHandler.removeMessages(MESSAGE_WHAT_LOADPLAYPROGRESSDATA);
mWorkerHandler.sendEmptyMessage(MESSAGE_WHAT_LOADPLAYPROGRESSDATA);
mMediaPlayer.start();
AudioBroadcastReceiver.sendShowLrcViewReceiver(mContext);
}
}
});
mMediaPlayer.setOnErrorListener(new IMediaPlayer.OnErrorListener() {
@Override
public boolean onError(IMediaPlayer mp, int what, int extra) {
handleError();
return false;
}
});
} catch (Exception e) {
e.printStackTrace();
handleError();
}
}
/**
* 启动新的Activity
* @param intent
*/
public void startUserActivity(Intent intent){
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
startActivity(intent);
}
/**
* 处理错误
*/
private void handleError() {
releasePlayer();
ToastUtil.showTextToast(getApplicationContext(), "播放歌曲出错");
// ToastUtil.showTextToast(getApplicationContext(), "播放歌曲出错1秒后播放下一首");
//
//
// new Thread() {
// @Override
// public void run() {
// try {
// Thread.sleep(1000);
//
// //播放完成,执行下一首操作
// AudioPlayerManager.newInstance(mContext).next();
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }
// }.start();
}
/**
* 释放播放器
*/
private void releasePlayer() {
//移除
mWorkerHandler.removeMessages(MESSAGE_WHAT_LOADPLAYPROGRESSDATA);
if (mMediaPlayer != null) {
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.stop();
}
mMediaPlayer.release();
mMediaPlayer = null;
}
System.gc();
}
/**
* 获取当前的播放歌曲
*
* @return
*/
private AudioInfo getCurAudioInfo() {
ConfigInfo configInfo = ConfigInfo.obtain();
return AudioPlayerManager.newInstance(mContext).getCurSong(configInfo.getPlayHash());
}
/**
* 启动服务
*
* @param context
*/
public static void startService(Activity context) {
Intent intent = new Intent(context, AudioPlayerService.class);
context.startService(intent);
}
/**
* 停止服务
*
* @param context
*/
public static void stopService(Activity context) {
Intent intent = new Intent(context, AudioPlayerService.class);
context.stopService(intent);
}
}