我正在用Android创建音乐播放器,但不幸的是Mediaplayer意外停止。为什么?
我正在用Android创建音乐播放器,但不幸的是Mediaplayer意外停止。如果应用程序正在打开,则没有问题。但当应用程序转到后台时,它会停止,而不显示任何日志 有人知道原因是什么吗我正在用Android创建音乐播放器,但不幸的是Mediaplayer意外停止。为什么?,android,service,media-queries,media-player,Android,Service,Media Queries,Media Player,我正在用Android创建音乐播放器,但不幸的是Mediaplayer意外停止。如果应用程序正在打开,则没有问题。但当应用程序转到后台时,它会停止,而不显示任何日志 有人知道原因是什么吗 提前感谢公共类音乐服务扩展服务实现MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener,MediaPlayer.OnCompletionListener{ private boolean checkError = true; public Med
提前感谢公共类音乐服务扩展服务实现MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener,MediaPlayer.OnCompletionListener{
private boolean checkError = true;
public MediaPlayer mPlayer;
private Uri mSongUri;
private Bitmap mSongBitmap;
public static PlayingFragment playingFragment;
private int songDuration;
private ArrayList<Song> mListSongs;
private int SONG_POS = 0;
private final IBinder musicBind = new PlayerBinder();
private final String ACTION_STOP = "com.emptylist.tabplayer.STOP";
private final String ACTION_NEXT = "com.emptylist.tabplayer.NEXT";
private final String ACTION_PREVIOUS = "com.emptylist.tabplayer.PREVIOUS";
private final String ACTION_PAUSE = "com.emptylist.tabplayer.PAUSE";
public static final int STATE_PAUSED = 1;
public static final int STATE_PLAYING = 2;
public int mState = 0;
private static final int REQUEST_CODE_PAUSE = 101;
private static final int REQUEST_CODE_PREVIOUS = 102;
private static final int REQUEST_CODE_NEXT = 103;
private static final int REQUEST_CODE_STOP = 104;
public static int NOTIFICATION_ID = 11;
private Notification.Builder notificationBuilder;
private Notification mNotification;
private SharedPreferences prefs;
private SharedPreferences.Editor editor;
public class PlayerBinder extends Binder {
public MusicService getService() {
Log.d("test", "getService()");
return MusicService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
Log.d("test", "onBind Called ");
return musicBind;
}
@Override
public void onCreate() {
super.onCreate();
mPlayer = new MediaPlayer();
initPlayer();
mPlayer.setOnPreparedListener(this);
mPlayer.setOnCompletionListener(this);
mPlayer.setOnErrorListener(this);
notificationBuilder = new Notification.Builder(getApplicationContext());
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null) {
String action = intent.getAction();
if (!TextUtils.isEmpty(action)) {
if (action.equals(ACTION_PAUSE)) {
playPauseSong();
} else if (action.equals(ACTION_NEXT)) {
nextSong();
} else if (action.equals(ACTION_PREVIOUS)) {
previousSong();
} else if (action.equals(ACTION_STOP)) {
stopSong();
stopSelf();
}
}
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {
mPlayer.stop();
mPlayer.release();
return false;
}
@Override
public void onCompletion(MediaPlayer mp) {
if (checkError == false) {
startSong(mListSongs.get(SONG_POS).getSongUri(), mListSongs.get(SONG_POS).getSongName(), mListSongs.get(SONG_POS).getmSongAlbumArt(), SONG_POS);
checkError = true;
} else {
mPlayer.reset();
try {
if (SONG_POS != mListSongs.size() - 1) {
SONG_POS++;
setSongDetails(SONG_POS);
} else {
SONG_POS = 0;
setSongDetails(SONG_POS);
}
mPlayer.setDataSource(getApplicationContext(), mListSongs.get(SONG_POS).getSongUri());
} catch (Exception e) {
Log.e("MUSIC SERVICE", "Error setting data source", e);
}
mPlayer.prepareAsync();
if (mState == STATE_PLAYING) {
MainActivity.imgPlayPause.setImageResource(R.drawable.pause);
} else
MainActivity.imgPlayPause.setImageResource(R.drawable.play);
editor = getSharedPreferences("MusicPref", MODE_PRIVATE).edit();
editor.putInt("SongPosition", SONG_POS);
editor.putString("SongURI", mListSongs.get(SONG_POS).getSongUri().toString());
editor.commit();
}
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Log.d("EEE", String.valueOf(what) + "," + String.valueOf(extra));
checkError = false;
return false;
}
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
new ProgressUpdater();
}
private void initPlayer() {
mPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.KITKAT) {
try {
Class<?> cMediaTimeProvider = Class.forName("android.media.MediaTimeProvider");
Class<?> cSubtitleController = Class.forName("android.media.SubtitleController");
Class<?> iSubtitleControllerAnchor = Class.forName("android.media.SubtitleController$Anchor");
Class<?> iSubtitleControllerListener = Class.forName("android.media.SubtitleController$Listener");
Constructor constructor = cSubtitleController.getConstructor(new Class[]{Context.class, cMediaTimeProvider, iSubtitleControllerListener});
Object subtitleInstance = constructor.newInstance(getApplicationContext(), null, null);
Field f = cSubtitleController.getDeclaredField("mHandler");
f.setAccessible(true);
try {
f.set(subtitleInstance, new Handler());
} catch (IllegalAccessException e) {
} finally {
f.setAccessible(false);
}
Method setsubtitleanchor = mPlayer.getClass().getMethod("setSubtitleAnchor", cSubtitleController, iSubtitleControllerAnchor);
setsubtitleanchor.invoke(mPlayer, subtitleInstance, null);
//Log.e("", "subtitle is setted :p");
} catch (Exception e) {
}
}
}
public void startSong(Uri songuri, String songName, Bitmap bitmap, int position) {
//Set data & start playing music
setSongDetails(position);
mPlayer.reset();
mState = STATE_PLAYING;
mSongUri = songuri;
mSongBitmap = bitmap;
try {
mPlayer.setDataSource(getApplicationContext(), mSongUri);
} catch (Exception e) {
Log.e("MUSIC SERVICE", "Error setting data source", e);
}
mPlayer.prepareAsync();
if (mState == STATE_PLAYING) {
MainActivity.imgPlayPause.setImageResource(R.drawable.pause);
} else {
MainActivity.imgPlayPause.setImageResource(R.drawable.play);
}
Log.d("EEESonfPOs", String.valueOf(position));
editor = getSharedPreferences("MusicPref", MODE_PRIVATE).edit();
editor.putInt("SongPosition", SONG_POS);
editor.putString("SongURI", mListSongs.get(SONG_POS).getSongUri().toString());
editor.commit();
updateNotification(songName);
}
public void playPauseSong() {
if (mState == STATE_PAUSED) {
mState = STATE_PLAYING;
mPlayer.start();
MainActivity.imgPlayPause.setImageResource(R.drawable.pause);
} else {
mState = STATE_PAUSED;
mPlayer.pause();
MainActivity.imgPlayPause.setImageResource(R.drawable.play);
}
}
public boolean isPlayingg() {
return mPlayer.isPlaying();
}
public int getPosn() {
return mPlayer.getCurrentPosition();
}
public int getDur() {
int n = songDuration;
return songDuration;
}
public void pausePlayer() {
mPlayer.pause();
}
private void setSongDetails(int position) {
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
byte[] rawArt;
Bitmap art = null;
BitmapFactory.Options bfo = new BitmapFactory.Options();
mmr.setDataSource(getApplicationContext(), mListSongs.get(position).getSongUri());
rawArt = mmr.getEmbeddedPicture();
// if rawArt is null then no cover art is embedded in the file or is not
// recognized as such.
if (null != rawArt) {
Bitmap bm = Bitmap.createScaledBitmap(BitmapFactory.decodeByteArray(rawArt, 0, rawArt.length, bfo),
100, 100,
true);
MainActivity.imgSongArt.setImageBitmap(bm);
MainActivity.tvSongName.setText(mListSongs.get(position).getSongName());
MainActivity.tvSongArtist.setText(mListSongs.get(position).getmSongArtist());
} else {
MainActivity.imgSongArt.setImageResource(R.drawable.default_album_art);
MainActivity.tvSongName.setText(mListSongs.get(position).getSongName());
MainActivity.tvSongArtist.setText(mListSongs.get(position).getmSongArtist());
}
}
public void stopSong() {
mPlayer.stop();
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
manager.cancel(NOTIFICATION_ID);
//System.exit(0);
}
public void nextSong() {
if (SONG_POS != mListSongs.size() - 1) {
startSong(mListSongs.get(SONG_POS + 1).getSongUri(), mListSongs.get(SONG_POS + 1).getSongName(), mListSongs.get(SONG_POS + 1).getmSongAlbumArt(), SONG_POS + 1);
SONG_POS++;
} else {
SONG_POS = 0;
startSong(mListSongs.get(0).getSongUri(), mListSongs.get(0).getSongName(), mListSongs.get(0).getmSongAlbumArt(), 0);
}
editor = getSharedPreferences("MusicPref", MODE_PRIVATE).edit();
editor.putInt("SongPosition", SONG_POS);
editor.putString("SongURI", mListSongs.get(SONG_POS).getSongUri().toString());
editor.commit();
}
public void previousSong() {
if (SONG_POS != 0) {
startSong(mListSongs.get(SONG_POS - 1).getSongUri(), mListSongs.get(SONG_POS - 1).getSongName(), mListSongs.get(SONG_POS - 1).getmSongAlbumArt(), SONG_POS - 1);
SONG_POS--;
} else {
startSong(mListSongs.get(mListSongs.size() - 1).getSongUri(), mListSongs.get(mListSongs.size() - 1).getSongName(), mListSongs.get(mListSongs.size() - 1).getmSongAlbumArt(), mListSongs.size() - 1);
SONG_POS = mListSongs.size() - 1;
}
editor = getSharedPreferences("MusicPref", MODE_PRIVATE).edit();
editor.putInt("SongPosition", SONG_POS);
editor.putString("SongURI", mListSongs.get(SONG_POS).getSongUri().toString());
editor.commit();
}
public void setSongURI(Uri uri) {
this.mSongUri = uri;
}
public void setmSongBitmap(Bitmap mSongBitmap) {
this.mSongBitmap = mSongBitmap;
}
public void setSelectedSong(int pos, int notification_id) {
SONG_POS = pos;
NOTIFICATION_ID = notification_id;
setSongURI(mListSongs.get(SONG_POS).getSongUri());
setmSongBitmap(mListSongs.get(SONG_POS).getmSongAlbumArt());
showNotification();
startSong(mListSongs.get(SONG_POS).getSongUri(), mListSongs.get(SONG_POS).getSongName(), mListSongs.get(SONG_POS).getmSongAlbumArt(), SONG_POS);
}
public void setSongList(ArrayList<Song> listSong) {
mListSongs = listSong;
}
public void showNotification() {
PendingIntent pendingIntent;
Intent intent;
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
RemoteViews notificationView = new RemoteViews(getPackageName(), R.layout.notification_mediacontroller);
notificationView.setTextViewText(R.id.notify_song_name, mListSongs.get(SONG_POS).getSongName());
intent = new Intent(ACTION_STOP);
pendingIntent = PendingIntent.getService(getApplicationContext(), REQUEST_CODE_STOP, intent, PendingIntent.FLAG_UPDATE_CURRENT);
notificationView.setOnClickPendingIntent(R.id.notify_btn_stop, pendingIntent);
intent = new Intent(ACTION_PAUSE);
pendingIntent = PendingIntent.getService(getApplicationContext(), REQUEST_CODE_PAUSE, intent, PendingIntent.FLAG_UPDATE_CURRENT);
notificationView.setOnClickPendingIntent(R.id.notify_btn_pause, pendingIntent);
intent = new Intent(ACTION_PREVIOUS);
pendingIntent = PendingIntent.getService(getApplicationContext(), REQUEST_CODE_PREVIOUS, intent, PendingIntent.FLAG_UPDATE_CURRENT);
notificationView.setOnClickPendingIntent(R.id.notify_btn_previous, pendingIntent);
intent = new Intent(ACTION_NEXT);
pendingIntent = PendingIntent.getService(getApplicationContext(), REQUEST_CODE_NEXT, intent, PendingIntent.FLAG_UPDATE_CURRENT);
notificationView.setOnClickPendingIntent(R.id.notify_btn_next, pendingIntent);
mNotification = notificationBuilder
.setSmallIcon(R.drawable.ic_launcher).setOngoing(true)
.setWhen(System.currentTimeMillis())
.setContent(notificationView)
.setDefaults(Notification.FLAG_NO_CLEAR)
.build();
notificationManager.notify(NOTIFICATION_ID, mNotification);
}
private void updateNotification(String songName) {
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotification.contentView.setTextViewText(R.id.notify_song_name, songName);
mNotification.contentView.setImageViewBitmap(R.id.img_notification, mListSongs.get(SONG_POS).getmSongAlbumArt());
notificationManager.notify(NOTIFICATION_ID, mNotification);
}
private boolean checkError=true;
公共媒体播放器mPlayer;
私有Uri mSongUri;
私有位图;
公共静态播放片段播放片段;
私人通话时长;
私人ArrayList音乐;
私密的国际宋_POS=0;
私有最终IBinder musicBind=新播放器绑定器();
私有最终字符串操作\u STOP=“com.emptylist.tabplayer.STOP”;
private final String ACTION_NEXT=“com.emptylist.tabplayer.NEXT”;
私有最终字符串操作\u PREVIOUS=“com.emptylist.tabplayer.PREVIOUS”;
私有最终字符串操作\u PAUSE=“com.emptylist.tabplayer.PAUSE”;
公共静态最终整数状态_=1;
公共静态最终整数状态_PLAYING=2;
公共int mState=0;
私有静态最终整数请求\代码\暂停=101;
私有静态最终整数请求\代码\先前=102;
私有静态最终整数请求\代码\下一步=103;
私有静态最终整数请求\代码\停止=104;
公共静态int通知_ID=11;
私人通知。建筑商通知建筑商;
私人通知;
私人共享参考优先权;
私有共享参考。编辑器;
公共类PlayerBinder扩展绑定器{
公共音乐服务getService(){
Log.d(“test”,“getService()”);
返回MusicService.this;
}
}
@凌驾
公共IBinder onBind(意向){
Log.d(“测试”,“调用onBind”);
返回音乐绑定;
}
@凌驾
public void onCreate(){
super.onCreate();
mPlayer=新媒体播放器();
initPlayer();
mPlayer.setOnPreparedListener(此);
mPlayer.setOnCompletionListener(此);
mPlayer.setOneErrorListener(此);
notificationBuilder=new Notification.Builder(getApplicationContext());
}
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
if(intent!=null){
String action=intent.getAction();
如果(!TextUtils.isEmpty(操作)){
if(动作等于(动作暂停)){
playPauseSong();
}else if(action.equals(action_NEXT)){
nextSong();
}else if(action.equals(action_PREVIOUS)){
上一首歌();
}else if(action.equals(action_STOP)){
停止歌曲();
stopSelf();
}
}
}
返回super.onStartCommand(intent、flags、startId);
}
@凌驾
公共布尔onUnbind(意图){
mPlayer.stop();
mPlayer.release();
返回false;
}
@凌驾
完成时的公共作废(MediaPlayer mp){
if(checkError==false){
startSong(mListSongs.get(SONG_POS.getSongUri(),mListSongs.get(SONG_POS.getSongName(),mListSongs.get(SONG_POS.getmSongAlbumArt(),SONG_POS));
checkError=true;
}否则{
mPlayer.reset();
试一试{
if(SONG_POS!=mListSongs.size()-1){
SONG_POS++;
Setsong详细信息(SONG_POS);
}否则{
宋_POS=0;
Setsong详细信息(SONG_POS);
}
mPlayer.setDataSource(getApplicationContext(),mListSongs.get(SONG_POS.getSongUri());
}捕获(例外e){
Log.e(“音乐服务”,“错误设置数据源”,e);
}
mPlayer.prepareAsync();
如果(mState==状态_播放){
MainActivity.imgPlayPause.setImageResource(R.drawable.pause);
}否则
MainActivity.imgPlayPause.setImageResource(R.drawable.play);
editor=getSharedReferences(“MusicPref”,MODE_PRIVATE).edit();
编辑:putInt(“SongPosition”,SONG_POS);
putString(“SongURI”,mListSongs.get(SONG_POS.getSongUri().toString());
commit();
}
}
@凌驾
公共布尔onError(MediaPlayer mp,int what,int extra){
Log.d(“EEE”,String.valueOf(what)+”,“String.valueOf(extra));
checkError=false;
返回false;
}
@凌驾
已准备好公开作废(MediaPlayer mp){
mp.start();
新的ProgressUpdater();
}
私有播放器(){
mPlayer.setWakeMode(getApplicationContext(),PowerManager.PARTIAL_WAKE_LOCK);
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
if(android.os.Build.VERSION.SDK_INT>android.os.Build.VERSION_code.KITKAT){
试一试{
Class cMediaTimeProvider=Class.forName(“android.media.MediaTimeProvider”);
Class cSubtitleController=Class.forName(“android.media.SubtitleController”);
Class iSubtitleControllerAnchor=Class.forName(“android.media.SubtitleController$Anchor”);
Class iSubtitleControllerListener=Class.forName(“android.media.SubtitleController$Listener”);
构造函数Constructor=cSubtitleController.getConstructor(新类[]{Context.Class,cMediaTimeProvider,iSubtitleControllerListener});
Object instance=constructor.newInstance(getApplicationContext(),null,null);
字段f=cSubtitleController.getDeclaredField(“mHandler”);
f、 setAccessible(true);
试一试{
f、 set(subtitleInstance,newhandler());
}捕获(非法访问例外e){
}最后{
f、 setAccessible(false);
}
方法setsubtitleanchor=mPlayer.getClass().getMethod(“setsubtitleanchor”,cSubtitleController,iSubtitleControllerAnchor);
调用(mPlayer,subtitleanchor.invoke,null);
//Log.e(“,”副标题设置为:p”);
}捕获(例外e){
}
}
}