使用手电筒取消SensorListener和加速度计

时间:2017-10-31 13:00:26

标签: android accelerometer sensor flashlight

我正在开发一个应用程序,如果手机屏幕朝上,手电筒开始闪烁。如果手机的屏幕朝下,手电筒将停止闪烁。为了检测手机的屏幕是朝上还是朝下,我使用的是加速度计。检测屏幕方向的代码如下:

@Override
    protected void onResume() {
        super.onResume();
        smAccelerometer.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause() {
        super.onPause();
        smAccelerometer.unregisterListener(this);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        int type = event.sensor.getType();
        if (type == Sensor.TYPE_ACCELEROMETER) {
            float gz = event.values[2];
            if (mGZ == 0) {
                mGZ = gz;
            } else {
                if ((mGZ * gz) < 0) {
                    mEventCountSinceGZChanged++;
                    if (mEventCountSinceGZChanged == MAX_COUNT_GZ_CHANGE) {
                        mGZ = gz;
                        mEventCountSinceGZChanged = 0;
                        if (gz > 0) {
                            Log.d(TAG, "now screen is facing up.");
                            Toast toast = Toast.makeText(MainActivity.this, "Up", Toast.LENGTH_SHORT);
                            toast.show();
                            flashlightFrequency();
                        } else if (gz < 0) {
                            Log.d(TAG, "now screen is facing down.");
                            Toast toast = Toast.makeText(MainActivity.this, "Down", Toast.LENGTH_SHORT);
                            toast.show();


                        }
                    }
                } else {
                    if (mEventCountSinceGZChanged > 0) {
                        mGZ = gz;
                        mEventCountSinceGZChanged = 0;
                    }
                }
            }
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // TODO Auto-generated method stub
    }

从这段代码中可以看出,每当屏幕朝上时,我都会调用方法flashlightFrequency(),以便间隔开启和关闭手电筒:

public void flashlightFrequency() {
        String myString = "0101010101";
        int frequency = 2000; //Delay in ms
        CameraManager camManager;
        String cameraId = null; // Usually front camera is at 0 position.

        camManager = (CameraManager) getApplicationContext().getSystemService(Context.CAMERA_SERVICE);
        try {
            cameraId = camManager.getCameraIdList()[0];
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            for (int i = 0; i <= myString.length(); i++) {
                if (i == myString.length()) {
                    flashlightFrequency();
                }

                if (myString.charAt(i) == '0') {
                    try {
                        camManager.setTorchMode(cameraId, true);
                    } catch (CameraAccessException e) {
                        e.printStackTrace();
                    }
                } else {
                    try {
                        camManager.setTorchMode(cameraId, false);
                    } catch (CameraAccessException e) {
                        e.printStackTrace();
                    }
                }
                try {
                    Thread.sleep(frequency);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

加速度计工作正常,我能够检测到屏幕的方向 UNTIL 我调用方法flashlightFrequency()。当手电筒启动时,手机不再注册动作。手电筒似乎取消了SensorListener。只要手电筒打开,我就无法使用加速度计来检测屏幕的方向。

1 个答案:

答案 0 :(得分:0)

解决方案是在IntentService类中实现flashlightFrequency()。通过这样做,手电筒将在后台运行,因此不会干扰加速度计。