Мое приложение является номеронабирателем, и когда пользователь держит телефон рядом с головой, мне нужно выключить экран и предотвратить нажатие на элементы управления - как в обычном режиме набора номера Android. Какой уровень API мне нужен и как это сделать правильно?
Отключить экран программно, когда лицо закрывает экран на Android
Ответы (4)
Я нашел решение, разобрав одно очень известное приложение VoIP. Это действие после нажатия кнопки 1 отключит экранные и аппаратные клавиши, когда вы закроете датчики. После нажатия кнопки 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
- person Muzikant; 03.03.2014
PROXIMITY_SCREEN_OFF_WAKE_LOCK
был добавлен в API 21 (developer.android.com/reference/android/os/PowerManager)!
- person Astrogator; 13.12.2018
Следующий код показывает, как использовать датчик приближения:
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);
}}
попробуйте эту ссылку для использования датчика приближения пока лицо находится близко к экрану, выключите экран.
Надеюсь, это поможет вам.
params.flags |= LayoutParams.FLAG_KEEP_SCREEN_OFF; params.screenBrightness = 0; getWindow().setAttributes(params)
, надеюсь, это поможет.
- person i.n.e.f; 20.02.2014
FLAG_KEEP_SCREEN_OFF
- person suitianshi; 23.12.2015
Есть много устройств, где загрузка ЦП становится высокой, если вы попробуете метод, опубликованный Солкиным (с использованием wakelock). Это ошибка Android-устройств.
Вы должны использовать событие onSensorChanged и просто отображать черный экран, чтобы избежать каких-либо проблем.
Лучший способ - использовать DialogFragment, вы показываете черный экран и закрываете его.
@Override
public final void onSensorChanged(SensorEvent event) {
float distance = event.values[0];
if(distance <10f)
showDialogFragment()
else
hideDialogFragment()
}