2012-12-19 8 views
8

ギャラクシーSamsung SIIIでは、ユーザーが画面を見ているときに画面が消えるのを防ぐオプションを設定することができます。私は、携帯電話がカメラやプレゼンスのセンサーの一種を使用していると思う。アンドロイドでのユーザーの存在を検出するにはどうすればよいですか?

  1. プログラムで行うことは可能ですか?
  2. 場合でも、一部のデバイスはそれを行うことができません。ここでは、カメラ、加速度計、さらにはユーザーのアクティビティを使用して、いくつかの可能性を想像しています。画面がオンになっていれば、わかりません。アンドロイドには「ユーザーの存在」に関する特定のライブラリがありますか?利用可能なすべてのセンサーのベストを使用する?
+2

通常、Xが必要な場合は、Y:Inactivity - > http://stackoverflow.com/questions/4208730/how-to-detect-user-inactivity-in-androidを検索します。ユーザーのアクティビティ –

+3

SIIIは前面に向いたカメラを使用して顔の特徴を定期的にチェックします。 –

+0

しかし、@KenWhite、私はある種の「顔認識」ソフトウェア(またはチップセット)もあると思います。あなたはそれを使用することが可能かどうか知っていますか?またはあなたのアプリは自分の顔認識をする必要がありますか? iOSにはネイティブ機能があることを知っています。 –

答えて

5

はい、そのようなものがあります。

SensorManagerを使用してセンサーイベントを取得できます。

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

しかし、もちろん、彼は一人ですべての仕事をすることはできません。たとえば、ライトSensorはあなたのために便利になります。あなたの光センサーをプログラムして、画面が明るくなったときを見てください。本当なら、でなければなりません。そして、加速度計を使用して(あなたが言ったように)あなたを助けることができます。

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

また、あなたのManifest.xmlでこの機能を宣言します:

何が「人感センサー」と呼ばれることはあるかもしれない、私はいくつかのコードを発見し、それを適応し、クラスがこのようなものでなければなりません光/近接センサー。しかし、近接センサは通常5cmの範囲しかないので使用できません。

enter image description here

+0

ありがとうセルジオ!私はそれをテストします。これらのセンサーを使用する特別な許可はありますか? –

+1

はい!私はあなたに言って忘れちゃった、私は質問を編集します^^ –

+0

コードの最初の部分、 "光センサー"は5cmのものか "画面がオン/オフ"のようなものですか?私は、画面がオンであることを知ることができれば、すでに十分に良いと思います。 –

0

あなたは、ユーザの顔を検出し、したがって、ユーザの存在を確認するために、デバイスのフロントカメラを使用することができます。良いことは、これは前面のカメラと任意のアンドロイド携帯電話で動作することができるということです。

Hereは、Google PlayサービスのVission APIを使用してどのように達成できるかを示すGitHubのライブラリです。

関連する問題