2013-08-07 39 views
12

用戶希望我的應用程序使用後關閉屏幕。目前,我使用設備管理員權限和DevicePolicyManager.lockNow()來實現此目標,如果安全設置設置爲PIN/Pattern/FaceUnlock等,則工作正常。DevicePolicyManager.lockNow();當安全設置到幻燈片不會關閉屏幕/無

但是,如果使用Slide/None,上述命令只需要用戶到主屏幕(或者什麼都不做),這是可以理解的,因爲沒有什麼可以「鎖定」。在這種情況下有沒有辦法實現關閉屏幕?如果有問題,我的應用程序需要SDK> = 16。

所以我想我的問題是:如何能在應用可靠地關掉屏幕(我不是拿着wakelock,我用了onAttachedToWindow()WindowManager -flags FLAG_TURN_SCREEN_ON)。

我的應用程序的「流」是:
- 活動由意圖啓動而屏幕關閉時,示出了鍵盤鎖以上/與上述標誌在屏幕上開關
- 用戶積極駁回我的活動,我打電話lockNow()finish()和用戶期望的屏幕關閉。如果用戶正在使用無/滑鎖,這並不工作,而不是用戶的主屏幕顯示

謝謝!

+0

如果您開發系統應用程序(例如使用平臺鍵簽名),您可以使用[PowerManager類的''goToSleep'方法](http://developer.android.com/reference/android /os/PowerManager.html#goToSleep%28long%29)... – dst

+0

謝謝,dst!不幸的是,這是一個「正常」的應用程序: -/ – Nick

+0

如果您請求'WRITE_SETTINGS',您可以將屏幕超時設置爲1秒 - android.provider.Settings.System.putInt(getContentResolver(),Settings.System。 SCREEN_OFF_TIMEOUT,1000);' 當然,那麼你搞砸了用戶的設置,但我找不出一個更好的方法來做到這一點。我有**看過應用程序 - NoLED是最突出的例子。 – Delyan

回答

0

我用Delyan的評論來實現這一目標:

如果要求WRITE_SETTINGS,你也許可以設置屏幕超時時間爲1秒 - android.provider.Settings.System.putInt( getContentResolver(),Settings.System.SCREEN_OFF_TIMEOUT,1000);當然,那麼你搞砸了用戶的設置,但我找不出一個更好的方法來做到這一點。我看到了應用程序這樣做 - NoLED是最突出的例子。

5

首先看到here

要控制這項政策,設備管理員必須有它的元數據的「使用的策略」一節中「力鎖」標籤 。

主叫設備管理員必須已請求USES_POLICY_FORCE_LOCK到 能夠調用此方法;如果沒有,則會拋出安全異常 。

從你得到了,here's什麼可能是錯誤的,你的情況相當不錯解釋代碼根據(當然這裏所提供的任何代碼將使用!)。

我聽說過幾次,這兩次調用的代碼DevicePolicyManager.lockNow()會做的伎倆和這樣做的here's一種方法:

mDPM = (DevicePolicyManager)getApplicationContext().getSystemService("device_policy"); 
Handler handlerUI = new Handler(); 
     handlerUI.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       mDPM.lockNow(); 
      } 
     }, 200); 
     finish(); 
     mDPM.lockNow(); 

Here我發現同樣的事情更詳盡的版本:

Android DevicePolicyManager lockNow() problem 
public class SMSMessagingActivity extends Activity { 
    /** Called when the activity is first created. */ 

public static DevicePolicyManager mDPM; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);      

    } 

    public static void LockNow(){ 
     mDPM.lockNow(); 
    } 

} 

ComponentName devAdminReceiver; // this would have been declared in your class body 
// then in your onCreate 
    mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE); 
    devAdminReceiver = new ComponentName(context, deviceAdminReceiver.class); 
//then in your onResume 

boolean admin = mDPM.isAdminActive(devAdminReceiver); 
if (admin) 
    mDPM.lockNow(); 
else Log.i(tag,"Not an admin"); 

讓我們希望最後的解決方法能正常工作。

乾杯

+0

感謝您的回答。問題是,如果用戶將鎖屏設置設置爲「無」或「幻燈片」,'lockNow()'方法不起作用(不管它是否被調用一次或兩次)。 – Nick

+0

是的,我認爲這不是4.0以上的工作。您可以使用舊版本,模擬器或其他東西(或更好的設備)嘗試它,以便我們證明這個問題?謝謝 – g00dy

+0

啊,好的,謝謝你讓我知道。我的應用程序需要SDK Level> = 4.0,所以這不幸對我的情況沒有幫助,但我會在較舊的設備上嘗試它,看看是否是問題:) – Nick