应用程序描述: 该应用程序旨在作为特定客户端的安全程序(不公开部署).当应用程序在一段时间内未检测到移动时,如果应用程序处于后台或设备处于睡眠状态,应用程序应发出警报并将其置于前台.
问题: 如果设备处于睡眠状态并处于锁定状态,我们需要唤醒并解锁设备.使用SO和其他地方的各种技术,我们已经能够(部分地)唤醒和解锁设备,但是当设备物理插入计算机时,这只能正常运行.如果设备本身没有插上电源,我们测试了唤醒 - 解锁,没有任何反应; 设备似乎仍然处于睡眠状态,应用程序似乎什么都不做(没有警报).
我使用过这篇文章关于使用PowerManager和KeyguardManager,这篇文章使用了窗口标志.
这是目前用于唤醒设备的代码:
public void wakeDevice() {
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "TAG");
wakeLock.acquire();
KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("TAG");
keyguardLock.disableKeyguard();
runOnUiThread(new Runnable(){
public void run(){
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
}
});
}
Run Code Online (Sandbox Code Playgroud)
从我看到/使用过的其他一些SO问题的评论和帖子中,似乎PowerManager/KeyguardManager代码应该已经完成了这个技巧.同样,正如我之前所说的,它在技术上工作,而设备通过USB插入到开发机器,但在设备分离时绝对没有任何作用.
另请注意,这是我们的第一个Android应用程序,所以我们完全清楚我们可能会完全关注我们正在尝试做的事情.欢迎任何建议.
所以简而言之,鉴于上面的代码,为什么设备根据它是否插入而表现得如此不同,以及为了唤醒和解锁设备,我们应该改变什么?提前感谢您的帮助!
在我的应用程序中,我使用下面的代码禁用了键盘锁(ieRemove Lockscreen),它可以正常工作,直到我点击通知栏中的任何通知.如果我点击通知,则会自动重新启用锁定屏幕.任何帮助表示赞赏.
private void remove_lockscreen() {
final CheckBoxPreference lock = (CheckBoxPreference) findPreference("remove_lockscreen");
KeyguardManager km = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);
KeyguardLock kl = km.newKeyguardLock("keyguard_lock");
if (lock.isChecked()) {
prefEdit("remove_lockscreen", 1);
Toast.makeText(getBaseContext(), "Lockscreen will not be shown", Toast.LENGTH_SHORT).show();
kl.disableKeyguard();
}
else if (!lock.isChecked()) {
prefEdit("remove_lockscreen", 0);
Toast.makeText(getBaseContext(), "Lockscreen will be shown", Toast.LENGTH_SHORT).show();
kl.reenableKeyguard();
android.os.Process.killProcess(android.os.Process.myPid());
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个分享按钮GCM notification.点击分享按钮,我需要启动分享意图.一切都很完美.我面临的唯一问题是Lollipop锁屏功能.当我从锁定屏幕单击共享按钮时,我的意图对话框出现在锁定屏幕下方,用户必须解锁屏幕才能看到对话框.单击共享按钮时,我想以编程方式解锁屏幕.
我尝试使用Power Manager,但是它的所有wakeClock标志都已弃用并且WindowManager.LayoutParams.Flag_KEEP_SCREEN_ON建议使用.但我不是在这里使用活动.我正在使用broadcastReciever context.因此我不能使用getWindow()方法.
我也尝试过KeyguardManager.但即便disableKeyguard()被解除了.
Intent.ACTION_SCREEN_ON如果我们想在屏幕解锁后执行任何操作,我不能使用,因为这应该使用.
我曾使用以下意图以编程方式关闭通知托盘:
Intent it = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
mContext.sendBroadcast(it);
Run Code Online (Sandbox Code Playgroud)
是否有类似的意图,可以广播解锁屏幕
使用DevicePolicyManager更新了代码:
public static void handleShareBtnClick(Context context, String message) {
GcmHelper helper = new GcmHelper();
helper.shareMessage(context, message);
if(Utility.isLollypopAndAbove()){
helper.unlockLockScreen();
}
helper.launchShareforForAlert();
}
public void unlockLockScreen(){
DevicePolicyManager devicePolicyMngr= (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName compName=new ComponentName(mContext, DeviceAdminReceiver.class);
if(!devicePolicyMngr.isAdminActive(compName))
devicePolicyMngr.removeActiveAdmin(compName);
}
Run Code Online (Sandbox Code Playgroud)
即使在使用DevicePolicyManager之后,它也无法解锁我的屏幕
我正在为一家公司制作专有应用程序,该应用程序永远不会将其发布到Ice Cream Sandwich(Android 4.0)中的Android Market(或我现在认为的Play商店).
我需要禁用Home,这样用户就无法恶意卸载软件或删除应用捕获的数据.这个最新版本是第一个用4.0编写的,以前的版本是用2.2和3.2编写的.
为了禁用2.2中的Home按钮,我将应用程序关联为主页替换,因此该按钮刚刚重新打开应用程序,但我无法再使用此方法,因为这有点阻止我们对应用程序进行更新(我们不知道)我想让用户选择重新选择Home默认值,因为这会导致数据删除.
我在3.2中禁用Home按钮的代码是:
@Override
public void onAttachedToWindow() {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
super.onAttachedToWindow();
}
Run Code Online (Sandbox Code Playgroud)
并且,在onCreate下:
KeyguardManager keyguardManager = (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE);
KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE);
lock.disableKeyguard();
Run Code Online (Sandbox Code Playgroud)
但是当我运行在我的3.2平板电脑上运行的相同代码时,它在我的4.0平板电脑上不起作用.
我想知道是否有一个新的API或方法可以达到与我目前在3.2实现中相同的效果.
感谢您的帮助或指导.
亚当
android android-3.0-honeycomb keyguard android-4.0-ice-cream-sandwich
当screen_on激活广播接收器时,如何禁用键盘锁,这样当用户看到它后面开始的活动时?(活动已经开始......)
我一直在尝试从屏幕关闭触发的广播接收器中的以下代码...
KeyguardManager myKeyGuard = (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE);
myLock = myKeyGuard.newKeyguardLock();
myLock.disableKeyguard();
Run Code Online (Sandbox Code Playgroud)
虽然它似乎没有工作.当我打开屏幕时,我仍然需要手动解锁手机上的键盘锁,以显示其背后的活动.
在我的应用程序中,我需要锁定和解锁手机.我搜索了它,我找到了许多答案,我尝试了它们,但没有人工作.
onCreate()在我完成活动时,我需要再次打开手机并再次锁定手机.
你们知道做同样的方法吗?
谢谢朋友.
编辑:
我尝试过的一些链接是:
https://groups.google.com/forum/#!topic/android-developers/BOLjJTMO4zE
在我的应用程序中,我正在使用AlarmManager然后启用手机锁来安排任务.我的活动是在预定时间开始,但它没有解锁我的手机.当我解锁我的手机时,手动运行活动就出现了
以下摘自http://developer.android.com/reference/android/app/KeyguardManager.html
public boolean isDeviceLocked()
返回设备当前是否已锁定并需要PIN,模式或密码才能解锁.如果解锁设备当前需要PIN,模式或密码,则返回true.
public boolean isKeyguardSecure()
返回键盘锁是否需要密码才能解锁.如果keyguard是安全的,则返回true.
isDeviceLocked和之间有什么区别isKeyguardSecure?
我最近试图要求用户从我的应用程序中手动关闭键盘保护。当设备被锁定并且屏幕上有标志时,我的应用会调用一个活动屏幕
FLAG_SHOW_WHEN_LOCKED
FLAG_TURN_SCREEN_ON
当我必须调用另一个没有这些标志的屏幕时,我想请求用户解锁键盘锁,这种行为可以在相机应用程序中看到 - 当我们想分享手机锁定时拍摄的照片时将要求我们解锁设备。
requestDismissKeyguard()方法仅适用于 api26 及以上的低 apis 的任何替代方案?
当应用程序在后台并且屏幕被锁定时,我无法启动活动,没有异常或警告,只是没有调用 onCreate()。我一直在努力解决这个问题,我想我终于找到了它的根源。日志中有一行:
D/com.android.server.am.ExtraActivityManagerService: MIUILOG- Permission Denied Activity KeyguardLocked: Intent { flg=0x14010000 cmp=com.trueconf.videochat/com.trueconf.gui.activities.Call (has extras) } pkg : com.trueconf.videochat uid : 10634
Run Code Online (Sandbox Code Playgroud)
这就是我无法开始活动的原因吗?另外,我该如何解决这个问题,我应该禁用键盘锁还是什么?
android ×10
keyguard ×10
lockscreen ×2
android-4.0-ice-cream-sandwich ×1
api ×1
keyguardlock ×1
locking ×1
miui ×1
unlock ×1