2011-06-13 28 views
5

Uygulamamdaki yakınlık uyanıklığını etkinleştirdim ve yakınlık sensörü bir şey algıladığında ekranı kapattı. Ama ekran geri uyandığında bir sorun var - benim app değil, kilit ekrana gider. Bu, ekranın kapalı olduğu süreden bağımsız olarak gerçekleşir (sensör birkaç saniye sonra temizlense bile). İşte kullandığım kod:Android'de PROXIMITY_SCREEN_OFF_WAKE_LOCK Yardımı

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

Bu davranışı düzeltmenin bir yolu var mı?

cevap

2

Eğer mProximityWakeLock.release(); kullanıyorsanız, API başvuru da gizlidir mProximityWakeLock.release(1);

kullanmayı deneyin, ancak kaynak koduna bakabilirsiniz: Değilse, 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

+0

sayesinde, zaten mProximityWakeLock.release kullanıyorum (1). Çalışmak için yansıma kullandım ve kesinlikle işe yarıyor - yakınlık sensörünü kapattığımda ekran kapanıyor ve temizlediğimde tekrar yanıyor. Sadece istediğim gibi olmayan kilit ekranına gider. – user496854

+0

@ user496854 mProximityWakeLock.release (1) ?? 'i kullanabilmek için yansımayı nasıl kullanacağınızı açıklar mısınız?Şimdiden teşekkürler – jegumi

+0

Bir yorum olarak yayınlamak için kolay bir yol yoktur, ancak devam etmek için ans ve nasıl bir cevap olarak oraya kod yazabilirsiniz – user496854

4

Kilit ekranı sayabilirsiniz kullanarak güvenli bir,:

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

hiç görünen ya da gerektiğinde gelen kilit ekranı önlemek için oluşturulması üzerinde diyoruz ya. Bunu, yakınlık kilidine müdahale edebilecek gibi görünmüyor.

+0

Benim için kilit ekranı devre dışı bırakmayın uygulaması? Bunu yapmak istemiyorum - Kilit ekranının düzgün çalışmasını istiyorum. Yapmaması gerektiğinde kilitlenmesini istemiyorum (yakınlık sensörü serbest bırakıldığında ve ekran tekrar açıldığında). Beklenen davranış, yeterince uzun zaman aşımı süresinin kilitli ekranın etkinleştirilmediğine karar vermedikçe, ekranım benim uygulamama geri dönmesidir. – user496854

1

Ekranı nasıl geri dönüştürebilirim? sensörün üzerine, diğer kısmı yürütmez/dan "serbest" veya kapağı "Sıfırlanmasını",

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

ve bundan sonra: Ben kullanarak, sensör kaplıdır zaman kapalı ekranı açmak için yönetilen kod:

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

uyandırma kilidi yanında PowerManager dan böyle KeyGuard kilidi oluşturmalısınız:

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; 
    } 
} 

sadece w olacak yakınlık uyandırma kilit ve kilit ekranı kazanmak aynı zamanda bu kilidi oluştur Başvurunuzda diğer tüm zamanlar ork. o Uygulamanız için uygun değilse ekran üzerinde ve ince çalışacak Uyandırma kilidi yukarıda ters yani kapalı gerektiğinde serbest bırakmak için gerektiğinde

+0

Bu, kilit ekranının nasıl durmasını sağlar? – user496854

+0

Eh, bu çözüm bana aynı durumda yardımcı oldu =) Aynı sorunla karşı karşıya kaldım - telefon kulak kilidi ekranından uzaklaştıktan sonra ekran beliriyor. KeyguardLock kullanımı bana yardımcı olur. Örnek kod düşüncelerimi açıklığa kavuşturmak için biraz düzenlenmiştir. –

+0

Bunun ek bir izin gerektirdiğine dikkat (DISABLE_KEYGUARD) –

0

Eğer

getWindow().addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED | LayoutParams.FLAG_IGNORE_CHEEK_PRESSES); 
0
private WakeLock mProximityWakeLock= null; 

mProximityWakeLock= pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP , LOG_TAG); 

Kazanılması kilidini kullanabilirsiniz.

1

Ben Manifest'te Bu kodu

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"); 
     } 
    } 

} 

kullanın:

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

Benim düzende:

<?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> 
+0

Çok güzel kod, iyi iş! Bir sorum var. Ekranı sadece ** tuşuna basarak ** kullanarak kodunuzu kapatabilir miyim? (yakınlık sensörü yok!) – Dake

+0

Yakınlık sensörü olmadan bilmiyorum ... bunu kontrol edebilirsiniz [link] (http://stackoverflow.com/questions/6756768/turn-off-screen-on-android) .. . afedersiniz. – Cabezas

+0

Sorun değil. Yine de küçük bir sorun var. Mevcut kodunuz ekranı kapatır, ayrıca herhangi bir açık uygulamayı "duraklatır". Örneğin, bir oyun sırasında ekran kapanırsa, oyun "duraklatılır". ** Sadece ekranı kapatmak istiyorum ** ve cihazı normal şekilde çalıştırıyorum. Mümkün mü? – Dake