12

ユーザーは、アプリの使用後に画面がオフになることを期待しています。現時点では、デバイス管理者権限でこれを実現してDevicePolicyManager.lockNow()います。これは、セキュリティ設定が PIN/Pattern/FaceUnlock などに設定されている場合に正常に機能します。

ただし、Slide/None を使用している場合、上記のコマンドはユーザーをホーム画面に移動するだけです (または何もしません)。これは、「ロック」するものが何もないため、理解できます。このような状況で画面をオフにする方法はありますか? それが重要な場合、私のアプリには SDK>=16 が必要です。

だから私の質問は次のとおりだと思います:アプリが画面を確実にオフにするにはどうすればよいですか(私は を保持していませんwakelock、私は でWindowManager-flagsFLAG_TURN_SCREEN_ONを使用していonAttachedToWindow()ます)。

私のアプリの「フロー」は次
のとおりです。-画面がオフのときにインテントによってアクティビティが開始され、上記のフラグを使用して画面上のキーガード/スイッチの上に表示され
ますユーザーは画面がオフになることを期待しています。ユーザーがなし/スライド ロックを使用している場合、これは機能せず、代わりにユーザーのホーム画面が表示されます。lockNow()finish()

ありがとう!

4

2 に答える 2

5

まず、ここを参照してください:

このポリシーを制御するには、デバイス管理者がメタデータの「uses-policies」セクションに「force-lock」タグを含める必要があります。

このメソッドを呼び出すには、呼び出し元のデバイス管理者が USES_POLICY_FORCE_LOCK を要求している必要があります。そうでない場合は、セキュリティ例外がスローされます。

あなたが得たコードに応じて、あなたのケースで何が間違っている可能性があるかについてかなり良い説明があります (もちろん、ここで提供されているコードはすべて役に立ちます!)。

DevicePolicyManager.lockNow()コードを2回呼び出すとうまくいくと何度か聞いたことがあります、これを行う1つの方法を次に示します。

mDPM = (DevicePolicyManager)getApplicationContext().getSystemService("device_policy");
Handler handlerUI = new Handler();
      handlerUI.postDelayed(new Runnable() {
          @Override
          public void run() {
              mDPM.lockNow();
          }
      }, 200);
      finish();
      mDPM.lockNow();

ここで、同じもののより精巧なバージョンを見つけました。

Android DevicePolicyManager lockNow() problem
public class SMSMessagingActivity extends Activity {
    /** Called when the activity is first created. */

public static DevicePolicyManager mDPM;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);                    

    }

    public static void LockNow(){
        mDPM.lockNow();
    }

}

ComponentName devAdminReceiver; // this would have been declared in your class body
// then in your onCreate
    mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
    devAdminReceiver = new ComponentName(context, deviceAdminReceiver.class);
//then in your onResume

boolean admin = mDPM.isAdminActive(devAdminReceiver);
if (admin)
    mDPM.lockNow();
else Log.i(tag,"Not an admin");

最後の回避策が正しく機能することを祈りましょう。

乾杯

于 2013-08-14T11:12:55.897 に答える
0

これを達成するために、デリアンのコメントを使用しました。

WRITE_SETTINGS をリクエストすると、おそらく画面のタイムアウトを 1 秒に設定できます - android.provider.Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 1000); もちろん、ユーザーの設定を台無しにしていますが、それを行うより良い方法がわかりません。私はそれを行うアプリを見てきました - NoLED は最も顕著な例です。

于 2013-08-22T10:49:07.353 に答える