2012-12-19 43 views
8

Tôi biết trong Galaxy Samsung SIII có thể cấu hình trong cài đặt một tùy chọn để tránh màn hình tắt khi người dùng đang nhìn vào màn hình. Tôi nghĩ rằng điện thoại sử dụng máy ảnh hoặc một loại cảm biến có mặt.Cách phát hiện sự hiện diện của người dùng trong Android?

  1. có thể thực hiện theo chương trình không?
  2. ngay cả khi có, một số thiết bị sẽ không thể thực hiện điều đó. Tôi hình dung một số khả năng ở đây: sử dụng máy ảnh, gia tốc kế hoặc thậm chí là hoạt động của người dùng: nếu màn hình đang bật, chạm vào, tôi không biết. Có một thư viện cụ thể về "sự hiện diện của người dùng" cho android? Sử dụng tốt nhất của tất cả các cảm biến khi có sẵn?
+2

Thông thường nếu tôi muốn X tôi sẽ tìm Y: Không hoạt động -> http://stackoverflow.com/questions/4208730/how-to-detect-user-inactivity-in-android Ngoài ra còn có câu trả lời liên quan đến Hoạt động của người dùng. –

+3

SIII sử dụng camera mặt trước để kiểm tra định kỳ các tính năng khuôn mặt. (Có thông tin trong tài liệu, bao gồm cảnh báo rằng nó làm giảm tuổi thọ pin bằng cách bật nó.) –

+0

Nhưng @KenWhite, tôi nghĩ rằng có một loại phần mềm "nhận diện khuôn mặt" (hoặc chipset). Bạn có biết liệu có thể sử dụng nó không? Hoặc ứng dụng của bạn cần phải nhận diện khuôn mặt của riêng bạn? Tôi biết iOS có chức năng bản địa về điều đó. –

Trả lời

5

Có, có điều gì đó tương tự.

Bạn có thể sử dụng SensorManager để nhận sự kiện cảm biến. Ví dụ, Light Sensor sẽ có ích cho bạn:

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

Nhưng tất nhiên anh ta không thể làm tất cả những công việc một mình. Lập trình cảm biến ánh sáng của bạn để xem khi nào màn hình trở nên sáng hơn, nếu đúng là nên nghĩa là người dùng không còn tìm đến màn hình đó nữa. Và bạn có thể sử dụng gia tốc kế (như bạn đã nói) để giúp bạn. Tôi tìm thấy một số mã và chuyển thể nó, lớp nên một cái gì đó như thế này:

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

Cũng tuyên bố tính năng này trong manifest.xml của bạn:

Những gì bạn gọi là "Presence Sensor" có thể là Cảm biến ánh sáng/tiệm cận. Nhưng bạn không thể sử dụng cảm biến tiệm cận vì nó thường chỉ có phạm vi 5cm.

enter image description here

+0

Cảm ơn Sergio! Tôi sẽ kiểm tra nó. Có một sự cho phép đặc biệt để sử dụng các cảm biến này? –

+1

Đúng vậy!Tôi chỉ quên nói với bạn, tôi sẽ chỉnh sửa câu hỏi của tôi ^^ –

+0

đoạn mã đầu tiên, "cảm biến ánh sáng" là một trong 5cm hoặc nó giống như "màn hình bật/tắt"? Tôi nghĩ rằng nếu tôi có thể biết màn hình là ON là đã đủ tốt. –

0

Bạn có thể sử dụng camera phía trước của thiết bị để phát hiện khuôn mặt của người dùng và do đó kiểm tra sự hiện diện của người sử dụng. Điều tốt là điều này có thể làm việc trên bất kỳ điện thoại Android với camera phía trước.

Here là thư viện từ GitHub thể hiện cách bạn có thể đạt được nó bằng API phân phối của Google Play Services.