2014-02-18 3 views
5

기기에서 키 가드를 사용/사용 중지하도록 제어하고 싶습니다. Android SDK의 DevicePolicyManager 및 KeyguardLock API를 사용하고 있습니다.Android - 키 가드를 완전히 비활성화하는 방법

그것은 화면의 잠금에 대한 확인을 작동하지만 fucntionality은 몇 가지 문제와 함께 작동 잠금을 해제

public class DeviceLocker { 

private static DeviceLocker instance; 

public static synchronized DeviceLocker getInstance(Context context) { 
    if(instance==null) { 
     instance = new DeviceLocker(context); 
    } 
    return instance; 
} 

private Context context; 
private KeyguardLock lock; 

private DeviceLocker(Context context) { 
    this.context = context; 
} 

public void lock() { 
    lock(true); 
} 

public void lock(boolean lockNow) { 
    getLock().reenableKeyguard(); 
    DevicePolicyManager devicePolicyManager = getDevicePolicyManager(); 
    if(devicePolicyManager==null) { 
     return; 
    } 
    LocalStorage storage = LocalStorage.from(context); 

    boolean result = devicePolicyManager.resetPassword(storage.getPassword(), 
      DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY); 

    if(lockNow) { 
     devicePolicyManager.lockNow(); 
    } 
    storage.setDeviceLocked(true); 
} 

public void unlock() { 
    DevicePolicyManager devicePolicyManager = getDevicePolicyManager(); 
    if(devicePolicyManager==null) { 
     return; 
    } 
    devicePolicyManager.resetPassword("",0); 
    getLock().disableKeyguard(); 
    LocalStorage.from(context).setDeviceLocked(false); 
} 

private KeyguardLock getLock() { 
    if(lock==null){ 
     KeyguardManager kgManager = (KeyguardManager)context.getSystemService(Activity.KEYGUARD_SERVICE); 
     lock = kgManager.newKeyguardLock(Context.KEYGUARD_SERVICE); 
    } 
    return lock; 
} 

private DevicePolicyManager getDevicePolicyManager() { 
    DevicePolicyManager devicePolicyManager = 
     (DevicePolicyManager)context.getSystemService(Context.DEVICE_POLICY_SERVICE); 
    ComponentName deviceAdmin = new ComponentName(context, WatchGuardDeviceAdminReceiver.class); 
    LocalStorage storage = LocalStorage.from(context); 
    if(!devicePolicyManager.isAdminActive(deviceAdmin)) { 
     return null; 
    } 
    if(!storage.isPasswordSet()) { 
     UIUtils.showMessage(context, R.string.password_not_set); 
     return null; 
    } 
    devicePolicyManager.setPasswordQuality(deviceAdmin,DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED); 

    return devicePolicyManager; 
} 

} : 다음

이를 관리하는 내 구현 때로는 그것이 내가 원하는대로 작동 (모든 유형의 키 가드 화면을 완전히 제거합니다.)하지만 때로는 "슬라이드 잠금 해제"키 가드 화면이 표시됩니다.

여기에 어떤 문제가 있는지 알고 계십니까? 안정적인 작동 방법 (적어도 모든 경우에서 "슬라이드 잠금 해제"또는 키 가드 제거가 필요함)?

미리 도움을 청하십시오. (때로는 완전히 키 가드를 제거하고, 때로는 "슬라이드"키 가드를 표시)

편집

그냥 내 솔루션 작품을 지적하고자하지만 문제는 불안정한 작동한다는 것입니다. 또한 일부 활동을 표시하면서 keyguard를 비활성화하는 대신 장치의 잠금/잠금 해제를 제어하기 위해 서비스에서이 코드를 사용하므로 호출 할 수 없습니다. getWindow().addFlags(..) 원인 : 대다.

아마도이 불안정한 행동을 다루는 사람이 있을지 모르겠습니다.

+0

