2013-07-29 134 views
7

在我的应用程序中,我需要锁定和解锁手机。我搜索了它,我找到了很多答案,我尝试了它们,但没有人在工作。如何以编程方式锁定/解锁手机:Android

我需要在onCreate()上解锁手机,并在完成活动时再次锁定手机。

你们知道有什么方法可以做到吗?

感谢朋友。

编辑:

一些链接,我已经试过有:

How to display Activity when the screen is locked?

Android screen lock/ unlock programmatically

https://groups.google.com/forum/#!topic/android-developers/BOLjJTMO4zE

在我的应用程序正在使用计划任务AlarmManager和n启用电话锁定。我的活动在预定时间开始,但不能解锁我的手机。当我解开我的电话手动运行活动越来越显得

+1

解答了你尝试哪那么我们不知道的建议呢? – CodingIntrigue

+1

“没有人在工作”对您的症状没有用处。请完整,准确地解释*您尝试了什么以及遇到了什么问题。 – CommonsWare

+0

@BladeOrz:我添加了一些访问过的页面链接 –

回答

8

BroadcastReceiver建立wakelock并在activity

做到这一点:

Window window = this.getWindow(); 
window.addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD); 
window.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
window.addFlags(LayoutParams.FLAG_TURN_SCREEN_ON); 

以下输入

import android.view.Window; 
import android.view.WindowManager.LayoutParams; 

它解决了我的问题,评分高达:-)))

+0

这似乎似乎工作,我的应用程序被带到前....事件,虽然没有SIM卡引脚已被输入。 我只是以某种方式认为你将无法访问任何电话或数据功能。我会让你知道,如果是这样的话...... – 130nk3r5

+0

Jip,证实。所以你将无法使用SIM卡功能。因此,如果您想绕过输入密码并启动您的应用程序,这很好用......只要用户不会最小化或关闭应用程序,就会导致您重新登录登录屏幕。 – 130nk3r5

+0

Sooo简单!并且运作良好 –

-1

尝试......

@Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
        setContentView(R.layout.activity_main); 
    } 

    @Override 
     protected void onPause() { 
      super.onPause(); 
      getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 


     } 
3
DevicePolicyManager deviceManger; 
ActivityManager activityManager; 
ComponentName compName; 

中的onCreate()添加代码

deviceManger = (DevicePolicyManager)getSystemService(
      Context.DEVICE_POLICY_SERVICE); 
activityManager = (ActivityManager)getSystemService(
      Context.ACTIVITY_SERVICE); 
compName = new ComponentName(this, DeviceAdminLock.class); 

清单文件中添加代码

<receiver android:name=".DeviceAdminLock" 
     android:permission="android.permission.BIND_DEVICE_ADMIN"> 
     <meta-data android:name="android.app.device_admin" 
      android:resource="@xml/device_admin_sample" /> 
     <intent-filter> 
      <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> 
     </intent-filter> 
</receiver> 

在res/xml中创建一个xml资源文件,名称为device_admin_sample.xml,并添加以下内容 -

<device-admin xmlns:android="http://schemas.android.com/apk/res/android"> 
  <uses-policies> 
    <limit-password /> 
    <watch-login /> 
    <reset-password /> 
    <force-lock /> 
    <wipe-data /> 
    <expire-password /> 
    <encrypted-storage /> 
    <disable-camera /> 
  </uses-policies> 

添加权限清单文件 -

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

创建延伸DeviceAdminReceiver类一个接收器类。

public class DeviceAdminLock extends DeviceAdminReceiver { 

@Override 
public void onEnabled(Context context, Intent intent) { 
} 

@Override 
public CharSequence onDisableRequested(Context context, Intent intent) { 
    return "This is an optional message to warn the user about disabling."; 
} 

@Override 
public void onDisabled(Context context, Intent intent) { 
} 

@Override 
public void onPasswordChanged(Context context, Intent intent) { 
} 

@Override 
public void onPasswordFailed(Context context, Intent intent) { 
} 

@Override 
public void onPasswordSucceeded(Context context, Intent intent) { 
} 

}

问活动类激活锁定权限

Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); 
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,compName); 
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,"Additional text explaining why this needs to be added."); 
startActivityForResult(intent, 1); 

检查许可被给予或不

boolean active = deviceManger.isAdminActive(compName); 
if (active) { 
// if available then lock 
    deviceManger.lockNow(); 
} 

解锁装置

deviceManger.removeActiveAdmin(compName); 

解锁

KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 
final KeyguardManager.KeyguardLock kl = km .newKeyguardLock("MyKeyguardLock"); 
kl.disableKeyguard(); 

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK 
           | PowerManager.ACQUIRE_CAUSES_WAKEUP 
           | PowerManager.ON_AFTER_RELEASE, "MyWakeLock"); 
wakeLock.acquire(); 
0

作为API 27,FLAG_SHOW_WHEN_LOCKEDFLAG_TURN_SCREEN_ON中不提倡的。相反,在Manifest

<activity 
    android:name=".MyActivity" 
    android:turnScreenOn="true" 
    android:showWhenLocked="true"/> 

使用这一配置,对于一般使用,在您的活动:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { 
     setTurnScreenOn(true); 
     setShowWhenLocked(true); 
    } else { 
     window.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
     window.addFlags(LayoutParams.FLAG_TURN_SCREEN_ON); 
    } 
}