我正在开发一个应用程序,如果手机屏幕朝上,手电筒开始闪烁。如果手机的屏幕朝下,手电筒将停止闪烁。为了检测手机的屏幕是朝上还是朝下,我使用的是加速度计。检测屏幕方向的代码如下:
@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
。只要手电筒打开,我就无法使用加速度计来检测屏幕的方向。
答案 0 :(得分:0)
解决方案是在IntentService类中实现flashlightFrequency()
。通过这样做,手电筒将在后台运行,因此不会干扰加速度计。