2013-08-07 29 views
12

Người dùng mong đợi ứng dụng của tôi sẽ tắt màn hình sau khi được sử dụng. Hiện tại, tôi đạt được điều này với quyền Quản trị thiết bị và DevicePolicyManager.lockNow(), hoạt động tốt nếu cài đặt bảo mật được đặt thành Mã PIN/Mẫu/FaceUnlock, v.v.DevicePolicyManager.lockNow(); không tắt màn hình khi cài đặt bảo mật được đặt thành Slide/None

Tuy nhiên, nếu sử dụng Trang trình bày/Không, lệnh trên chỉ mất người dùng vào màn hình chính (hoặc không làm bất cứ điều gì), đó là dễ hiểu, vì không có gì để "khóa". Có cách nào để đạt được tắt màn hình trong tình huống như vậy không? Ứng dụng của tôi yêu cầu SDK> = 16, nếu điều đó quan trọng.

Vì vậy, tôi đoán câu hỏi của tôi là: Làm thế nào có thể một ứng dụng đáng tin cậy tắt màn hình (Tôi không cầm một wakelock, Tôi đang sử dụng WindowManager -flags FLAG_TURN_SCREEN_ON trong onAttachedToWindow()).

Những "dòng chảy" của ứng dụng của tôi là:
- Hoạt động được bắt đầu bởi một ý định trong khi màn hình tắt, thấy trên bàn phím bị khóa/công tắc trên màn hình với những lá cờ nêu trên
- Người dùng tích cực gạt bỏ tôi Hoạt động, tôi gọi số lockNow()finish() và người dùng dự kiến ​​màn hình sẽ tắt. Nếu người dùng đang sử dụng khóa không có/trượt, điều này không hoạt động và thay vào đó màn hình chính của người dùng được hiển thị

Cảm ơn!

+0

Nếu bạn phát triển ứng dụng hệ thống (ví dụ: đã ký bằng khóa nền tảng), bạn có thể sử dụng phương thức [goToSleep' của lớp 'PowerManager'] (http://developer.android.com/reference/android /os/PowerManager.html#goToSleep%28long%29) ... – dst

+0

Cảm ơn, dst! Thật không may, đó là một ứng dụng "bình thường": -/ – Nick

+0

Nếu bạn yêu cầu 'WRITE_SETTINGS', bạn có thể đặt thời gian chờ màn hình là 1 giây -' android.provider.Settings.System.putInt (getContentResolver(), Settings.System. SCREEN_OFF_TIMEOUT, 1000); ' Tất nhiên, sau đó bạn đang làm rối loạn cài đặt của người dùng nhưng tôi không thể tìm ra cách tốt hơn để làm điều đó. Tôi ** có ** thấy các ứng dụng làm điều đó - NoLED là ví dụ nổi bật nhất. – Delyan

Trả lời

0

Tôi đã từng bình luận Delyan để đạt được điều này:

Nếu bạn yêu cầu WRITE_SETTINGS, có lẽ bạn có thể thiết lập thời gian chờ màn hình để được 1 giây - android.provider.Settings.System.putInt (getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 1000); Tất nhiên, sau đó bạn đang rối tung lên các thiết lập của người dùng nhưng tôi không thể tìm ra một cách tốt hơn để làm điều đó. Tôi đã thấy các ứng dụng làm điều đó - NoLED là ví dụ nổi bật nhất.

5

Để bắt đầu thấy here:

Để kiểm soát chính sách này, các quản trị viên thiết bị phải có một "lực lượng-lock" tag trong "sử dụng-chính sách" của siêu dữ liệu của nó.

Quản trị viên thiết bị gọi điện thoại phải yêu cầu USES_POLICY_FORCE_LOCK gửi có thể gọi phương thức này; nếu không, ngoại lệ bảo mật sẽ bị xóa .

Tùy thuộc từ mã bạn nhận được, here's một lời giải thích khá tốt đẹp của những gì có thể sai trong trường hợp của bạn (tất nhiên bất kỳ mã được cung cấp ở đây sẽ được sử dụng!).

Tôi đã nghe nhiều lần, đó gọi hai lần mã DevicePolicyManager.lockNow() sẽ làm các trick và here's một cách để làm điều đó:

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 Tôi tìm thấy một phiên bản phức tạp hơn của cùng một điều:

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"); 

Hãy hy vọng rằng giải pháp cuối cùng sẽ hoạt động chính xác.

Cheers

+0

Cảm ơn câu trả lời của bạn. Vấn đề là phương thức 'lockNow()' không hoạt động (bất kể nó được gọi một lần hay hai lần) nếu người dùng đã đặt cài đặt lockscreen thành "None" hoặc "Slide". – Nick

+0

Vâng, tôi nghĩ rằng đó không phải là quá khứ 4.0.Có thể bạn hãy thử nó với một phiên bản cũ, trên Emulator hoặc một cái gì đó (hoặc tốt hơn trên một thiết bị) để chúng tôi có thể chứng minh vấn đề này? Cảm ơn – g00dy

+0

Ah, ok, cảm ơn vì đã cho tôi biết. Ứng dụng của tôi yêu cầu Cấp SDK> = 4.0, do đó, điều này không may trong trường hợp của tôi, nhưng tôi sẽ thử trên thiết bị cũ hơn để xem đó có phải là vấn đề không :) – Nick

Các vấn đề liên quan