0

重複する警告: この問題は、一部のフロントエンドとサービスの両方からの呼び出しに適した Android API の詳細を扱います。SO には多くの同様のスレッドがありますが、フロントエンドのみに焦点を当てています。

問題

プログラムでキーガードを有効にしたいので、たとえば、ユーザーがアプリのボタンをクリックすると電話がロックされます (電話ユーザーを使用するには、最初にロックを解除する必要があります)。

問題は、すべての有効なケースで機能する堅実な方法を見つけたいということです。

試み

私は試した:

  • lockNowwith DevicePolicyManager-- 画面がオフの場合 (ただし、電話がロックされていない場合)、この呼び出しは無視されます (つまり、キーガードはアクティブ化されません)。

  • reenableKeyguardwith KeyguardManager.KeyguardLock-- メソッドの呼び出しは、考えられるすべてのケースで無視されます

  • goToSleepwith PowerManager-- アクセス権の問題により、呼び出すことができません。DEVICE_POWER既にこのアクセス権セットを持っているにもかかわらず、それが必要です

これまでのところ、最初の方法 ( ) を追求しlockNow、画面がオフの場合にどうにか対処する追加のハックを使用しますが、非常に見苦しいので、簡単な方法があることを願っています。

4

1 に答える 1

1

1つの解決策は、遅延後のハンドラーでスレッドを使用することです。ここでの落とし穴は、画面がオフになった後でもスレッドは存続し、アプリケーションは一時停止状態になります(プロセスが強制終了されない限り)

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        keyLock.reenableKeyguard();
        Log.i("LOCK","key guard back on");
        finish();
    }
}, 300);

これを行う別の方法は、タイマータスクを使用することですが、タイマータスクが時々強制終了される可能性があります(確かにはわかりませんが、私の過去の経験ではわかりません)

TimerTask Active = new TimerTask() {
@Override
public void run() {
    keyLock.reenableKeyguard();
    Log.i("LOCK","key guard back on");
    finish();
    }
};
Timer starter = new Timer();
starter.schedule(Active, 300);

これがあなたが探していた「堅実な方法」であると100%確信することはできませんが、私はしばらくの間、デバイスポリシーマネージャーとキーガードマネージャーと協力しており、locknow()と同様の問題に遭遇しましたメソッドは画面をオフにしてから、上記のandroid4.0を搭載したデバイスをオンに戻します。

DDMSデバッグログを調べ、できればいくつかのデバイスでテストしているときに、このソリューションに出くわしました。これまでのところ、失敗していないので、とにかくここにヒントがあります。

  1. キーガードを無効にする
  2. locknow()を呼び出す
  3. 上記の方法で、300ミリ秒程度でキーガードを再度有効にします...(私はハンドラーが好きで、それは私にとって魅力のように機能しました)
于 2012-10-14T22:54:36.783 に答える