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
 }
}


Related articles: