Кнопка «Назад» не работает в медиаплеере

1

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

Внутри 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);
}
      }
Теги:
android-mediaplayer

2 ответа

0
Лучший ответ

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

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

Вы можете stop и release MediaPlayer Instance в Activity onDestroy

Кроме того, если вам нужно выполнить какую-либо конкретную работу по обратному onBackPressed, сделайте это в методе 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 не срабатывает. Что может быть причиной.
  • 0
    Я удалил onBackPressed, но проблема все еще остается. Когда я отлаживаю и проверяю, я обнаруживаю, что onDestroy никогда не запускается, когда я нажимаю кнопку «Назад» во время воспроизведения / паузы музыки. Короче говоря, при нажатии кнопки назад событие не запускается. Медиаплеер блокирует мне выполнение каких-либо событий?
Показать ещё 9 комментариев
0
@Override
    public void onBackPressed() {
        // TODO Auto-generated method stub
        //release meadia playes here
        super.onBackPressed();
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню