2014-04-30 3 views
1

Я могу нажать кнопку «Назад», когда музыка не воспроизводится. Но когда играет музыка, и я пытаюсь нажать кнопку «Назад», это не сработает. Даже при приостановке музыки кнопка возврата не работает. Пожалуйста, помогите, что может быть проблемой. Приклеивание ниже фрагмент кода:Кнопка «Назад» не работает в Media player

Внутри MainActivity:

public class MainActivity extends Activity implements MediaPlayerControl { 

private ArrayList<Song> songList; 
private ListView songView; 

private MusicService musicSrv; 
private Intent playIntent; 
private boolean musicBound = false; 
private MusicController controller; 

private boolean paused = false, playbackPaused = false; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    songView = (ListView) findViewById(R.id.lv_song_list); 
    songList = new ArrayList<Song>(); 
    getSongList(); 
    Collections.sort(songList, new Comparator<Song>() { 
     @Override 
     public int compare(Song a, Song b) { 
      return a.getTitle().compareTo(b.getTitle()); 
     } 
    }); 
    SongAdapter songAdt = new SongAdapter(this, songList); 
    songView.setAdapter(songAdt); 
    setController(); 
} 

// connect to the service 
private ServiceConnection musicConnection = new ServiceConnection() { 

    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     MusicBinder binder = (MusicBinder) service; 
     // get service 
     musicSrv = binder.getService(); 
     Log.e("MAIN ACT", "Inside connection"); 
     // pass list 
     musicSrv.setList(songList); 
     musicBound = true; 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName name) { 
     Log.e("MAIN ACT", "Inside disconnection"); 
     musicBound = false; 
     musicSrv = null; 
    } 
}; 

@Override 
protected void onStart() { 
    super.onStart(); 
    if (playIntent == null) { 
     playIntent = new Intent(this, MusicService.class); 
     bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE); 
     startService(playIntent); 
     Log.e("MAIN ACT", "Inside onstart" + musicBound); 
    } 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    Log.e("MAIN ACT", "Inside ondestroy"); 
    musicSrv = null; 

} 

public void getSongList() { 
    // retrieve song info 
    ContentResolver musicResolver = getContentResolver(); 
    Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
    Cursor musicCursor = musicResolver.query(musicUri, null, null, null, 
      null); 

    if (musicCursor != null && musicCursor.moveToFirst()) { 
     // get columns 
     int titleColumn = musicCursor.getColumnIndex(MediaColumns.TITLE); 
     int idColumn = musicCursor.getColumnIndex(BaseColumns._ID); 
     int artistColumn = musicCursor.getColumnIndex(AudioColumns.ARTIST); 
     // add songs to list 
     do { 
      long thisId = musicCursor.getLong(idColumn); 
      String thisTitle = musicCursor.getString(titleColumn); 
      String thisArtist = musicCursor.getString(artistColumn); 
      songList.add(new Song(thisId, thisTitle, thisArtist)); 
     } while (musicCursor.moveToNext()); 
    } 
} 

public void songPicked(View view) { 
    musicSrv.setSong(Integer.parseInt(view.getTag().toString())); 
    musicSrv.playSong(); 
    if (playbackPaused) { 
     setController(); 
     playbackPaused = false; 
    } 
    controller.show(0); 
    Log.d(this.getClass().getName(), "Inside song picked"); 
} 

private void setController() { 
    // set the controller up 
    controller = new MusicController(this); 
    controller.setPrevNextListeners(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      playNext(); 
     } 
    }, new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      playPrev(); 
     } 
    }); 

    controller.setMediaPlayer(this); 
    controller.setAnchorView(findViewById(R.id.lv_song_list)); 
    controller.setEnabled(true); 
} 

// play next 
private void playNext() { 
    musicSrv.playNext(); 
    if (playbackPaused) { 
     setController(); 
     playbackPaused = false; 
    } 
    controller.show(0); 
} 

