【问题标题】:Unlock device, display a text, then lock again解锁设备,显示文本,然后再次锁定
【发布时间】:2012-11-23 21:53:19
【问题描述】:

为了我的应用程序的需要,即使启用了锁屏,我也需要在屏幕上显示一条消息,然后等待 3 秒钟,然后我必须再次锁定手机,因为我不想让它成为不需要的手机口袋里的电话。

第一部分很简单:

if (PreferenceManager.getDefaultSharedPreferences(
    getBaseContext()).getBoolean("wake", false)) {
    KeyguardManager kgm = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
    boolean isKeyguardUp = kgm.inKeyguardRestrictedInputMode();
    WakeLocker.acquire(ProtoBenService.this);
    Intent myIntent = new Intent(ProtoBenService.this,LockActivity.class);
    myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    if (isKeyguardUp) {
        ProtoBenService.this.startActivity(myIntent);
    } else
    Toast.makeText(ProtoBenService.this.getBaseContext(), intention, Toast.LENGTH_LONG).show();

    WakeLocker.release();
}

有了这个类:

public abstract class WakeLocker {
    private static PowerManager.WakeLock wakeLock;

    public static void acquire(Context ctx) {
        if (wakeLock != null) wakeLock.release();

        PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);
        wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK |
                PowerManager.ACQUIRE_CAUSES_WAKEUP |
                PowerManager.ON_AFTER_RELEASE, "CobeIm");
        wakeLock.acquire();
    }

    public static void release() {
        if (wakeLock != null) wakeLock.release(); wakeLock = null;
    }
}

还有活动:

public class LockActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Window window = getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
        window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        TextView tv = new TextView(this);
        tv.setText("This is working!");
        tv.setTextSize(45);
        setContentView(tv);

        Runnable mRunnable;
        Handler mHandler = new Handler();
        mRunnable = new Runnable() {
            @Override
            public void run() {
                LockActivity.this.finish();
            }
        };
        mHandler.postDelayed(mRunnable, 3 * 1000);
    }
}

所以,这很好,手机可以显示我的文字!

唯一的问题是我想再次锁定手机,似乎锁定手机受到系统保护......

我认为我的用户不会理解设备管理员并且无法激活它。是否有任何解决方法可以在没有设备管理员的情况下锁定屏幕?

【问题讨论】:

    标签: android lockscreen device-admin


    【解决方案1】:

    我使用以下方法锁定和解锁手机。

    初始化

            KeyguardLock keyguard;
            KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
            keyguard = km.newKeyguardLock("MyApp");
    

    解锁手机

    keyguard.disableKeyguard();
    

    再次锁定手机

    keyguard.reenableKeyguard();    
    

    打开屏幕

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    

    别忘了使用以下权限

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

    【讨论】:

      【解决方案2】:

      我很确定您必须使用设备管理功能来锁定屏幕。

          protected static void initiateDeviceLock(Context context) {
          ComponentName componentName = new ComponentName(context, MyDeviceAdminReceiver.class);
          DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
          boolean active = dpm.isAdminActive(componentName);
          Log.i(context.getClass().getSimpleName(), "Active (in initiateDeviceLock) = " + String.valueOf(active));
          if (active) {
              dpm.lockNow();
          }
      }
      

      为了帮助用户设置设备管理功能,您可以将他们带到设置页面:

          Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
          ComponentName componentName = new ComponentName(TestActivity.this, MyDeviceAdminReceiver.class);
          intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
          startActivityForResult(intent, CODE);
      

      【讨论】:

      • 嘿 Leo,我想在我的应用接收广播时打开屏幕并解锁,还有其他设备管理策略吗?
      • @BipinVayalu 我认为您也需要使用设备管理功能来解锁屏幕。但是结帐AlarmManager,这可能会满足您的需求。
      • 感谢您的回复,我已经完成了使用一个空白活动,该活动将从屏幕开始并解锁相关标志。
      猜你喜欢
      • 2015-01-03
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 2015-06-03
      相关资源
      最近更新 更多