2011-06-13 102 views
5

私のアプリで近接ウォークロックを有効にしました。プロキシミティセンサーが何かを検出すると、画面をオフにします。しかし、画面が復帰するときに問題があります。それは私のアプリではなく、ロック画面に移動します。これは、画面がオフになった時間に関係なく発生します(センサーが数秒後にクリアされても)。私が使用したコードは次のとおりです。AndroidのPROXIMITY_SCREEN_OFF_WAKE_LOCKに関するヘルプ

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

この動作を修正する方法はありますか?

答えて

2

あなたがmProximityWakeLock.release();を使用している場合は、APIリファレンスも隠されていますが、ソースコードを見ることができますmProximityWakeLock.release(1);

を使用してみてください: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

おかげで、私はすでにmProximityWakeLock.release(1)を使用しています。私はリフレクションを使って動作させました。それは間違いなく動作します - 近接センサーをカバーすると画面が消え、クリアすると再びオンになります。それはロック画面に入るだけで、明らかに私が望むものではありません。 – user496854

+0

@ user496854どのようにリフレクションを使用してmProximityWakeLock.release(1)を使用できるのか説明できますか?あらかじめありがとうございます – jegumi

+0

コメントとして投稿するのは簡単な方法はありませんが、どうやって自分の質問を始めてください。答えとしてコードを投稿することができます – user496854

4

そうでない場合は、ロック画面を消すことができます

ロック画面が表示されないようにするため、または必要に応じて作成時に呼び出すことができます。私は以下と組み合わせて使用​​します:

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

近接ロックを妨げるように見えるものはありません。

+0

私のlockscreenを無効にしませんか?アプリ?私はそれをしたくない - 私はlockscreenが適切に機能するようにしたい。私はちょうどそれが(つまり、近接センサーが解放され、画面が再びオンになった)ときにそれがロックされることを望んでいません。予想される動作は、ロック画面が有効になっている時間が十分に長くなっていない限り、画面が自分のアプリに戻ることです。 – user496854

1

どうやって画面を戻すことができましたか? 「解放する」またはセンサー上の/からカバーを「reseting」、

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); 
1

wakeLockほかPowerManagerからあなたはこのようにキーガードロックを作成する必要があります。

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

だけがW意志近接ウェイクロックとロック画面を取得すると同時に、このロックを作成します。あなたのアプリケーションでは他のすべての時間にorkを使用してください。それはあなたのアプリケーションに適している場合は、画面が上と正常に動作しますwakeLock上記とは逆、すなわちオフに必要なときに解放するオンにする必要なときに

+0

これにより、ロック画面が表示されなくなりますか? – user496854

+0

まあ、この解決策は、同じ状況で私を助けた=)私は同じ問題に直面した - 電話が耳のロックから離れて移動した後に画面が表示されます。 KeyguardLockの使用は私を助けます。 サンプルコードは私の考えを明確にするために少し編集されました。 –

+0

これは余分な許可(DISABLE_KEYGUARD)が必要であることに注意する価値があります –

0

あなたは

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

獲得ロックを使用することができます。私のレイアウトで

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

1

私はこのコードマニフェストで

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

} 

使用

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

非常に良いコード、良い仕事!私は質問がある。 **ボタンを押すだけでコードを使用してディスプレイをオフにすることはできますか? (近接センサーなし!) – Dake

+0

近接センサーなしではわかりません...この[リンク](http://stackoverflow.com/questions/6756768/turn-off-screen-on-android)をチェックすることができます.. 。 ごめんなさい。 – Cabezas

+0

問題ありません。しかし、小さな問題があります。現在のコードは表示をオフにするだけでなく、開いているアプリケーションを「一時停止」します。例えば、ゲーム中にディスプレイが消灯した場合、ゲームは「一時停止」される。 **ディスプレイをオフにして、デバイスを正常に動作させたいだけです。出来ますか? – Dake