여기에 LocalStorage 클래스 란 무엇입니까? 당신은 어떤 종류의 웹 프레임 워크에서 이것을하고 있습니까? 또한 실용적인 솔루션을 얻었습니까? 나는 이것을 DPC에 구현하려고한다. – Keilaron

답변

1
KeyguardManager keyguardManager = (KeyguardManager)getSystemService(Activity.KEYGUARD_SERVICE); 
KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE); 
lock.disableKeyguard(); 

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

or 

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
0

난 dismiss_keyguard 또는 당신이 바로 절전 모드에서 잠금 화면의 상단을 습격 할 필요가있는 창을 경우 show_when_locked 윈도우 플래그를 사용하는 것이 좋습니다 것입니다.

http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_SHOW_WHEN_LOCKED

어떻게 그렇지 않으면이 주요 보안 위반이 될 것입니다, 다음과 같이 보편적으로 불가능 AFAIK이

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
4

(설정 레이아웃 전에서 onCreate에서 호출)이다 사용합니다.

뿌리깊이 휴대 전화에서 할 수있는 대부분의 작업은 비보안 keyguard를 닫거나 앱을 보안 키 가드 위에 표시하는 것입니다. (실제로 멀리 가기 전에 당신이 장치를 재부팅해야 할 수도 있지만)이 보안 키 가드를 제거하려고 할 수 있습니다 뿌리 전화에

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
     | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 

:

다음은이 작업을 수행하는 콤보입니다. 여기

는 대한 콤보가 (그것을 자신을 시도하지 않은,하지만 난이 트릭을 Play 스토어에서 애플 리케이션 "휴대 전화를 잠금 해제"를 사용하여 여러 가지 확신)의 난 당신이 하나를 시도하는 것이 좋습니다

Runtime.getRuntime().exec("sudo rm /data/system/gesture.key"); 

을 through adb first.또한, 여기에 좀 더 많은 정보를 가진 XDA 스레드가있다 : http://forum.xda-developers.com/showthread.php?t=1800799 당신은이 코드를 추가 할 필요가

+0

표준 앱 시나리오에서는 위배 일뿐입니다. DPM을 다루는 사람이 적어도 Device Admin 앱이라면 - 여전히 그럴 수도 있지만, IMO는 Device Owner 앱뿐만 아니라 반드시이 기능을 가져야 만합니다. – Keilaron

3

:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|WindowManager.LayoutParams.FLAG_FULLSCREEN| 
       WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.lockscreen); 

     startService(new Intent(this,LockService.class).setAction(Intent.ACTION_SCREEN_OFF)); 
    } 

만들기 LockService을 함께 : 사실

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 

     if(intent == null || intent.getAction() == null) 
      return START_NOT_STICKY; 

     String action = intent.getAction(); 

     if(action.equals(ACTION_SCREEN_OFF)) 
     { 
      KeyguardManager.KeyguardLock k1; 
      KeyguardManager km =(KeyguardManager)getSystemService(KEYGUARD_SERVICE); 
      k1= km.newKeyguardLock("IN"); 
      k1.disableKeyguard(); 
     } 

     return START_NOT_STICKY; 
    } 

난 이유를 모르겠어 , k1.disableKeyguard();은 서비스에서만 작동합니다.

+0

헤이, 제안에 대한 흉내 만 나는 서비스에서 이미 그것을 사용하고 작동합니다. 그것은 단지 불안정하게 작동합니다 (열쇠 가드 또는 "슬라이드"키 가드가 없음). 그리고 아마도 이런 종류의 행동을 다루는 사람이 있을지 모르겠습니다. – kowalski

+0

잠금을 해제해야합니다. 맞습니까? 위 코드를 참조하십시오 (oncreate methond). 새로운 활동 인 DismissLockActivity를 만들 수 있습니다. 예를 들어, 활동을 시작하고 끝내기 만하면됩니다. 나는 지금이 추한 해킹,하지만 내 애플 리케이션에서 완벽하게 작동합니다. – dooplaye

관련 문제