Использование фонарика отключает SensorListener и акселерометр

Я разрабатываю приложение, в котором, если экран телефона обращен вверх, фонарик начинает мигать. Если экран телефона направлен вниз, то фонарик должен перестать мигать. Для определения того, обращен ли экран телефона вверх или вниз, я использую акселерометр. Код для определения ориентации экрана находится здесь:

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

Акселерометр работает нормально, и я могу определить ориентацию экрана ПОКА. Я вызываю метод flashlightFrequency(). При включении фонарика телефон больше не регистрирует движения. Вроде фонарик отменяет SensorListener. Всякий раз, когда фонарик включен, я не могу использовать акселерометр для определения ориентации экрана.


person Sumsar9000    schedule 31.10.2017    source источник


Ответы (1)


Решение состояло в том, чтобы реализовать flashlightFrequency() в классе IntentService. При этом фонарик будет работать в фоновом режиме и, следовательно, не будет мешать работе акселерометра.

person Sumsar9000    schedule 02.11.2017