Search code examples
androidaudioproximity

How to use proximity sensor and audio manager to reduce volume in android device


I would like to implement a functionality in the app such that when user playing audio in his android mobile takes it nearer to his ear, volume should reduce and the audio should play through the earpiece. ( Similar way to what whats app doing when user listens to voice note and moves it near to ear.) Please suggest what is going wrong in the following code? Thanks for the help.

public class SensorActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mSensor;
ImageView iv;
Button b;
MediaPlayer player;
private AudioManager mAudioManager;
public boolean isHeadsetOn;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sensor);
    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
    iv = (ImageView) findViewById(R.id.image);
    b = (Button) findViewById(R.id.audio);
    mAudioManager = (AudioManager) SensorActivity.this.getSystemService(Context.AUDIO_SERVICE);
    mAudioManager.setMode(AudioManager.STREAM_MUSIC);

    b.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (player != null && player.isPlaying()) {
                player.stop();
                player.release();
            } else {
                AssetFileDescriptor afd;
                try {
                    afd = getAssets().openFd("Kraddy Android Porn.mp3");
                    player = new MediaPlayer();
                    player.setDataSource(afd.getFileDescriptor());
                    player.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
                    player.prepare();

                    player.start();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }
    });
}

protected void onResume() {
    super.onResume();
    mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);

}

protected void onPause() {
    super.onPause();

    try {
        // unregisterReceiver(mReciever);
        mSensorManager.unregisterListener(this);
    } catch (Exception e) {
        e.printStackTrace();
    }
    if (player != null && player.isPlaying()) {
        player.stop();
        player.release();
    }
}

public void onAccuracyChanged(Sensor sensor, int accuracy) {
}

public void onSensorChanged(SensorEvent event) {
    Log.e("distance", String.valueOf(event.values[0]));
    if (event.values[0] == 0) {
        iv.setImageResource(R.drawable.near);
        mAudioManager.setSpeakerphoneOn(false);
    } else {
        iv.setImageResource(R.drawable.far);
        mAudioManager.setSpeakerphoneOn(true);

    }
}

}


Solution

  • following code works perfectly fine for the requirement I mentioned in my post.

    package com.example.proximitysensordemo;
    
    import java.io.IOException;
    
    import android.app.Activity;
    import android.content.Context;
    import android.content.res.AssetFileDescriptor;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    import android.media.AudioManager;
    import android.media.MediaPlayer;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ImageView;
    
    public class SensorActivity extends Activity implements SensorEventListener {
        private SensorManager mSensorManager;
        private Sensor mSensor;
        ImageView iv;
        Button b;
        MediaPlayer player;
        private AudioManager mAudioManager;
        public boolean isHeadsetOn;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sensor);
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
        iv = (ImageView) findViewById(R.id.image);
        b = (Button) findViewById(R.id.audio);
        mAudioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
    
        b.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if (player != null && player.isPlaying()) {
                    player.pause();
                } else {
                    AssetFileDescriptor afd;
                    try {
                        if (player == null) {
                            afd = getAssets().openFd("Kraddy Android Porn.mp3");
                            player = new MediaPlayer();
                            player.setDataSource(afd.getFileDescriptor());
                            player.setAudioStreamType(AudioManager.STREAM_MUSIC);
                            player.prepare();
                            player.start();
                        } else {
                            player.start();
                        }
    
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
    
            }
        });
    }
    
    protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_FASTEST);
        mAudioManager.setMode(AudioManager.MODE_IN_CALL);
    }
    
    protected void onPause() {
        super.onPause();
        mAudioManager.setMode(AudioManager.MODE_NORMAL);
        try {
            // unregisterReceiver(mReciever);
            mSensorManager.unregisterListener(this);
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (player != null) {
            player.stop();
            player.release();
            player = null;
        }
    }
    
    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
    }
    
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
    
    public void onSensorChanged(SensorEvent event) {
        Log.e("distance", String.valueOf(event.values[0]));
        Log.e("MaximumRange", String.valueOf(mSensor.getMaximumRange()));
    
        if (event.values[0] < mSensor.getMaximumRange()) {
            iv.setImageResource(R.drawable.near);
            mAudioManager.setSpeakerphoneOn(false);
    
        } else {
            iv.setImageResource(R.drawable.far);
            mAudioManager.setSpeakerphoneOn(true);
        }
    }
    

    }

    Hope this helps. Thanks.
    PS: Don't forget to un-register the sensor because android system won't release the sensors automatically after the usage. If you forget to do so music player and other application which uses music player will behave odd.