2014-02-18 3 views
5

Я хочу управлять включением/отключением блокировки клавиатуры на устройстве. Для этого я использую DevicePolicyManager и KeyguardLock API для Android SDK.Android - как полностью отключить keyguard

Ниже моя реализация справиться с этим:

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; 
} 

}

Это хорошо работает в отношении блокировки экрана, но разблокировать fucntionality работает с некоторыми вопросами: иногда это работает, как я хочу (полностью удаляет любой тип экрана блокировки клавиатуры), но иногда он показывает экран блокировки клавиатуры «Разблокировать с помощью слайда».

Вы знаете, в чем проблема? Как заставить его работать стабильно (по крайней мере во всех случаях либо показывать «Разблокировать слайд», либо полностью удалять блокировку клавиатуры)?

Заранее благодарим за помощь.

EDIT

Сразу хочу отметить, что мое решение работает, но проблема в том, что она работает неустойчиво (иногда полностью снимает блокировки клавиатуры и иногда показывают «слайд» блокировки клавиатуры). А также я использую его не только для отключения блокировки клавиатуры при показе активности, но и для управления блокировкой/разблокировкой устройства, поэтому я использую этот код в службе, поэтому я не могу позвонить 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

, как вы используете это следующим образом (вызывается в OnCreate перед настройкой макета)

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

AFAIK это не повсеместно возможно, в противном случае это было бы основные нарушения безопасности.

На неуправляемом телефоне больше всего вы можете отключить незащищенную блокировку клавиатуры или показать свое приложение над защищенной блокировкой клавиатуры.

Вот комбо, чтобы сделать это:

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

На корневое телефона вы можете попытаться удалить безопасный блокировки клавиатуры (хотя вы, возможно, придется перезагрузить устройство, прежде чем он на самом деле уходит).

Вот комбо для этого (не пробовал сам, но я уверен, что некоторые «разблокировать телефон» приложения в Play Store, использовать этот трюк)

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

Я рекомендую вам попробовать это через adb в первую очередь.Кроме того, вот 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

эй, thnaks за предложение, но я уже использую его в сервисе, и он работает. он просто работает нестабильно (не хватает блокировки клавиатуры или «слайдов»), и мне интересно, может быть, кто-то имел дело с таким поведением. – kowalski

+0

Вам нужно только разблокировать, верно? См. Код выше (onCreate methond). Вы можете создать новую активность, например, DismissLockActivity, и когда вам нужно отменить keyguard, просто начните свою деятельность и закончите. Я теперь этот уродливый взлом, но в моем приложении это работает отлично. – dooplaye

Смежные вопросы