Introduction
常常我們開發程序的時候我們不需要系統喚醒系統鎖屏功能,比如我們在做xxxNowTV或XXX播放器這樣的程序,用戶有時候在看電視或視頻的時候不希望系統的鎖屏功能啟動,既不想鎖頻,然而系統卻在我們看電視或者視頻的時候出來個鎖屏的界面進行鎖頻拉,我們還要想繼續看的話還要去解鎖,這樣好麻煩,不是我們想要的,那我們該怎麼做呢,其實很簡單,我這裡只講其中的兩種
一 :我們只要在程序中用代碼實現。代碼如下:
- //方法一
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); setContentView(R.layout.main);
- //方法二
- @Override
- protected void onResume() {
- super.onResume();
- pManager = ((PowerManager) getSystemService(POWER_SERVICE));
- mWakeLock = pManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK
- | PowerManager.ON_AFTER_RELEASE, TAG);
- mWakeLock.acquire();
- }
-
- @Override
- protected void onPause() {
- super.onPause();
-
- if(null != mWakeLock){
- mWakeLock.release();
- }
- }
- //方法三
- public void unLock(){
- mContentResolver = getContentResolver();
- //不建議使用
- //setLockPatternEnabled(Android.provider.Settings.System.LOCK_PATTERN_ENABLED,false);
-
- //推薦使用
- setLockPatternEnabled(android.provider.Settings.Secure.LOCK_PATTERN_ENABLED,false);
- }
-
- private void setLockPatternEnabled(String systemSettingKey, boolean enabled) {
- //不建議使用
- //android.provider.Settings.System.putInt(mContentResolver,systemSettingKey, enabled ? 1 : 0);
-
- //推薦使用
- android.provider.Settings.Secure.putInt(mContentResolver, systemSettingKey,enabled ? 1 : 0);
- }
- //但注意要加權限AndroidManifest.xml文件中加入
- //<uses-permission android:name="android.permission.WRITE_SETTINGS" />
- //還要特別注意的是要加入 android:sharedUserId="android.uid.system",但有一個問題,
- //如果加入了sharedUserId後就不能使用eclipse編譯了,一定要手動通過 mm -B進行編譯,然後把apk install到模擬器或設備中
二:禁用系統的鎖頻功能,這方法不建議使用,只有在設當的環境下適當使用既可,我們只要知道這樣我們也可以達到這樣的功能實現就OK。
我們知道Android系統的鎖屏時間存放在Setting數據庫中,字段為Settings.System.SCREEN_OFF_TIMEOUT。我們可以查看SettingsProvider源碼,查看如下文件的源碼如下:
~/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java 查看loadSystemSettings()函數的代碼如下
- private void loadSystemSettings(SQLiteDatabase db) {
- SQLiteStatement stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
- + " VALUES(?,?);");
- Resources r = mContext.getResources();
- loadBooleanSetting(stmt, Settings.System.DIM_SCREEN,
- R.bool.def_dim_screen);
- loadSetting(stmt, Settings.System.STAY_ON_WHILE_PLUGGED_IN,
- "1".equals(SystemProperties.get("ro.kernel.qemu")) ? 1 : 0);
- loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
- R.integer.def_screen_off_timeout);
- // Set default cdma emergency tone
- loadSetting(stmt, Settings.System.EMERGENCY_TONE, 0);
- // Set default cdma call auto retry
- loadSetting(stmt, Settings.System.CALL_AUTO_RETRY, 0);
- // Set default cdma DTMF type
- loadSetting(stmt, Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, 0);
- // Set default hearing aid
- loadSetting(stmt, Settings.System.HEARING_AID, 0);
- // Set default tty mode
- loadSetting(stmt, Settings.System.TTY_MODE, 0);
- loadBooleanSetting(stmt, Settings.System.AIRPLANE_MODE_ON,
- R.bool.def_airplane_mode_on);
- loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_RADIOS,
- R.string.def_airplane_mode_radios);
- loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
- R.string.airplane_mode_toggleable_radios);
- loadBooleanSetting(stmt, Settings.System.AUTO_TIME,
- R.bool.def_auto_time); // Sync time to NITZ
- loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS,
- R.integer.def_screen_brightness);
- loadBooleanSetting(stmt, Settings.System.SCREEN_BRIGHTNESS_MODE,
- R.bool.def_screen_brightness_automatic_mode);
- loadDefaultAnimationSettings(stmt);
- loadBooleanSetting(stmt, Settings.System.ACCELEROMETER_ROTATION,
- R.bool.def_accelerometer_rotation);
- loadDefaultHapticSettings(stmt);
- stmt.close();
- }
我們通過查看源碼便知道, Settings.System.SCREEN_OFF_TIMEOUT沒有初始化的話(系統首次啟動,這個字段肯定是沒有初始化