2012-12-05 37 views
4

對於需要我的應用程序,即使啓用了鎖定屏幕,我仍然需要在屏幕上顯示一條消息,然後等待3秒鐘,然後再次將手機鎖定爲我不希望它在你的口袋裏打不需要的電話。解鎖設備,顯示文本,然後再次鎖定

第一部分是簡單的:

if (PreferenceManager.getDefaultSharedPreferences(
    getBaseContext()).getBoolean("wake", false)) { 
    KeyguardManager kgm = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 
    boolean isKeyguardUp = kgm.inKeyguardRestrictedInputMode(); 
    WakeLocker.acquire(ProtoBenService.this); 
    Intent myIntent = new Intent(ProtoBenService.this,LockActivity.class); 
    myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

    if (isKeyguardUp) { 
     ProtoBenService.this.startActivity(myIntent); 
    } else 
    Toast.makeText(ProtoBenService.this.getBaseContext(), intention, Toast.LENGTH_LONG).show(); 

    WakeLocker.release(); 
} 

有了這個類:

public abstract class WakeLocker { 
    private static PowerManager.WakeLock wakeLock; 

    public static void acquire(Context ctx) { 
     if (wakeLock != null) wakeLock.release(); 

     PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE); 
     wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | 
       PowerManager.ACQUIRE_CAUSES_WAKEUP | 
       PowerManager.ON_AFTER_RELEASE, "CobeIm"); 
     wakeLock.acquire(); 
    } 

    public static void release() { 
     if (wakeLock != null) wakeLock.release(); wakeLock = null; 
    } 
} 

,並且活動:

public class LockActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Window window = getWindow(); 
     window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
     window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
     window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
     TextView tv = new TextView(this); 
     tv.setText("This is working!"); 
     tv.setTextSize(45); 
     setContentView(tv); 

     Runnable mRunnable; 
     Handler mHandler = new Handler(); 
     mRunnable = new Runnable() { 
      @Override 
      public void run() { 
       LockActivity.this.finish(); 
      } 
     }; 
     mHandler.postDelayed(mRunnable, 3 * 1000); 
    } 
} 

所以,這是不錯的,手機可以顯示我的文字!

唯一的問題是當我想再次鎖定手機,它似乎鎖定手機在系統的保護...

我想我的用戶不理解設備管理員並且無法激活它。有沒有任何解決方法來鎖定屏幕沒有設備管理員的東西?

回答

1

我很確定您必須使用設備管理功能來鎖定屏幕。

protected static void initiateDeviceLock(Context context) { 
    ComponentName componentName = new ComponentName(context, MyDeviceAdminReceiver.class); 
    DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); 
    boolean active = dpm.isAdminActive(componentName); 
    Log.i(context.getClass().getSimpleName(), "Active (in initiateDeviceLock) = " + String.valueOf(active)); 
    if (active) { 
     dpm.lockNow(); 
    } 
} 

爲了幫助用戶設置的設備管理功能,你可以帶他們到設置頁面:

Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); 
    ComponentName componentName = new ComponentName(TestActivity.this, MyDeviceAdminReceiver.class); 
    intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName); 
    startActivityForResult(intent, CODE); 
+0

喂獅子座,我想打開屏幕和解鎖時,我的應用程序接收廣播,反正是有其他該設備管理策略? –

+0

@BipinVayalu我認爲你需要使用設備管理功能才能解鎖屏幕。但結賬AlarmManager,可能會做你需要的。 –

+0

感謝您的回覆,我已經完成了使用一個空白的活動,將開始與屏幕和解鎖相關的標誌。 –

2

我用下面的方法進行鎖定和解鎖手機。

初始化

 KeyguardLock keyguard; 
     KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 
     keyguard = km.newKeyguardLock("MyApp"); 

解鎖手機

keyguard.disableKeyguard(); 

鎖定手機又

keyguard.reenableKeyguard();  

打開屏幕上

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

不要忘記使用以下權限

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