Intereting Posts

Справка по PROXIMITY_SCREEN_OFF_WAKE_LOCK в Android

Я включил блик wakeelock в своем приложении, и он отключает экран, когда датчик приближения обнаруживает что-то. Но есть проблема, когда экран просыпается – он идет на экран блокировки, а не на мое приложение. Это происходит независимо от времени отключения экрана (даже если датчик очищается через несколько секунд). Вот код, который я использовал:

int PROXIMITY_SCREEN_OFF_WAKE_LOCK = 32; mProximityWakeLock = pm.newWakeLock(PROXIMITY_SCREEN_OFF_WAKE_LOCK, LOG_TAG); if(!mProximityWakeLock.isHeld()){ mProximityWakeLock.acquire(); } 

Есть ли способ исправить это поведение?

Вы можете отключить экран блокировки, если он не является безопасным, используя:

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 

Вы можете вызвать его при создании, чтобы предотвратить появление экрана блокировки или когда вам нужно. Я использую его в сочетании с:

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

Кажется, что это не мешает близости.

Если вы используете mProximityWakeLock.release(); , Попробуйте использовать mProximityWakeLock.release(1);

Ссылка API также скрыта, но вы можете посмотреть исходный код: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/os /PowerManager.java#PowerManager.WakeLock.release%28int%29

Как у вас удалось повернуть экран назад? Мне удалось отключить экран, когда сенсор закрыт, используя:

 WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.buttonBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_OFF; lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_OFF; etWindow().setAttributes(lp); 

И после этого «высвобождение» или «перепродажа» крышки с / на датчике не будет выполнять другую часть кода:

 WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.buttonBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE; lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE; etWindow().setAttributes(lp); 

Помимо wakeLock от PowerManager вы должны создать блокировку KeyGuard следующим образом:

 private WakeLock mWakeLock = null; private KeyguardLock mKeyguardLock = null; public void enableProximitySensor() { PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PROXIMITY_SCREEN_OFF_WAKE_LOCK, LOG_TAG); mWakeLock.acquire(); KeyguardManager km = (KeyguardManager) getApplicationContext().getSystemService(Context.KEYGUARD_SERVICE); mKeyguardLock = mManager.newKeyguardLock( KEYGUARD_TAG ); } public void disableProximitySensor() { if ( null != mWakeLock ) { mWakeLock.release(); mWakeLock = null; } if ( null != mKeyguardLock ) { mKeyguardLock.disableKeyguard(); mKeyguardLock = null; } } 

Создайте эту блокировку только в то же время, когда вы приобретаете блокировку слежения за близостью, а экран блокировки будет работать все время в вашем приложении.

Я использую этот код

 import android.content.Context; import android.os.PowerManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private PowerManager mPowerManager; private PowerManager.WakeLock mWakeLock; private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); } public void activateSensor(View v) { Toast.makeText(MainActivity.this, "Proximity On", Toast.LENGTH_LONG).show(); if (mWakeLock == null) { mWakeLock = mPowerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "incall"); } if (!mWakeLock.isHeld()) { Log.d(TAG, "New call active : acquiring incall (CPU only) wake lock"); mWakeLock.acquire(); } else { Log.d(TAG, "New call active while incall (CPU only) wake lock already active"); } } public void deactivateSensor(View v) { Toast.makeText(MainActivity.this, "Proximity Off", Toast.LENGTH_LONG).show(); if (mWakeLock != null && mWakeLock.isHeld()) { mWakeLock.release(); Log.d(TAG, "Last call ended: releasing incall (CPU only) wake lock"); } else { Log.d(TAG, "Last call ended: no incall (CPU only) wake lock were held"); } } } 

В манифесте:

 <uses-permission android:name="android.permission.WAKE_LOCK" /> 

В моем макете:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.proximitysensor.MainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/activity_main_turn_on_screen" android:onClick="activateSensor" android:text="@string/activity_main_activate_sensor" /> <Button android:id="@+id/activity_main_turn_on_screen" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:onClick="deactivateSensor" android:text="@string/activity_main_deactivate_sensor" /> </RelativeLayout> 

Если это подходит для вашего приложения, вы можете использовать

 getWindow().addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED | LayoutParams.FLAG_IGNORE_CHEEK_PRESSES); 
 private WakeLock mProximityWakeLock= null; mProximityWakeLock= pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP , LOG_TAG); 

Приобретение блокировки, когда экран необходимо включить и отпустить при необходимости, чтобы отключиться, т.е. наоборот, над WakeLock будет работать нормально.