接近传感器在一分钟后停止工作

时间:2019-07-02 05:44:14

标签: android

我正在构建一个应用程序,其中使用接近传感器检测物体离屏幕的距离很近,并且在我打开或关闭屏幕的时候。 接近传感器可以正常工作,但是在一分钟后接近传感器停止工作,并且我无法检测到物体靠近或远离移动屏幕。 在注册接近传感器后,当我打开谷歌地图(这也是我的应用程序的一部分)时,接近传感器立即停止工作。我真的不明白为什么会这样。

public class ScreenOnOff extends AppCompatActivity {

    Button btn_on,btn_off;
    SensorManager mySensorManager;
    Sensor myProximitySensor;
    private PowerManager powerManager;
    private PowerManager.WakeLock wakeLock;
    private int field = 0x00000020;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_screen_on_off);

        btn_on = findViewById(R.id.sensor_on);
        btn_off = findViewById(R.id.sensor_off);


        mySensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);

        myProximitySensor = mySensorManager.getDefaultSensor(
                Sensor.TYPE_PROXIMITY);

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

        btn_on.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (myProximitySensor == null) {
                    Toast.makeText(ScreenOnOff.this, "sensor not available", Toast.LENGTH_SHORT).show();
                } else {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                        mySensorManager.registerListener(proximitySensorEventListener, myProximitySensor,
                                SensorManager.SENSOR_DELAY_NORMAL);
                    }
                    Toast.makeText(ScreenOnOff.this, "Enable autolock mode", Toast.LENGTH_SHORT).show();
                }

            }
        });

        btn_off.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mySensorManager.unregisterListener(proximitySensorEventListener, myProximitySensor);
                Toast.makeText(ScreenOnOff.this, "Disable autolock mode", Toast.LENGTH_SHORT).show();
            }
        });

    }

    SensorEventListener proximitySensorEventListener
            = new SensorEventListener() {
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }
        @Override
        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) {

                if (event.values[0] == 0) {
                    if(!wakeLock.isHeld()) {
                        wakeLock.acquire();
                        Log.d("screenvalue:", String.valueOf(event.values[0]));
                    }
                } else {
                    if(wakeLock.isHeld()){
                        wakeLock.release();
                    }
                }
            }
        }
    };
}

1 个答案:

答案 0 :(得分:0)

尝试这种方法:

public class ScreenOnOff extends AppCompatActivity implements SensorEventListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_screen_on_off);

        ....

        btn_on.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (myProximitySensor == null) {
                    Toast.makeText(ScreenOnOff.this, "sensor not available", Toast.LENGTH_SHORT).show();
                } else {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                        mySensorManager.registerListener(ScreenOnOff.this, myProximitySensor,
                            SensorManager.SENSOR_DELAY_NORMAL);
                    }
                    Toast.makeText(ScreenOnOff.this, "Enable autolock mode", Toast.LENGTH_SHORT).show();
                }
            }
        });

        btn_off.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mySensorManager.unregisterListener(ScreenOnOff.this, myProximitySensor);
                Toast.makeText(ScreenOnOff.this, "Disable autolock mode", Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
    @Override
    public void onSensorChanged(SensorEvent event) {
        // TODO Auto-generated method stub
        if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) {

            if (event.values[0] == 0) {
                if(!wakeLock.isHeld()) {
                    wakeLock.acquire();
                    Log.d("screenvalue:", String.valueOf(event.values[0]));
                }
            } else {
                if(wakeLock.isHeld()){
                    wakeLock.release();
                }
            }
        }
    }
}

但是请记住,这是在onResume中注册监听器并在onPause活动中取消注册监听器的更好方法。 (使用适当的布尔值控制注册)