A concrete implementation example of the Android receiver pattern
- 2020-05-19 05:49:37
- OfStack
1. Use proximity sensors to monitor the earphone close to the ear
The proximity sensor doesn't know exactly whether you put your phone close to your ear, maybe you put your hand in front of the proximity sensor, but that's not what we care about, what we care about is when your ear is close to the receiver, we want to capture the event
step 1, creates a new class that implements the SensorEventListener interface and implements the onSensorChanged(SensorEvent event) method
public class MainActivity extends Activity implements SensorEventListener
step 2, get an example of a distance sensor
audioManager = (AudioManager) this
.getSystemService(Context.AUDIO_SERVICE);
mSensorManager = (SensorManager) getSystemService
(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
step 3, in the onSensorChanged method to determine whether close to the receiver
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
float range = event.values[0];
if (range == mSensor.getMaximumRange()) {
Toast.makeText(this, " Normal mode ", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, " The receiver model ", Toast.LENGTH_LONG).show();
}
step 4, register the listening range sensor with SensorManager
@Override
protected void onResume() {
mSensorManager.registerListener(this, mSensor,
SensorManager.SENSOR_DELAY_NORMAL);
super.onResume();
}
@Override
protected void onPause() {
mSensorManager.unregisterListener(this);
super.onPause();
}
2. Change the AudioManager playback mode according to the distance sensor
By default, the audio is played with external speakers or headphones, so we need to code to switch the playback.
step 1, adding permission declarations to the AndroidManifest file
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
step 2, switch to play mode
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
float range = event.values[0];
if (range == mSensor.getMaximumRange()) {
Toast.makeText(this, " Normal mode ", Toast.LENGTH_LONG).show();
audioManager.setMode(AudioManager.MODE_NORMAL);
} else {
Toast.makeText(this, " The receiver model ", Toast.LENGTH_LONG).show();
audioManager.setMode(AudioManager.MODE_IN_CALL);
}
Complete code:
package com.markjoker.sensortest;
import java.io.FileInputStream;
import java.io.IOException;
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.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Menu;
import android.widget.Toast;
public class MainActivity extends Activity implements SensorEventListener {
private AudioManager audioManager;
private SensorManager mSensorManager;
private Sensor mSensor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
audioManager = (AudioManager) this
.getSystemService(Context.AUDIO_SERVICE);
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
MediaPlayer mPlayer = new MediaPlayer();
try {
mPlayer.reset();
mPlayer.setDataSource(new FileInputStream("/sdcard/snow.mp3").getFD());
mPlayer.prepare();
mPlayer.start();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void onResume() {
mSensorManager.registerListener(this, mSensor,
SensorManager.SENSOR_DELAY_NORMAL);
super.onResume();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
mSensorManager.unregisterListener(this);
super.onPause();
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
float range = event.values[0];
if (range == mSensor.getMaximumRange()) {
Toast.makeText(this, " Normal mode ", Toast.LENGTH_LONG).show();
audioManager.setMode(AudioManager.MODE_NORMAL);
} else {
Toast.makeText(this, " The receiver model ", Toast.LENGTH_LONG).show();
audioManager.setMode(AudioManager.MODE_IN_CALL);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
}