2012-12-19 6 views
8

Ich weiß in Galaxy Samsung SIII ist es möglich, in den Einstellungen eine Option zu konfigurieren, um zu vermeiden, dass der Bildschirm ausschaltet, wenn der Benutzer in den Bildschirm schaut. Ich denke, das Telefon nutzt die Kamera oder eine Art Präsenzsensor.Wie erkennen Benutzer Präsenz in Android?

  1. ist es möglich, es programmatisch zu tun?
  2. auch wenn ja, einige Geräte werden nicht dazu in der Lage sein. Ich stelle mir hier einige Möglichkeiten vor: Verwendung der Kamera, Beschleunigungssensor oder sogar Benutzeraktivität: Wenn der Bildschirm eingeschaltet ist, berührt, weiß ich nicht. Es gibt eine spezielle Bibliothek über "Benutzerpräsenz" für Android? Verwenden Sie den besten aller Sensoren, wenn verfügbar?
+2

Normalerweise, wenn ich X will, werde ich nach Y suchen: Inaktivität -> http://stackoverflow.com/questions/4208730/how-to-detect-user-inactivity-in-android Es gibt auch eine Antwort zu Aktivität vom Benutzer. –

+3

Der SIII verwendet die Frontkamera, um regelmäßig nach Gesichtsmerkmalen zu suchen. (Es gibt Informationen in der Dokumentation, einschließlich einer Warnung, dass es Akkulaufzeit reduziert, indem Sie es aktivieren.) –

+0

Aber @KenWhite, ich denke, es gibt auch eine Art "Gesichtserkennung" Software (oder Chipsatz). Weißt du, ob es möglich ist, das zu benutzen? Oder Ihre App muss Ihre eigene Gesichtserkennung durchführen? Ich weiß, iOS hat native Funktionen dazu. –

Antwort

5

Ja, da ist so etwas.

Sie können SensorManager verwenden, um Sensorereignisse zu erhalten. Zum Beispiel Licht Sensor wird für Sie nützlich sein:

private SensorManager sensorManager; 
private Sensor lightSensor; 
private float lightAmount; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 
    lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); 

    SensorEventListener listener = new SensorEventListener() { 
     @Override 
     public void onSensorChanged(SensorEvent event) { 
      // returns the current light amount 
      lightAmount = event.data[0]; 
     } 

    lightSensor.registerListener(listener); 
} 

Aber natürlich ist er nicht allein die ganze Arbeit erledigen kann. Programmieren Sie Ihren Lichtsensor, um zu sehen, wenn der Bildschirm heller wird, wenn bedeutet, dass der Benutzer nicht mehr darauf schaut. Und Sie können den Beschleunigungssensor (wie Sie sagten) verwenden, um Ihnen zu helfen. Ich fand einige Code und angepasst es, sollte die Klasse so etwas wie dieses:

public class AccelerometerDetector { 

    boolean isAvailable = false; 
    boolean isEnabled = false; 

    /** 
    * Constructor. 
    * 
    * @param enable : True to enable the accelerometer 
    * @throws UnsupportedOperationException 
    * - thrown if the Accelerometer is not available on the current device. 
    */ 
    public AccelerometerDetector(boolean enable) 
      throws UnsupportedOperationException 
    { 
      /* Check if the sensor is available */ 
      for (String accelerometer : Sensors.getSupportedSensors()) 
        if (accelerometer.equals(Sensors.SENSOR_ACCELEROMETER)) 
          isAvailable = true; 

      if (!accelerometerAvailable) 
        throw new UnsupportedOperationException(
            "Accelerometer is not available."); 

      if (enable) 
        setEnableAccelerometer(true); 
    } 

    /** 
    * Set if the Accelerometer is enabled or not. 
    * 
    * @param enable 
    * @throws UnsupportedOperationException 
    */ 
    public void setEnableAccelerometer(boolean enable) 
      throws UnsupportedOperationException 
    { 
      if (!accelerometerAvailable) 
        throw new UnsupportedOperationException(
            "Accelerometer is not available."); 

      /* If should be enabled and isn't already */ 
      if (enable && !this.isEnabled) { 
        Sensors.enableSensor(Sensors.SENSOR_ACCELEROMETER); 
        this.isEnabled = true; 
      } else /* If should be disabled and isn't already */ 
      if (!enable && this.isEnabled) { 
        Sensors.disableSensor(Sensors.SENSOR_ACCELEROMETER); 
        this.isEnabled = false; 
      } 
    } 

    /** 
    * Read the values provided by the Accelerometer. 
    * 
    * @return Current Accelerometer-values. 
    * @throws UnsupportedOperationException 
    *    if the Accelerometer is not available on this device. 
    * @throws IllegalStateException 
    *    if the Accelerometer was disabled. 
    */ 
    public float[] readAccelerometer() 
      throws UnsupportedOperationException, IllegalStateException 
    { 
      if (!isAvailable) 
        throw new UnsupportedOperationException(
            "Accelerometer is not available."); 

      if (!this.isEnabled) 
        throw new IllegalStateException(
            "Accelerometer was disabled."); 
      /* Get number of sensor-values the sensor will return. Could be 
      * variable, depending of the amount of axis (1D, 2D or 3D 
      * accelerometer). */ 
      int sensorValues = Sensors 
          .getNumSensorValues(Sensors.SENSOR_ACCELEROMETER); 
      float[] values = new float[sensorValues]; 

      /* Make the OS fill the array we passed. */ 
      Sensors.readSensor(Sensors.SENSOR_ACCELEROMETER, values); 

      return values; 
    } 
} 

Auch diese Funktion in Ihrem Manifest.xml erklären:

Was Sie „Anwesenheitssensor“ nennen könnte das sein Licht/Näherungssensor. Sie können den Näherungssensor jedoch nicht verwenden, da er normalerweise nur 5 cm Reichweite hat.

enter image description here

+0

Danke Sergio! Ich werde es testen. Es gibt eine spezielle Erlaubnis, diese Sensoren zu benutzen? –

+1

Ja ist es!Ich habe nur vergessen, Ihnen zu sagen, ich werde meine Frage bearbeiten ^^ –

+0

das erste Stück Code, der "Lichtsensor" ist das von 5cm oder es ist so etwas wie "der Bildschirm ist an/aus"? Ich denke, wenn ich wissen kann, dass der Bildschirm eingeschaltet ist, ist es schon gut genug. –

0

Sie können Gerätefrontkamera verwenden, um Benutzer Gesicht zu erkennen und damit die Anwesenheit des Benutzers zu überprüfen. Die gute Sache ist, dass dies auf jedem Android-Handy mit der Frontkamera funktionieren kann.

Here ist die Bibliothek von GitHub, die zeigt, wie Sie dies mithilfe der Vission-APIs von Google Play Services erreichen können.