// play previous 
private void playPrev() { 
    musicSrv.playPrev(); 
    if (playbackPaused) { 
     setController(); 
     playbackPaused = false; 
    } 
    controller.show(0); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    paused = true; 
    musicSrv.pausePlayer(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    if (paused) { 
     setController(); 
     paused = false; 
    } 
} 

@Override 
public void onBackPressed() { 
    if (musicSrv != null){ 
      super.onBackPressed(); 
      Log.e("MAIN ACT", "Inside onbackpress"); 
     } 


} 

// 
// @Override 
// public boolean onKeyDown(int keyCode, KeyEvent event) 
// { 
// Log.e("MAIN ACT", "Inside onkeydown1"); 
// if ((keyCode == KeyEvent.KEYCODE_BACK)) 
// { //Back key pressed 
// //Things to Do 
// Log.e("MAIN ACT", "Inside onkeydown2"); 
// if(musicSrv!= null) 
// { 
// musicSrv.pausePlayer(); 
// musicSrv=null; 
// } 
// finish(); 
// return true; 
// } 
// return super.onKeyDown(keyCode, event); 
// } 

@Override 
protected void onStop() { 
    Log.e("MAIN ACT", "Inside onstop"); 
    if (playIntent != null) { 
     Log.e("MAIN ACT", "Inside onstop1"); 
     unbindService(musicConnection); 
     musicBound = false; 
     boolean flagservice = stopService(playIntent); 
     Log.d("MAIN ACT", "Inside onstop1" + flagservice); 

    } 
    controller.hide(); 
    super.onStop(); 
} 


@Override 
public void start() { 
    Log.d(this.getClass().getName(), "START"); 
    musicSrv.go(); 

} 

@Override 
public void pause() { 
    playbackPaused = true; 
    Log.d(this.getClass().getName(), "PAUSE"); 
    musicSrv.pausePlayer(); 

} 

@Override 
public int getDuration() { 
    if (musicSrv != null && musicBound && musicSrv.isPng()) 
     return musicSrv.getDur(); 
    else 
     return 0; 

} 

@Override 
public int getCurrentPosition() { 

    if (musicSrv != null && musicBound && musicSrv.isPng()) 
     return musicSrv.getPosn(); 
    else 
     return 0; 

} 

@Override 
public void seekTo(int pos) { 
    musicSrv.seek(pos); 

} 

@Override 
public boolean isPlaying() { 
    if (musicSrv != null && musicBound) { 
     Log.e("MAIN ACT", "Inside isplaying"); 
     boolean value = musicSrv.isPng(); 
     return value; 
    } else 
     return false; 

} 

@Override 
public int getBufferPercentage() { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public boolean canPause() { 

    return true; 
} 

@Override 
public boolean canSeekBackward() { 

    return true; 
} 

@Override 
public boolean canSeekForward() { 

    return true; 
} 

@Override 
public int getAudioSessionId() { 

    return 0; 
} 

службы Класс:

 public class MusicService extends Service implements 
    MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, 
    MediaPlayer.OnCompletionListener { 

// media player 
private MediaPlayer player; 
// song list 
private ArrayList<Song> songs; 
// current position 
private int songPosn; 

private String songTitle = ""; 
private static final int NOTIFY_ID = 1; 

private boolean shuffle = false; 
private Random rand; 
private final IBinder musicBind = new MusicBinder(); 

@Override 
public IBinder onBind(Intent intent) { 
    Log.d(this.getClass().getName(), "BIND"); 
    return musicBind; 
} 

@Override 
public boolean onUnbind(Intent intent) { 
    Log.d(this.getClass().getName(), "UNBIND"); 
    if (player.isPlaying()) { 
     player.stop(); 
     player.release(); 
     Log.d(this.getClass().getName(), "UNBIND1"); 
    } 
    return false; 
} 

@Override 
public void onCreate() { 
    // create the service 
    // create the service 
    super.onCreate(); 
    // initialize position 
    songPosn = 0; 
    if (player == null) { 
     // create player 
     player = new MediaPlayer(); 
     initMusicPlayer(); 
    } 

    player.reset(); 

    rand = new Random(); 
} 

public void initMusicPlayer() { 
    // set player properties 
    player.setWakeMode(getApplicationContext(), 
      PowerManager.PARTIAL_WAKE_LOCK); 
    player.setAudioStreamType(AudioManager.STREAM_MUSIC); 

    player.setOnPreparedListener(this); 
    player.setOnCompletionListener(this); 
    player.setOnErrorListener(this); 

} 

public void setList(ArrayList<Song> theSongs) { 
    this.songs = theSongs; 
} 

public class MusicBinder extends Binder { 
    MusicService getService() { 
     return MusicService.this; 
    } 
} 

public void playSong() { 
    // play a song 
    player.reset(); 
    // get song 
    Song playSong = songs.get(songPosn); 
    songTitle = playSong.getTitle(); 
    // get id 
    long currSong = playSong.getId(); 
    // set uri 
    Uri trackUri = ContentUris.withAppendedId(
      android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
      currSong); 
    try { 
     player.setDataSource(getApplicationContext(), trackUri); 
     player.prepareAsync(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     Log.e("MUSIC SERVICE", "Error setting data source", e); 
    } 

    Log.d("MUSIC SERVICE", "Inside playsong"); 
} 

public void setShuffle() { 
    if (shuffle) 
     shuffle = false; 
    else 
     shuffle = true; 
} 

@Override 
public void onCompletion(MediaPlayer mp) { 

    if (player.isPlaying()) { 
     mp.stop(); 
     mp.release(); 

    } 

    if (player.getCurrentPosition() < 0) { 
     mp.reset(); 
     playNext(); 
    } 
} 

public void setSong(int songIndex) { 
    this.songPosn = songIndex; 
} 

@Override 
public boolean onError(MediaPlayer mp, int what, int extra) { 

    mp.reset(); 
    Log.e("ERROR", "Inside onError"); 
    return false; 
} 

@Override 
public void onPrepared(MediaPlayer mp) { 
    if (!player.isPlaying()) { 
     Log.d(this.getClass().getName(), "ONPREPARE"); 
     try 
     { 
     mp.start(); 
     } 
     catch(IllegalStateException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
    Intent notIntent = new Intent(this, MainActivity.class); 
    notIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    PendingIntent pendInt = PendingIntent.getActivity(this, 0, 
    notIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

    Notification.Builder builder = new Notification.Builder(this); 

    builder.setContentIntent(pendInt) 
    .setSmallIcon(R.drawable.play) 
    .setTicker(songTitle) 
    .setOngoing(true) 
    .setContentTitle("Playing") 
    .setContentText(songTitle); 
    Notification not = builder.build(); 
    Log.e("MUSIC SERVICE", "Inside prepare"); 
    startForeground(NOTIFY_ID, not); 

} 

public void stop() { 
    if (!player.isPlaying()) { 
     player.stop(); 
     Log.d("MUSIC SERVICE", "Inside stop"); 
    } 
} 

public int getPosn() { 
    return player.getCurrentPosition(); 
} 

public int getDur() { 
    return player.getDuration(); 
} 

public boolean isPng() { 
    return player.isPlaying(); 
} 

public void pausePlayer() { 
    if (player.isPlaying()) { 
     player.pause(); 
    } 
} 

public void seek(int posn) { 
    player.seekTo(posn); 
} 

public void go() { 
    if (!player.isPlaying()) { 
     Log.d(this.getClass().getName(), "GO"); 
     player.start(); 
    } 
} 

public void playPrev() { 
    songPosn--; 
    if (songPosn < 0) 
     songPosn = songs.size() - 1; 
    playSong(); 
} 

// skip to next 
public void playNext() { 
    songPosn++; 
    if (songPosn >= songs.size()) 
     songPosn = 0; 
    playSong(); 

    if (shuffle) { 
     int newSong = songPosn; 
     while (newSong == songPosn) { 
      newSong = rand.nextInt(songs.size()); 
     } 
     songPosn = newSong; 
    } else { 
     songPosn++; 
     if (songPosn <= songs.size()) 
      songPosn = 0; 
    } 
    playSong(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Log.d(this.getClass().getName(), "ON DESTROY"); 
    stopForeground(true); 
    if (player != null) { 
     if (player.isPlaying()) { 
      player.stop(); 
     } 
     player.release(); 
    } 

} 


    } 

MediaController класс:

public class MusicController extends MediaController { 

public MusicController(Context c){ 
    super(c); 
} 
    @Override 
public void hide(){ 
    Log.d(this.getClass().getName(),"Hide"); 
    super.show(); 
} 
@Override 
public void show(int timeout) { 
    Log.d(this.getClass().getName(),"Show"); 
    super.show(0); 
} 

@Override 
public boolean dispatchKeyEvent(KeyEvent event) 
{ 
    int keyCode = event.getKeyCode(); 
    if(keyCode == KeyEvent.KEYCODE_BACK) 
    { 
     Log.d(this.getClass().getName(),"DispACH"); 
     super.hide(); 
     Context c = getContext(); 
     ((Activity) c).finish(); 
     return true; 
    } 
    return super.dispatchKeyEvent(event); 
} 
     } 

ответ

0

Почему вы хотите, чтобы справиться с Back key в onKeyDown. Activity позаботится о том, чтобы закончить себя, когда нажата задняя клавиша.

Избегайте метода onKeyDown от Activity, если ваша цель состоит в том, чтобы обрабатывать BACK Key.

Вы можете stop и releaseMediaPlayer Instance в ActivityonDestroy

Кроме того, если вам нужно сделать какой-либо конкретной работы на задней печати, сделайте это в onBackPressed метод перед вызовом super.onBackPressed.

Если контроллер медиа видна, когда музыка играет, вы должны обрабатывать KEYCODE_BACK закончить Activity

Добавить это в MusicController классе

@Override 
    public boolean dispatchKeyEvent(KeyEvent event) { 
     int keyCode = event.getKeyCode(); 
     if(keyCode == KeyEvent.KEYCODE_BACK){ 
      finish(); 
      return true; 
     } 
     return super.dispatchKeyEvent(event); 
    } 
+0

Но моя проблема, если я закомментировать методы onBackPressed и onKeyDown, кнопка «Назад» не работает. Код в onDestroy не запускается. Что может быть причиной. – Siju

+0

Я удалил onBackPressed, но проблема все еще остается. Когда я отлаживаю и проверяю, я обнаружил, что onDestroy никогда не срабатывает, когда я нажимаю кнопку «Назад» во время воспроизведения/паузы музыки. Короче говоря, никакое событие не запускается, когда нажата задняя часть. Является ли медиа-плеер блокирующим меня от выполнения каких-либо событий? – Siju

+0

Снятие медиаконтроллера решило проблему. Но теперь музыка не играет в фоновом режиме. При нажатии на нее он останавливается. – Siju

0
@Override 
    public void onBackPressed() { 
     // TODO Auto-generated method stub 
     //release meadia playes here 
     super.onBackPressed(); 
    }