8

Galaxy Samsung SIIIでは、ユーザーが画面を見ているときに画面がオフになるのを避けるオプションを設定で構成できることを知っています。電話はカメラか、ある種の存在感センサーを使っていると思います。

  1. プログラムでそれを行うことは可能ですか?
  2. はいの場合でも、一部のデバイスではそれができません。ここでいくつかの可能性を想像します: カメラ、加速度計、またはユーザー アクティビティの使用: 画面がオンの場合、タッチする場合、わかりません。Androidへの「ユーザープレゼンス」に関する特定のライブラリはありますか? 利用可能な場合は、すべてのセンサーの中で最高のものを使用しますか?
4

2 に答える 2

6

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

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

しかし、もちろん、彼だけですべての仕事をこなすことはできません。画面が明るくなったときを確認するように光センサーをプログラムします。true の場合は、ユーザーが画面を見ていないこと意味します。そして、あなたが言ったように、加速度計を使ってあなたを助けることができます. いくつかのコードを見つけて適応させました。クラスは次のようになります。

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 でこの機能を宣言します。

<uses-feature android:name="android.hardware.sensor.light" />
<uses-feature android:name="android.hardware.sensor.accelerometer" />

あなたが「存在センサー」と呼んだものは、光/近接センサーかもしれません。ただし、近接センサーは通常 5cm の範囲しかないため、使用できません。

ここに画像の説明を入力

于 2012-12-19T15:45:48.530 に答える
0

デバイスの前面カメラを使用してユーザーの顔を検出し、ユーザーの存在を確認できます。良いことは、これがフロントカメラを備えたすべてのAndroidスマートフォンで機能することです.

これは、Google Play Services の Vision API を使用してそれを実現する方法を示す GitHub のライブラリです

于 2016-12-09T16:10:37.597 に答える