Java tutorial
/* * Copyright 2012-2014 Andrea De Cesare * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.andreadec.musicplayer; import java.io.*; import java.util.*; import android.annotation.SuppressLint; import android.app.*; import android.content.*; import android.graphics.*; import android.media.*; import android.media.MediaPlayer.*; import android.media.audiofx.*; import android.os.*; import android.preference.*; import android.support.v4.app.*; import android.telephony.*; import android.view.KeyEvent; import android.widget.RemoteViews; @SuppressLint("NewApi") public class MusicService extends Service implements OnCompletionListener { private final static int METADATA_KEY_ARTWORK = 100; private final IBinder musicBinder = new MusicBinder(); private NotificationManager notificationManager; private Notification notification; private SharedPreferences preferences; private PendingIntent pendingIntent; private PendingIntent quitPendingIntent; private PendingIntent previousPendingIntent; private PendingIntent playpausePendingIntent; private PendingIntent nextPendingIntent; private PlayableItem currentPlayingItem; private MediaPlayer mediaPlayer; private BassBoost bassBoost; private Equalizer equalizer; private boolean bassBoostAvailable; private boolean equalizerAvailable; private boolean shuffle, repeat, repeatAll; private Random random; private TelephonyManager telephonyManager; private MusicPhoneStateListener phoneStateListener; private AudioManager audioManager; private ComponentName mediaButtonReceiverComponent; private BroadcastReceiver broadcastReceiver; private ShakeListener shakeListener; private Bitmap icon; private RemoteControlClient remoteControlClient; private PowerManager.WakeLock wakeLock; /** * Called when the service is created. */ @Override public void onCreate() { PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MusicServiceWakelock"); // Initialize the telephony manager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); phoneStateListener = new MusicPhoneStateListener(); notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // Initialize pending intents quitPendingIntent = PendingIntent.getBroadcast(this, 0, new Intent("com.andreadec.musicplayer.quit"), 0); previousPendingIntent = PendingIntent.getBroadcast(this, 0, new Intent("com.andreadec.musicplayer.previous"), 0); playpausePendingIntent = PendingIntent.getBroadcast(this, 0, new Intent("com.andreadec.musicplayer.playpause"), 0); nextPendingIntent = PendingIntent.getBroadcast(this, 0, new Intent("com.andreadec.musicplayer.next"), 0); pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP), PendingIntent.FLAG_UPDATE_CURRENT); // Read saved user preferences preferences = PreferenceManager.getDefaultSharedPreferences(this); // Initialize the media player mediaPlayer = new MediaPlayer(); mediaPlayer.setOnCompletionListener(this); mediaPlayer.setWakeMode(this, PowerManager.PARTIAL_WAKE_LOCK); // Enable the wake lock to keep CPU running when the screen is switched off shuffle = preferences.getBoolean(Constants.PREFERENCE_SHUFFLE, Constants.DEFAULT_SHUFFLE); repeat = preferences.getBoolean(Constants.PREFERENCE_REPEAT, Constants.DEFAULT_REPEAT); repeatAll = preferences.getBoolean(Constants.PREFERENCE_REPEATALL, Constants.DEFAULT_REPEATALL); try { // This may fail if the device doesn't support bass boost bassBoost = new BassBoost(1, mediaPlayer.getAudioSessionId()); bassBoost.setEnabled( preferences.getBoolean(Constants.PREFERENCE_BASSBOOST, Constants.DEFAULT_BASSBOOST)); setBassBoostStrength(preferences.getInt(Constants.PREFERENCE_BASSBOOSTSTRENGTH, Constants.DEFAULT_BASSBOOSTSTRENGTH)); bassBoostAvailable = true; } catch (Exception e) { bassBoostAvailable = false; } try { // This may fail if the device doesn't support equalizer equalizer = new Equalizer(1, mediaPlayer.getAudioSessionId()); equalizer.setEnabled( preferences.getBoolean(Constants.PREFERENCE_EQUALIZER, Constants.DEFAULT_EQUALIZER)); setEqualizerPreset( preferences.getInt(Constants.PREFERENCE_EQUALIZERPRESET, Constants.DEFAULT_EQUALIZERPRESET)); equalizerAvailable = true; } catch (Exception e) { equalizerAvailable = false; } random = new Random(System.nanoTime()); // Necessary for song shuffle shakeListener = new ShakeListener(this); if (preferences.getBoolean(Constants.PREFERENCE_SHAKEENABLED, Constants.DEFAULT_SHAKEENABLED)) { shakeListener.enable(); } telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); // Start listen for telephony events // Inizialize the audio manager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); mediaButtonReceiverComponent = new ComponentName(getPackageName(), MediaButtonReceiver.class.getName()); audioManager.registerMediaButtonEventReceiver(mediaButtonReceiverComponent); audioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); // Initialize remote control client if (Build.VERSION.SDK_INT >= 14) { icon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); mediaButtonIntent.setComponent(mediaButtonReceiverComponent); PendingIntent mediaPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, mediaButtonIntent, 0); remoteControlClient = new RemoteControlClient(mediaPendingIntent); remoteControlClient.setTransportControlFlags(RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE | RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS | RemoteControlClient.FLAG_KEY_MEDIA_NEXT); audioManager.registerRemoteControlClient(remoteControlClient); } updateNotificationMessage(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.andreadec.musicplayer.quit"); intentFilter.addAction("com.andreadec.musicplayer.previous"); intentFilter.addAction("com.andreadec.musicplayer.previousNoRestart"); intentFilter.addAction("com.andreadec.musicplayer.playpause"); intentFilter.addAction("com.andreadec.musicplayer.next"); intentFilter.addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY); broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals("com.andreadec.musicplayer.quit")) { sendBroadcast(new Intent("com.andreadec.musicplayer.quitactivity")); stopSelf(); return; } else if (action.equals("com.andreadec.musicplayer.previous")) { previousItem(false); } else if (action.equals("com.andreadec.musicplayer.previousNoRestart")) { previousItem(true); } else if (action.equals("com.andreadec.musicplayer.playpause")) { playPause(); } else if (action.equals("com.andreadec.musicplayer.next")) { nextItem(); } else if (action.equals(AudioManager.ACTION_AUDIO_BECOMING_NOISY)) { if (preferences.getBoolean(Constants.PREFERENCE_STOPPLAYINGWHENHEADSETDISCONNECTED, Constants.DEFAULT_STOPPLAYINGWHENHEADSETDISCONNECTED)) { pause(); } } } }; registerReceiver(broadcastReceiver, intentFilter); if (!isPlaying()) { loadLastSong(); } startForeground(Constants.NOTIFICATION_MAIN, notification); } /* Called when service is started. */ @Override public int onStartCommand(Intent intent, int flags, int startId) { return START_STICKY; } // Returns true if the song has been successfully loaded private void loadLastSong() { if (preferences.getBoolean(Constants.PREFERENCE_OPENLASTSONGONSTART, Constants.DEFAULT_OPENLASTSONGONSTART)) { String lastPlayingSong = preferences.getString(Constants.PREFERENCE_LASTPLAYINGSONG, Constants.DEFAULT_LASTPLAYINGSONG); long lastPlayingSongFromPlaylistId = preferences.getLong( Constants.PREFERENCE_LASTPLAYINGSONGFROMPLAYLISTID, Constants.DEFAULT_LASTPLAYINGSONGFROMPLAYLISTID); if (lastPlayingSong != null && (new File(lastPlayingSong).exists())) { if (lastPlayingSongFromPlaylistId != -1) { PlaylistSong savedSong = Playlists.getSavedSongFromPlaylist(lastPlayingSongFromPlaylistId); if (savedSong != null) { playItem(savedSong, false); } } else { File songDirectory = new File(lastPlayingSong).getParentFile(); BrowserSong song = new BrowserSong(lastPlayingSong, new BrowserDirectory(songDirectory)); ((MusicPlayerApplication) getApplication()).gotoDirectory(songDirectory); playItem(song, false); } if (preferences.getBoolean(Constants.PREFERENCE_SAVESONGPOSITION, Constants.DEFAULT_SAVESONGPOSITION)) { int lastSongPosition = preferences.getInt(Constants.PREFERENCE_LASTSONGPOSITION, Constants.DEFAULT_LASTSONGPOSITION); if (lastSongPosition < getDuration()) seekTo(lastSongPosition); } } } } /* Called when the activity is destroyed. */ @Override public void onDestroy() { telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); // Stop listen for telephony events notificationManager.cancel(Constants.NOTIFICATION_MAIN); unregisterReceiver(broadcastReceiver); // Disable broadcast receiver SharedPreferences.Editor editor = preferences.edit(); editor.putBoolean(Constants.PREFERENCE_SHUFFLE, shuffle); editor.putBoolean(Constants.PREFERENCE_REPEAT, repeat); editor.putBoolean(Constants.PREFERENCE_REPEATALL, repeatAll); if (bassBoostAvailable) { editor.putBoolean(Constants.PREFERENCE_BASSBOOST, getBassBoostEnabled()); editor.putInt(Constants.PREFERENCE_BASSBOOSTSTRENGTH, getBassBoostStrength()); } else { editor.remove(Constants.PREFERENCE_BASSBOOST); editor.remove(Constants.PREFERENCE_BASSBOOSTSTRENGTH); } if (equalizerAvailable) { editor.putBoolean(Constants.PREFERENCE_EQUALIZER, getEqualizerEnabled()); editor.putInt(Constants.PREFERENCE_EQUALIZERPRESET, getEqualizerPreset()); } else { editor.remove(Constants.PREFERENCE_EQUALIZER); editor.remove(Constants.PREFERENCE_EQUALIZERPRESET); } editor.putBoolean(Constants.PREFERENCE_SHAKEENABLED, isShakeEnabled()); if (currentPlayingItem != null) { if (currentPlayingItem instanceof BrowserSong) { editor.putString(Constants.PREFERENCE_LASTPLAYINGSONG, currentPlayingItem.getPlayableUri()); editor.putInt(Constants.PREFERENCE_LASTSONGPOSITION, getCurrentPosition()); editor.putLong(Constants.PREFERENCE_LASTPLAYINGSONGFROMPLAYLISTID, -1); } else if (currentPlayingItem instanceof PlaylistSong) { editor.putString(Constants.PREFERENCE_LASTPLAYINGSONG, currentPlayingItem.getPlayableUri()); editor.putInt(Constants.PREFERENCE_LASTSONGPOSITION, getCurrentPosition()); editor.putLong(Constants.PREFERENCE_LASTPLAYINGSONGFROMPLAYLISTID, ((PlaylistSong) currentPlayingItem).getId()); } else { editor.putString(Constants.PREFERENCE_LASTPLAYINGSONG, null); editor.putLong(Constants.PREFERENCE_LASTPLAYINGSONGFROMPLAYLISTID, -1); } } else { editor.putString(Constants.PREFERENCE_LASTPLAYINGSONG, null); editor.putLong(Constants.PREFERENCE_LASTPLAYINGSONGFROMPLAYLISTID, -1); } editor.putString(Constants.PREFERENCE_LASTDIRECTORY, ((MusicPlayerApplication) getApplication()).getCurrentDirectory().getDirectory().getAbsolutePath()); editor.commit(); if (Build.VERSION.SDK_INT >= 14) audioManager.unregisterRemoteControlClient(remoteControlClient); audioManager.unregisterMediaButtonEventReceiver(mediaButtonReceiverComponent); audioManager.abandonAudioFocus(null); shakeListener.disable(); mediaPlayer.release(); stopForeground(true); wakeLockRelease(); // Just to be sure the wakelock has been released! ;-) } private void wakeLockAcquire() { if (!wakeLock.isHeld()) wakeLock.acquire(); } private void wakeLockRelease() { if (wakeLock.isHeld()) wakeLock.release(); } public boolean playItem(PlayableItem item) { return playItem(item, true); } public boolean playItem(PlayableItem item, boolean startPlaying) { wakeLockAcquire(); currentPlayingItem = item; mediaPlayer.reset(); mediaPlayer.setOnCompletionListener(null); try { mediaPlayer.setDataSource(item.getPlayableUri()); try { mediaPlayer.prepare(); } catch (IOException e) { currentPlayingItem = null; return false; } mediaPlayer.setOnCompletionListener(this); if (startPlaying) mediaPlayer.start(); updateNotificationMessage(); if (startPlaying) { sendBroadcast(new Intent("com.andreadec.musicplayer.newsong")); // Sends a broadcast to the activity } return true; } catch (Exception e) { currentPlayingItem = null; updateNotificationMessage(); sendBroadcast(new Intent("com.andreadec.musicplayer.newsong")); // Sends a broadcast to the activity return false; } } /* BASS BOOST */ public boolean getBassBoostAvailable() { return bassBoostAvailable; } public boolean toggleBassBoost() { boolean newState = !bassBoost.getEnabled(); bassBoost.setEnabled(newState); return newState; } public boolean getBassBoostEnabled() { if (!bassBoostAvailable || bassBoost == null) return false; return bassBoost.getEnabled(); } public void setBassBoostStrength(int strength) { bassBoost.setStrength((short) strength); } public int getBassBoostStrength() { return bassBoost.getRoundedStrength(); } /* EQUALIZER */ public boolean getEqualizerAvailable() { return equalizerAvailable; } public boolean toggleEqualizer() { boolean newState = !equalizer.getEnabled(); equalizer.setEnabled(newState); return newState; } public boolean getEqualizerEnabled() { if (!equalizerAvailable || equalizer == null) return false; return equalizer.getEnabled(); } public void setEqualizerPreset(int preset) { equalizer.usePreset((short) preset); } public short getEqualizerPreset() { return equalizer.getCurrentPreset(); } public String[] getEqualizerAvailablePresets() { int n = equalizer.getNumberOfPresets(); String[] presets = new String[n]; for (short i = 0; i < n; i++) { presets[i] = equalizer.getPresetName(i); } return presets; } /* SHAKE SENSOR */ public boolean isShakeEnabled() { return shakeListener.isEnabled(); } public void toggleShake() { if (shakeListener.isEnabled()) shakeListener.disable(); else shakeListener.enable(); } /* Updates the notification and the remote control client. */ private void updateNotificationMessage() { /* Update remote control client */ if (Build.VERSION.SDK_INT >= 14) { if (currentPlayingItem == null) { remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_STOPPED); } else { if (isPlaying()) { remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING); } else { remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED); } RemoteControlClient.MetadataEditor metadataEditor = remoteControlClient.editMetadata(true); metadataEditor.putString(MediaMetadataRetriever.METADATA_KEY_TITLE, currentPlayingItem.getTitle()); metadataEditor.putString(MediaMetadataRetriever.METADATA_KEY_ALBUM, currentPlayingItem.getArtist()); metadataEditor.putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, currentPlayingItem.getArtist()); metadataEditor.putLong(MediaMetadataRetriever.METADATA_KEY_DURATION, getDuration()); if (currentPlayingItem.hasImage()) { metadataEditor.putBitmap(METADATA_KEY_ARTWORK, currentPlayingItem.getImage()); } else { metadataEditor.putBitmap(METADATA_KEY_ARTWORK, icon.copy(icon.getConfig(), false)); } metadataEditor.apply(); } } /* Update notification */ NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this); notificationBuilder.setSmallIcon(R.drawable.audio_white); //notificationBuilder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)); notificationBuilder.setOngoing(true); int playPauseIcon = isPlaying() ? R.drawable.pause : R.drawable.play; //int playPauseString = isPlaying() ? R.string.pause : R.string.play; notificationBuilder.setContentIntent(pendingIntent); String notificationMessage = ""; if (currentPlayingItem == null) { notificationMessage = getResources().getString(R.string.noSong); } else { if (currentPlayingItem.getArtist() != null && !currentPlayingItem.getArtist().equals("")) notificationMessage = currentPlayingItem.getArtist() + " - "; notificationMessage += currentPlayingItem.getTitle(); } /*notificationBuilder.addAction(R.drawable.previous, getResources().getString(R.string.previous), previousPendingIntent); notificationBuilder.addAction(playPauseIcon, getResources().getString(playPauseString), playpausePendingIntent); notificationBuilder.addAction(R.drawable.next, getResources().getString(R.string.next), nextPendingIntent);*/ notificationBuilder.setContentTitle(getResources().getString(R.string.app_name)); notificationBuilder.setContentText(notificationMessage); notification = notificationBuilder.build(); RemoteViews notificationLayout = new RemoteViews(getPackageName(), R.layout.layout_notification); if (currentPlayingItem == null) { notificationLayout.setTextViewText(R.id.textViewArtist, getString(R.string.app_name)); notificationLayout.setTextViewText(R.id.textViewTitle, getString(R.string.noSong)); notificationLayout.setImageViewBitmap(R.id.imageViewNotification, BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)); } else { notificationLayout.setTextViewText(R.id.textViewArtist, currentPlayingItem.getArtist()); notificationLayout.setTextViewText(R.id.textViewTitle, currentPlayingItem.getTitle()); Bitmap image = currentPlayingItem.getImage(); if (image != null) { notificationLayout.setImageViewBitmap(R.id.imageViewNotification, image); } else { notificationLayout.setImageViewBitmap(R.id.imageViewNotification, BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)); } } notificationLayout.setOnClickPendingIntent(R.id.buttonNotificationQuit, quitPendingIntent); notificationLayout.setOnClickPendingIntent(R.id.buttonNotificationPrevious, previousPendingIntent); notificationLayout.setImageViewResource(R.id.buttonNotificationPlayPause, playPauseIcon); notificationLayout.setOnClickPendingIntent(R.id.buttonNotificationPlayPause, playpausePendingIntent); notificationLayout.setOnClickPendingIntent(R.id.buttonNotificationNext, nextPendingIntent); notification.bigContentView = notificationLayout; notificationManager.notify(Constants.NOTIFICATION_MAIN, notification); } /* Toggles play/pause status. */ public void playPause() { if (currentPlayingItem == null) return; if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); wakeLockRelease(); } else { wakeLockAcquire(); mediaPlayer.start(); } updateNotificationMessage(); sendBroadcast(new Intent("com.andreadec.musicplayer.playpausechanged")); } /* Starts playing song. */ public void play() { if (currentPlayingItem == null) return; if (!mediaPlayer.isPlaying()) mediaPlayer.start(); updateNotificationMessage(); sendBroadcast(new Intent("com.andreadec.musicplayer.playpausechanged")); } /* Pauses playing song. */ public void pause() { if (currentPlayingItem == null) return; if (mediaPlayer.isPlaying()) mediaPlayer.pause(); updateNotificationMessage(); sendBroadcast(new Intent("com.andreadec.musicplayer.playpausechanged")); } /* Seeks to a position. */ public void seekTo(int progress) { mediaPlayer.seekTo(progress); } /* Plays the previous song */ public void previousItem(boolean noRestart) { if (currentPlayingItem == null) return; if (!noRestart && getCurrentPosition() > 2000) { playItem(currentPlayingItem); return; } if (repeat) { playItem(currentPlayingItem); return; } if (shuffle) { randomItem(); return; } PlayableItem previousItem = currentPlayingItem.getPrevious(); if (previousItem != null) { playItem(previousItem); } } /* Plays the next song */ public void nextItem() { if (currentPlayingItem == null) { return; } if (repeat) { playItem(currentPlayingItem); return; } if (shuffle) { randomItem(); return; } PlayableItem nextItem = currentPlayingItem.getNext(repeatAll); if (nextItem == null) { if (!isPlaying()) wakeLockRelease(); } else { playItem(nextItem); } } private void randomItem() { PlayableItem randomItem = currentPlayingItem.getRandom(random); if (randomItem != null) { playItem(randomItem); } } @Override public IBinder onBind(Intent intent) { return musicBinder; } public class MusicBinder extends Binder { public MusicService getService() { return MusicService.this; } } /* Gets current playing item. */ public PlayableItem getCurrentPlayingItem() { return currentPlayingItem; } /* Gets current song durations. */ public int getDuration() { if (currentPlayingItem == null) return 100; return mediaPlayer.getDuration(); } /* Gets current position in the song. */ public int getCurrentPosition() { if (currentPlayingItem == null) return 0; return mediaPlayer.getCurrentPosition(); } /* Checks if a song is currently being played */ public boolean isPlaying() { if (currentPlayingItem == null) return false; return mediaPlayer.isPlaying(); } @Override public void onCompletion(MediaPlayer player) { nextItem(); } public boolean getRepeat() { return repeat; } public void setRepeat(boolean repeat) { this.repeat = repeat; } public boolean getShuffle() { return shuffle; } public void setShuffle(boolean shuffle) { this.shuffle = shuffle; } public boolean getRepeatAll() { return repeatAll; } public void setRepeatAll(boolean repeatAll) { this.repeatAll = repeatAll; } /* Phone state listener class. */ private class MusicPhoneStateListener extends PhoneStateListener { private boolean wasPlaying = false; public void onCallStateChanged(int state, String incomingNumber) { switch (state) { case TelephonyManager.CALL_STATE_IDLE: if (preferences.getBoolean(Constants.PREFERENCE_RESTARTPLAYBACKAFTERPHONECALL, Constants.DEFAULT_RESTARTPLAYBACKAFTERPHONECALL) && wasPlaying) play(); break; case TelephonyManager.CALL_STATE_OFFHOOK: wasPlaying = isPlaying(); pause(); break; case TelephonyManager.CALL_STATE_RINGING: wasPlaying = isPlaying(); pause(); break; } } } public static class MediaButtonReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { KeyEvent event = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); if (event.getAction() != KeyEvent.ACTION_DOWN) return; switch (event.getKeyCode()) { case KeyEvent.KEYCODE_MEDIA_PLAY: case KeyEvent.KEYCODE_MEDIA_PAUSE: case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: context.sendBroadcast(new Intent("com.andreadec.musicplayer.playpause")); return; case KeyEvent.KEYCODE_MEDIA_PREVIOUS: context.sendBroadcast(new Intent("com.andreadec.musicplayer.previousNoRestart")); return; case KeyEvent.KEYCODE_MEDIA_NEXT: context.sendBroadcast(new Intent("com.andreadec.musicplayer.next")); return; } } } }