Я разрабатываю приложение, в котором, если экран телефона обращен вверх, фонарик начинает мигать. Если экран телефона направлен вниз, то фонарик должен перестать мигать. Для определения того, обращен ли экран телефона вверх или вниз, я использую акселерометр. Код для определения ориентации экрана находится здесь:
@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
. Всякий раз, когда фонарик включен, я не могу использовать акселерометр для определения ориентации экрана.