【发布时间】:2014-02-19 14:58:07
【问题描述】:
我的应用是一个拨号器,当用户将手机靠近头部时,我需要关闭屏幕并防止点击控件 - 就像原生 Android 拨号器行为一样。我需要什么 API 级别以及如何以正确的方式做到这一点?
【问题讨论】:
标签: android screen android-sensors sensormanager
我的应用是一个拨号器,当用户将手机靠近头部时,我需要关闭屏幕并防止点击控件 - 就像原生 Android 拨号器行为一样。我需要什么 API 级别以及如何以正确的方式做到这一点?
【问题讨论】:
标签: android screen android-sensors sensormanager
我通过拆卸一个非常著名的 VoIP 应用程序找到了解决方案。按下 button1 后的此活动将在您关闭传感器时禁用屏幕和硬件键。按下按钮 2 后,此功能将关闭。
另外,此功能需要权限:
<uses-permission android:name="android.permission.WAKE_LOCK" />
活动。试试看。
public class MainActivity extends Activity {
private Button button1;
private Button button2;
private PowerManager powerManager;
private PowerManager.WakeLock wakeLock;
private int field = 0x00000020;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
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());
setContentView(R.layout.main);
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(!wakeLock.isHeld()) {
wakeLock.acquire();
}
}
});
button2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(wakeLock.isHeld()) {
wakeLock.release();
}
}
});
}
}
【讨论】:
PowerManager.class.getClass()而不是PowerManager.class
PROXIMITY_SCREEN_OFF_WAKE_LOCK 标志!
以下代码向您展示如何使用接近传感器:
public class SensorActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mProximity;
@Override
public final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Get an instance of the sensor service, and use that to get an instance of
// a particular sensor.
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
}
@Override
public final void onAccuracyChanged(Sensor sensor, int accuracy) {
// Do something here if sensor accuracy changes.
}
@Override
public final void onSensorChanged(SensorEvent event) {
float distance = event.values[0];
// Do something with this sensor data.
}
@Override
protected void onResume() {
// Register a listener for the sensor.
super.onResume();
mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
// Be sure to unregister the sensor when the activity pauses.
super.onPause();
mSensorManager.unregisterListener(this);
}}
尝试this 链接以在人脸靠近屏幕时使用接近传感器关闭屏幕。
希望对您有所帮助。
【讨论】:
FLAG_KEEP_SCREEN_OFF
如果您尝试使用 Solkin 发布的方法(使用唤醒锁),很多设备的 CPU 使用率会很高。这是 android 设备中的错误。
您应该使用 onSensorChanged 事件并只显示黑屏以避免任何问题。
【讨论】:
最好的方法是使用 DialogFragment,你显示一个黑屏并关闭它
@Override
public final void onSensorChanged(SensorEvent event) {
float distance = event.values[0];
if(distance <10f)
showDialogFragment()
else
hideDialogFragment()
}
【讨论】: