1. 程式人生 > >Android息屏與亮屏

Android息屏與亮屏

最近的專案要求apk能在空閒一會後讓螢幕熄滅,檢測到有使用者到來(距離感測器觸發)後點亮螢幕。百度了一大堆發現很多都不靠譜,google了一會才勉強找到一種能滿足需求的方法,說勉強是因為這種方法需要到系統設定中給該app裝置管理的許可權,這使得熄屏與亮屏這樣看似簡單的功能顯得繁瑣了起來。
廢話不多說,實現起來還是蠻簡單的,原始碼可在github上直接下載:
AndroidScreenOnAndOff

息屏:

    private void screenOff(){
        DevicePolicyManager policyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
        ComponentName adminReceiver = new
ComponentName(AppIdleActivity.this, ScreenOffAdminReceiver.class); boolean admin = policyManager.isAdminActive(adminReceiver); if (admin) { isScreenOn = false; policyManager.lockNow(); } else { Toast.makeText(this,"沒有裝置管理許可權", Toast.LENGTH_LONG).show(); } }

息屏主要使用的是DevicePolicyManager 類,此外ScreenOffAdminReceiver是一個息屏管理的廣播接收器,該接受器非常重要,系統設定中正是通過該接收器才找到的應用程式,該廣播接收器在AndroidManifest.xml中的宣告如下:

        <receiver
            android:name=".ui.ScreenOffAdminReceiver"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_DEVICE_ADMIN"
>
<meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter> </receiver>

resource只想xml目錄下的device_admin檔案,改檔案如下:

<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android" >

    <uses-policies>

        <force-lock />
    </uses-policies>

</device-admin>

ScreenOffAdminReceiver如下:

/**
 * Receiver class which shows notifications when the Device Administrator status
 * of the application changes.
 */
public class ScreenOffAdminReceiver extends DeviceAdminReceiver {
    private void showToast(Context context, String msg) {
        Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onEnabled(Context context, Intent intent) {
        showToast(context,
                "裝置管理器使能");
    }

    @Override
    public void onDisabled(Context context, Intent intent) {
        showToast(context,
                "裝置管理器沒有使能");
    }

}

這些都按照套路來就好,做完這幾步後,就能在系統設定-》安全-》裝置管理器下看到你的app了,勾選後面的checkbox,使能它就能實現息屏了,當然了,你還需要這個許可權:

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

設定介面如下:
安全
這裡寫圖片描述
裝置管理器
這裡寫圖片描述

亮屏

