Question

I am able to press the back button when music is not played . But when the music plays and I try to press the back button,it doesn't work. Even on pausing the music, back button not working. Please help what could be the issue. Pasting below a snippet of the code:

Inside 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;
}

Service Class:

     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 class:

    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);
}
      }
Was it helpful?

Solution

Why do you want to handle the Back key in onKeyDown . The Activity will taken care of finishing itself when back key is pressed.

Remove the onKeyDown method from Activity if your aim is to handle BACK Key there.

You can stop and release the MediaPlayer Instance in Activity onDestroy

Also, If you need to do any specific work on back press , do it in onBackPressed method before calling super.onBackPressed.

If media controller is visible when music play, you need to handle the KEYCODE_BACK to finish the Activity

Add this in your MusicController class

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

OTHER TIPS

@Override
    public void onBackPressed() {
        // TODO Auto-generated method stub
        //release meadia playes here
        super.onBackPressed();
    }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top