web-dev-qa-db-fra.com

Désactiver l'écran par programme lorsque le visage ferme l'écran Android

Mon application est un numéroteur et lorsque l'utilisateur tient le téléphone près de sa tête, je dois éteindre l'écran et éviter de cliquer sur les commandes - comme le natif Android comportement du numéroteur. Quel niveau d'API dont j'ai besoin et comment Je fais ça de la bonne façon?

21
Solkin

J'ai trouvé une solution en démontant une application VoIP très célèbre. Cette activité après avoir appuyé sur le bouton 1 désactivera l'écran et les touches matérielles lorsque vous fermerez les capteurs. Après avoir appuyé sur le bouton 2, cette fonction sera désactivée.

En outre, cette fonction nécessite une autorisation:

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

Activité. Essayez-le.

public class MainActivity extends Activity {

    private Button button1;
    private Button button2;
    private PowerManager powerManager;
    private PowerManager.WakeLock wakeLock;
    private int field = 0x00000020;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        try {
            // Yeah, this is hidden field.
            field = PowerManager.class.getClass().getField("PROXIMITY_SCREEN_OFF_WAKE_LOCK").getInt(null);
        } catch (Throwable ignored) {
        }

        powerManager = (PowerManager) getSystemService(POWER_SERVICE);
        wakeLock = powerManager.newWakeLock(field, getLocalClassName());

        setContentView(R.layout.main);
        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);

        button1.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if(!wakeLock.isHeld()) {
                    wakeLock.acquire();
                }
            }
        });

        button2.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if(wakeLock.isHeld()) {
                    wakeLock.release();
                }
            }
        });
    }
}
43
Solkin

Le code suivant vous montre comment utiliser le capteur de proximité:

public class SensorActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mProximity;

 @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
 public final void onAccuracyChanged(Sensor sensor, int accuracy) {
// Do something here if sensor accuracy changes.
 }

 @Override
  public final void onSensorChanged(SensorEvent event) {
   float distance = event.values[0];
// Do something with this sensor data.
   }

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

 @Override
  protected void onPause() {
// Be sure to unregister the sensor when the activity pauses.
super.onPause();
mSensorManager.unregisterListener(this);
 }}

essayez ce lien pour l'utilisation du capteur de proximité lorsque le visage est proche de l'écran éteignez l'écran.

J'espère que cela vous aide.

3
i.n.e.f

Il y a beaucoup d'appareils où l'utilisation du CPU est élevée si vous essayez la méthode publiée par Solkin (en utilisant le wakelock). Il s'agit d'un bogue dans les appareils Android.

Vous devez utiliser l'événement onSensorChanged et afficher simplement un écran noir pour éviter tout problème.

2
justingregoryuk