/** * Execute the given action. * * @param action The action to execute. * @param receiver Optional. If non-null, update the PlaybackActivity with * new song or state from the executed action. The activity will still be * updated by the broadcast if not passed here; passing it just makes the * update immediate. */ public void performAction(Action action, PlaybackActivity receiver) { switch (action) { case Nothing: break; case Library: Intent intent = new Intent(this, LibraryActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); break; case PlayPause: { int state = playPause(); if (receiver != null) receiver.setState(state); break; } case NextSong: { Song song = shiftCurrentSong(SongTimeline.SHIFT_NEXT_SONG); if (receiver != null) receiver.setSong(song); break; } case PreviousSong: { Song song = shiftCurrentSong(SongTimeline.SHIFT_PREVIOUS_SONG); if (receiver != null) receiver.setSong(song); break; } case NextAlbum: { Song song = shiftCurrentSong(SongTimeline.SHIFT_NEXT_ALBUM); if (receiver != null) receiver.setSong(song); break; } case PreviousAlbum: { Song song = shiftCurrentSong(SongTimeline.SHIFT_PREVIOUS_ALBUM); if (receiver != null) receiver.setSong(song); break; } case Repeat: { int state = cycleFinishAction(); if (receiver != null) receiver.setState(state); break; } case Shuffle: { int state = cycleShuffle(); if (receiver != null) receiver.setState(state); break; } case EnqueueAlbum: enqueueFromCurrent(MediaUtils.TYPE_ALBUM); break; case EnqueueArtist: enqueueFromCurrent(MediaUtils.TYPE_ARTIST); break; case EnqueueGenre: enqueueFromCurrent(MediaUtils.TYPE_GENRE); break; case ClearQueue: clearQueue(); Toast.makeText(this, R.string.queue_cleared, Toast.LENGTH_SHORT).show(); break; case ShowQueue: Intent intentShowQueue = new Intent(this, ShowQueueActivity.class); intentShowQueue.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intentShowQueue); break; case ToggleControls: // Handled in FullPlaybackActivity.performAction break; case SeekForward: if (mCurrentSong != null) { mPendingSeekSong = mCurrentSong.id; mPendingSeek = getPosition() + 10000; // We 'abuse' setCurrentSong as it will stop the playback and restart it // at the new position, taking care of the ui update setCurrentSong(0); } break; case SeekBackward: if (mCurrentSong != null) { mPendingSeekSong = mCurrentSong.id; mPendingSeek = getPosition() - 10000; if (mPendingSeek < 1) mPendingSeek = 1; // must at least be 1 setCurrentSong(0); } break; default: throw new IllegalArgumentException("Invalid action: " + action); } }
public class SettingsContentObserver extends ContentObserver { Context context; public SettingsContentObserver(Context c, Handler handler) { super(handler); context = c; } @Override public boolean deliverSelfNotifications() { return super.deliverSelfNotifications(); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); } }
SettingsContentObserver mSettingsContentObserver = new SettingsContentObserver(this, new Handler()); getApplicationContext().getContentResolver().registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, mSettingsContentObserver);
// for a catch volume change public class SettingsContentObserver extends ContentObserver { int previousVolume; Context context; int prevdelta=0; public SettingsContentObserver(Context c, Handler handler) { super(handler); context = c; AudioManager audio = mAudioManager; previousVolume = audio.getStreamVolume(AudioManager.STREAM_MUSIC); } @Override public boolean deliverSelfNotifications() { return super.deliverSelfNotifications(); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); AudioManager audio = mAudioManager; int currentVolume = audio.getStreamVolume(AudioManager.STREAM_MUSIC); if(isproximity && enable_vol_track_select) { // isproximity , enable_vol_track_select - // long now = SystemClock.elapsedRealtime(); if (now - mLastVolChangeTime > MIN_SHAKE_PERIOD * 8) { // handler , undo_volume_change(); delta = previousVolume - currentVolume; mLastVolChangeTime = now; if (delta > 0) { performAction(Action.NextSong, null); // previousVolume = currentVolume; } else if (delta <= 0) { performAction(Action.PreviousSong, null); // previousVolume = currentVolume; } prevdelta = delta; } else { int difvol = currentVolume - audio.getStreamVolume(AudioManager.STREAM_MUSIC); previousVolume = difvol + currentVolume; } }else delta=0; } }
boolean isproximity = false; // boolean enable_vol_track_select = true; // long mLastVolChangeTime=0; // int delta = 0; //
void undo_volume_change() { // undo volume change afer next-prev comand android.os.Handler h = new Handler() { int currentVolume; public void handleMessage(android.os.Message msg) { switch (msg.what) { case 1: currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); break; case 2: if(isproximity) { if(mMediaPlayer.isPlaying() ) { if(Math.abs(delta)==1) { mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume + delta, AudioManager.FLAG_SHOW_UI); Log.d("PLEER", " setStreamVolume Volume=" + String.valueOf(currentVolume)); } } } else { delta=0; currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); } break; } }; }; h.sendEmptyMessage(1); h.sendEmptyMessageDelayed(2,1000); }
private void setupSensor() { if (mSensorManager == null) mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_GAME); mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),SensorManager.SENSOR_DELAY_NORMAL); }
if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) { if( event.values[0] == 0)isproximity = true; else isproximity = false; }
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) // { { double x = event.values[0]; double y = event.values[1]; double z = event.values[2]; double accel = Math.sqrt(x * x + y * y + z * z); double delta = accel - mAccelLast; mAccelLast = accel; double filtered = mAccelFiltered * 0.9f + delta; mAccelFiltered = filtered; // Log.d("PLEER", " filtered = " + String.valueOf(filtered)); if (filtered > 3.5 ) // { // } }
mHandler.removeMessages(MSG_FADE_OUT); mHandler.removeMessages(MSG_IDLE_TIMEOUT); if (mIdleTimeout != 0) mHandler.sendEmptyMessageDelayed(MSG_IDLE_TIMEOUT, mIdleTimeout * 1000);
if (se.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { double x = se.values[0]; double y = se.values[1]; double z = se.values[2]; double accel = Math.sqrt(x * x + y * y + z * z); double delta = accel - mAccelLast; mAccelLast = accel; double filtered = mAccelFiltered * 0.9f + delta; mAccelFiltered = filtered; if (filtered > mShakeThreshold && mShakeAction !=Action.Nothing); { long now = SystemClock.elapsedRealtime(); if (now - mLastShakeTime > MIN_SHAKE_PERIOD) { mLastShakeTime = now; performAction(mShakeAction, null); } } if (filtered > 3.5 && enable_defer_stop) // c { mHandler.removeMessages(MSG_FADE_OUT); mHandler.removeMessages(MSG_IDLE_TIMEOUT); if (mIdleTimeout != 0) mHandler.sendEmptyMessageDelayed(MSG_IDLE_TIMEOUT, mIdleTimeout * 1000); } ... }
Source: https://habr.com/ru/post/268923/
All Articles