    public void screenOn() {
        // turn on screen
        PowerManager mPowerManager = (PowerManager) getSystemService(POWER_SERVICE);
        PowerManager.WakeLock mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
        mWakeLock.acquire();
        mWakeLock.release();
        isScreenOn = true;
        handler.sendEmptyMessageDelayed(MESSAGE_SCREEN_OFF,1000);
    }

亮屏需要的許可權:

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

很多部落格上說mWakeLock.acquire()可以亮屏,mWakeLock.release()就可以息屏,但實際測試中發現無效acquire確實可以亮屏,但是releasea卻不能息屏。但是acquire亮屏也是有限制的,當系統沒有休眠的情況下是可以點亮的,一旦系統進入休眠狀態,則無效。

相關推薦

Android

最近的專案要求apk能在空閒一會後讓螢幕熄滅,檢測到有使用者到來(距離感測器觸發)後點亮螢幕。百度了一大堆發現很多都不靠譜,google了一會才勉強找到一種能滿足需求的方法,說勉強是因為這種方法需要到系統設定中給該app裝置管理的許可權,這使得熄屏與亮屏這樣看似

keyguard分析之二:流程篇

息屏與亮屏時, Keyguard繪製的基本流程   手機的Power鍵在滅屏是會載入keyguard, 保證使用者在亮屏時,第一時間看到鎖屏介面,以保證使用者的良好體驗. 在亮屏過程中涉及到了兩條主要的執行緒: PowerManager Thread 和DisplayMa

Android P 版本 按power鍵熄UI控制元件無響應

測試步驟:  [1]設定-->安全性和位置資訊-->螢幕鎖定-->選擇"無" [2]進入可以本地僅僅可以重新整理的介面. [3]先熄屏,然後在亮屏. [4]發現UI有卡死的效果.(點選無反應,上次滑動也無反應) [5]按back/home/Recents,

Android 實現app保持

第一種方式 第一步:新增許可權 <uses-permission android:name="android.permission.WAKE_LOCK"></uses-pe

Android實現橫之間的轉換

public void switchOrientation(View v){ int orientation = getResources().getConfiguration().orientation; if (orientation == Config

LayaAir 螢幕適配-橫

目錄 螢幕方向 screenMode=none screenMode=horizontal screenMode=vertical 橫豎屏切換程式碼 螢幕方向 laya.display.Stage 類的 screenMode 屬性用於定義螢幕模式,即設定螢幕橫屏或者豎

自定義MediaController來實現修改底部佈局作以及實現vedioview半的切換

因為直接使用系統vedioview,底部的MediaController佈局有點不好看,尤其是進度條,不能實現辦半屏與全屏的切換,自己網上看了下別人的資料,整理了下,做以筆記;初學者,勉強才實現這些功能,還有許多地方不明白。 看下效果:                   

如何獲取螢幕的狀態以及橫自動切換

demo1:獲取螢幕的狀態 ,橫屏與豎屏自動切換fragment publicclassMainActivityextendsActivity{@Overrideprotectedvoid onCreate(Bundle savedInstanceState){super.

android之PowerManager 電源管理,解決滅狀態下來簡訊螢幕不會點問題

  可解決滅屏狀態下來簡訊螢幕不會點亮問題    PowerManager這個類主要是用來控制電源狀態的. 通過使用該類提供的api可以控制電池的待機時間,一般情況下不要使用。如果確實需要使用,那

Android 螢幕滅廣播,螢幕滅監聽

service 類註冊廣播進行監聽 /** * 作者:created by meixi * 郵箱:[email protected] * 日期:2018/9/27 09 */ public class Serview extends Service { /**

Android 十年之路: 主導航

作者 / E.K. Chung, Android 與 Pixel 使用者體驗主設計師 今年是 Android 誕生 10 週年,我們認為是時候回顧一下過去,看看它的演變歷程了。很顯然,自 2008 年以來這個作業系統發生了巨大的變化,那一年,《暮光之城》才剛上映,碧昂絲的《Sin

Android簡訊通知

平臺 MTK android版本 8.1 主動顯示功能 谷歌在android 6.0之後有一個主動顯示的功能,如果裝置支援這個功能的話,直接設定這個功能預設開啟就可以了,因為正常喚醒螢幕的操作是會影響手機功耗的. 對應的Setting屬性 (./base/core/java/andr

Android tips(九)-->Android轉化gif圖

最近有同學問我android手機的錄屏以及轉化成gif圖是如何實現的?今天正好就講講android的錄屏與轉化gif操作。整個Android系統的錄製與轉化GIF圖是分為兩個部分,錄製過程與轉化過程,下面就詳細的介紹一下這兩個部分的具體過程。 androi

【架構分析】AndroidActivity生命週期的變化

概述 Android開機啟動後預設會先進入鎖屏然後滅屏休眠, 本文旨在介紹這個過程中最先啟動的Home Launch Activity (其實在Android N上最早被啟動的是Settings中的FallbackHome Activity) 如何發生相關的生命週期變化, 以及AMS

Android 防止白華為手機歡迎頁面全時設定背景拉伸圖片

1、在drawable裡面書寫歡迎頁面的背景splash_bg檔案 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/re

Android加速度感測器 -- 擡手

android系統提供以下感測器供應用層使用,具體如下:// android.hardware.Sensor TYPE_ACCELEROMETER 1 // 加速度感測器 TYPE_MAGNETIC_FIELD 2 // 磁力感測器 TYPE_ORI

Android getWindow().setFlags方法 設定窗體全背景模糊 &&WindowManager.LayoutParams詳解

//設定窗體全屏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutP

ionic監聽android和後臺執行的生命週期

Hi,寶寶們,我又來了,我最近遇到一個問題,就是在ionic中監聽android的息屏、應用退出在後臺執行,之後重新進入應用的事件,這個寫過原生的都知道,android會在不用的時間,執行不同的生命週期,息屏(onPause->onStop),activity再次進入活

android、暗、解鎖、關閉系統對話的監聽事件

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.butt

android 鎖頻錄音、錄視訊、電話自動錄音

最近幾天心血來潮,做了一個搜尋證據的app-------證據寶,功能如下: 一:普通錄音功能,可以在應用內啟動和停止錄音,也可以按音量鍵啟動和停止錄音,熄屏或者鎖屏狀態也可以錄製,可以在設定頁面禁止此功能。 二:視訊錄製功能,可以在應用內啟動和停止錄製,也可以按音量鍵啟動和