web-dev-qa-db-fra.com

Utilisation du capteur de proximité dans Android

Je souhaite utiliser un capteur de proximité dans mon projet. J'ai cherché un didacticiel sur les capteurs de proximité. Et j'ai trouvé un didacticiel sur les capteurs sur http://www.vogella.com/articles/AndroidSensor/article.html#sensoroverview_manager . J'ai essayé d'utiliser le capteur de proximité comme code suivant:

@Override
public void onSensorChanged(SensorEvent event)
{
    if(event.sensor.getType() == Sensor.TYPE_PROXIMITY)
    {
        Toast.makeText(getApplicationContext(), "working", Toast.LENGTH_SHORT).show();
    }
}

Ma Activity implémente SensorEventListener. Mais ça ne marche pas. Dois-je utiliser une autorisation pour utiliser un capteur de proximité? Ou mon code est mauvais pour faire ce genre de choses. Votre aide sera très appréciée. Je vous remercie

10
Sanjay Joshi

J'utilise ce code:

import Android.content.Context;
import Android.hardware.Sensor;
import Android.hardware.SensorEvent;
import Android.hardware.SensorEventListener;
import Android.hardware.SensorManager;
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.widget.Toast;

public class MainActivity extends AppCompatActivity implements SensorEventListener {

    private SensorManager mSensorManager;
    private Sensor mProximity;
    private static final int SENSOR_SENSITIVITY = 4;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);

    }

    @Override
    protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(this);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) {
            if (event.values[0] >= -SENSOR_SENSITIVITY && event.values[0] <= SENSOR_SENSITIVITY) {
                //near
                Toast.makeText(getApplicationContext(), "near", Toast.LENGTH_SHORT).show();
            } else {
                //far
                Toast.makeText(getApplicationContext(), "far", Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

}

Aussi, vous pouvez vérifier ce code dans GitHub

15
Cabezas

vous devez inscrire votre auditeur. Dans votre activité:

@Override
public final void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Get an instance of the sensor service, and use that to get an instance of
    // a particular sensor.
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
}

@Override
protected void onResume() {
    // Register a listener for the sensor.
    super.onResume();
    mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
}

et ensuite, dans votre méthode onSensorChanged () surchargée, vous pouvez utiliser vos données de capteur. 

Désolé si ma réponse est trop tard =)

La bonne façon d'utiliser le capteur de proximité est via PowerManager. Oubliez le capteur de lumière et utilisez l'abstraction Android et du code déjà écrit! 

public class ProximityViaPowerManager {

private Context context;
private WakeLock proximityWakeLock;

public ProximityViaPowerManager(Context context) {
    this.context = context;
}

public boolean enableProximityWakeLock() {
    if (proximityWakeLock != null) {
      return true;
    }
    PowerManager powerManager = 
 context.getApplicationContext().getSystemService(Context.POWER_SERVICE);
    proximityWakeLock = powerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, TAG);
    proximityWakeLock.acquire();
    return true;
  }

  public void disableProximityWakeLock() {
    if (proximityWakeLock != null) {
      proximityWakeLock.release();
      proximityWakeLock = null;
    }
  }
}

Assurez-vous que la fonction d'activation/désactivation est correcte dans le cycle de vie Android, reprenez/mettez en pause et ajoutez l'autorisation de manifester:

<uses-permission Android:name="Android.permission.WAKE_LOCK" />
2
Vlad

Vous pouvez suivez ce code qui dispose du cadre de base à l’aide duquel nous pouvons programmer n’importe quel capteur.

Changer cette ligne 

linearAcceleration = senseManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);

à

proximity = senseManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
1
yuvaramsingh