Android : 프로그래밍 방식으로 화면을 켜고 끄는 방법은 무엇입니까?


98

이 게시물을 "중복"으로 표시하기 전에 다른 게시물이 문제에 대한 해결책을 갖고 있지 않기 때문에이 게시물을 작성합니다.

장치를 끄려고하는데 몇 분이나 센서가 교체 된 후 다시 켜십시오.

디스플레이 테스트 끄기

다음을 사용하여 화면을 끌 수 있습니다.

params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = 0;
getWindow().setAttributes(params);

wl.release () 메서드를 사용하여 화면을 끌 수 없습니다.

디스플레이 테스트 켜기

내 첫 번째 추측은 다음과 같이 작동하지 않습니다. 아무 일도 일어나지 않고 화면이 꺼져 있습니다.

params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = -1f;
getWindow().setAttributes(params);

그런 다음 깨어나 기 위해 시도했지만 성공하지 못했습니다.

PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "tag");
wl.acquire();

마지막으로 결과없이 다음을 시도했습니다.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

대체로 이러한 방법에 대해 콘솔에 오류가 발생하지 않습니다. 전원 버튼을 사용하여 장치를 켰을 때 "화면이 켜져 있어야합니다"라는 테스트 텍스트가 화면에 표시됩니다. 이것은 코드가 실행되어야 함을 보여줍니다. 코드를 테스트 한 경우에만 대답하십시오.와 같은 많은 기능 params.screenBrightness = -1이 sdk에 따라 작동하지 않는 것 같습니다.


1
화면을 끄는 방법이 작동하지 않았습니다. 화면이 항상 켜져 있도록 플래그를 설정하면 전력이 소모됩니다.
Kristy Welsh

당신은 이것을 알아 낸 적이 있습니까? PlayStore에 몇 가지 앱이 있습니다. 이것을 시도하고 작동하지만 장치 관리를 요청합니다. play.google.com/store/apps/…
George

이 문제에서 뭔가 도달 했습니까? !!
Muhammed Refaat

답변:


69

응용 프로그램이 포 그라운드에있는 동안에 만 이것이 적용되기를 원한다고 가정하겠습니다.

이 코드 :

params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = 0;
getWindow().setAttributes(params);

전통적인 의미에서 화면을 끄지 않습니다. 화면을 최대한 어둡게 만듭니다. 표준 플랫폼에서는 어둡게 할 수있는 한계가 있습니다. 기기에서 실제로 화면이 완전히 꺼지는 것을 허용하는 경우, 이는 해당 기기 구현의 일부 특이성이며 여러 기기에서 신뢰할 수있는 동작이 아닙니다.

사실이 기능을 FLAG_KEEP_SCREEN_ON과 함께 사용하면 특정 장치에서 화면 밝기를 최대로 설정하도록 허용하더라도 화면이 꺼지지 않도록 (따라서 장치가 저전력 모드로 전환되는 것을) 허용하지 않습니다. 이것을 매우 명심하십시오. 화면이 실제로 꺼져있을 때보 다 훨씬 더 많은 전력을 사용하게됩니다.

이제 화면을 일반 밝기로 되돌리려면 밝기 값만 설정하면됩니다.

WindowManager.LayoutParams params = getWindow().getAttributes();
params.screenBrightness = -1;
getWindow().setAttributes(params);

이것이 이전에 설정 한 0 값을 대체하지 않는 이유를 설명 할 수 없습니다. 테스트로 특정 밝기로 강제하기 위해 강제 전체 밝기를 적용 할 수 있습니다.

WindowManager.LayoutParams params = getWindow().getAttributes();
params.screenBrightness = 1;
getWindow().setAttributes(params);

이것은 확실히 작동합니다. 예를 들어 Google의 도서 앱에서는이를 사용하여 책을 사용하는 동안 화면 밝기를 어둡게 설정 한 다음 끄면 일반 밝기로 돌아갈 수 있습니다.

디버그를 돕기 위해 "adb shell dumpsys window"를 사용하여 창의 현재 상태를 볼 수 있습니다. 창에 대한 데이터에서 현재 설정된 LayoutParams를 알려줍니다. 당신이 생각하는 가치가 실제로 거기에 있는지 확인하십시오.

다시 말하지만 FLAG_KEEP_SCREEN_ON은 별도의 개념입니다. 그것과 밝기는 서로 직접적인 영향을 미치지 않습니다. (그리고 밝기를 0으로 설정할 때 이미 설정 한 경우 밝기를 취소 할 때 플래그를 다시 설정할 이유가 없습니다. 플래그는 변경할 때까지 설정된 상태로 유지됩니다.)


8
화면을 끄는 더 좋은 방법이 있습니까?
akash

@hackbod가 위에서 언급했듯이 "params.screenBrightness = 0;" 화면을 완전히 끄지 않습니다. 대신 화면을 최대한 어둡게 만듭니다. 그리고 "params.screenBrightness = -1;" 화면을 이전 밝기 수준으로 되돌립니다. 그러나 화면을 완전히 꺼야하는 경우가 있습니다. 다른 방법 ...있을 수 있습니다
jonathanzh

6
작동하거나 작동하지 않을 수있는 최소 밝기를 설정하는 대신 실제로 화면을 끄는 다른 방법은 무엇입니까?
Michael

37

화면 잠금 후 화면을 켜는 방법을 작성했습니다. 그것은 나를 위해 완벽하게 작동합니다. 시도 해봐-

    private void unlockScreen() {
        Window window = this.getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
        window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
        window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    }

그리고이 메서드를 onResume().


1
활동을 종료하려고 할 때 화면을 켤 계획 인 경우 유용하지 않습니다.
AndroidDev 2013-08-25

7
글쎄요, 저는 Micromax Canvas2 +에서 저에게 효과가 없었기 때문에 제 방법을 사용하지 말 것을 제안합니다. 대신 이 링크 를 사용하십시오 .
Rajkiran 2010 년

28

나는 이것을 제안 할 것이다 :

PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
wl.acquire();

ACQUIRE_CAUSES_WAKEUP 플래그는 다음과 같이 설명됩니다.

일반 wake lock은 실제로 조명을 켜지 않습니다. 대신 조명이 켜지면 (예 : 사용자 활동에서) 계속 켜져 있습니다. 이 플래그는 WakeLock을 획득 할 때 화면 및 / 또는 키보드가 즉시 켜지도록 강제합니다. 일반적으로 사용자가 즉시 볼 수있는 중요한 알림에 사용됩니다.

또한 AndroidManifewst.xml 파일에 다음 권한이 있는지 확인하십시오.

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

3
안타깝게도 SCREEN_BRIGHT_WAKE_LOCK 플래그는 더 이상 사용되지 않습니다.
Camille Sévigny 2014

20

안녕하세요, 이것이 도움이되기를 바랍니다.

 private PowerManager mPowerManager;
 private PowerManager.WakeLock mWakeLock;

 public void turnOnScreen(){
     // turn on screen
     Log.v("ProximityActivity", "ON!");
     mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
     mWakeLock.acquire();
}

 @TargetApi(21) //Suppress lint error for PROXIMITY_SCREEN_OFF_WAKE_LOCK
 public void turnOffScreen(){
     // turn off screen
     Log.v("ProximityActivity", "OFF!");
     mWakeLock = mPowerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "tag");
     mWakeLock.acquire();
}

근접 센서를 사용하지 않고 화면을 끄는 방법은 무엇입니까?
Michael

안녕하세요 @Michael, 당신은 단순히 public void turnOffScreen () 함수만을 사용합니다
mangu23

3
예,하지만이 기능은 PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK근접 센서가 "근접"상태 일 때만 화면을 끄는 기능을 사용 하는 것으로 보입니다 .
Michael

Ahh 알았어요, 대신 이것을 사용할 수 있습니다 PowerManager.SCREEN_DIM_WAKE_LOCK
mangu23

1
문제- PROXIMITY_SCREEN_OFF_WAKE_LOCK대기 잠금을 해제하자마자 화면이 다시 나타납니다. 이것을 어떻게 방지합니까?
Michael

7
     WakeLock screenLock =    ((PowerManager)getSystemService(POWER_SERVICE)).newWakeLock(
    PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
    screenLock.acquire();

  //later
  screenLock.release();

// 사용자 매니페스트 파일


2
정답이되어야합니다. 저는 Android 5를 사용하고 있으며 이것이 실제로 작동하는 유일한 것입니다. 참고로 SCREEN_BRIGHT_WAKE_LOCK이 더 이상 사용되지 않으며 드롭 인 대체품이 보이지 않습니다. 누군가?
HammerNL 2010 년

문제 없습니다. 귀하의 답변은 완벽하게 사용할 수 있습니다. 내가 말했듯이 : "실제로 작동하는 유일한 해답이다"
HammerNL

@HammerNL이 답변과 ramdroid에서 제공하는 답변의 차이점은 무엇입니까?
Bugs Happen

@BugsHappen Ramdroids 하나는 더 정교합니다. :)하지만 예, 동일합니다. Pir Fahim Shah 가이 답변을 게시 한 이유 또는 Ramdroids를 한 번에 보지 못한 이유를 모르겠습니다.
HammerNL

6

Manifest 파일에서 적절한 권한을 요청 했습니까?

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

AlarmManager 1 클래스를 사용 하여 활동을 시작하고 wake lock을 획득하는 인 텐트를 실행할 수 있습니다 . 그러면 화면이 켜지고 계속 켜져 있습니다. wakelock을 해제하면 장치가 자체적으로 절전 모드로 전환됩니다.

PowerManager를 사용하여 기기를 절전 모드로 설정할 수도 있습니다. http://developer.android.com/reference/android/os/PowerManager.html#goToSleep(long)


1
응답 해 주셔서 감사합니다. 그래 확실해. 내 매니페스트에 있으며 디버그 오류가 없습니다. AlarmManager는 센서를 사용하여 화면을 켤 때 도움이되지 않습니다. 나는 goToSleep에 많은 운이 없었지만 여전히 화면을 켜는 데 도움이되지 않습니다. 나는 현재 화면이 꺼져 갈 수 있도록 할 수 있어요
thegreyspot

5

이를 수행하는 가장 좋은 방법 (루팅 된 장치 사용) :

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    .
    .
    .

    int flags = WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
    getWindow().addFlags(flags); // this is how your app will wake up the screen
    //you will call this activity later

   .
   .
   .
}

이제 다음 두 가지 기능이 있습니다.

private void turnOffScreen(){

  try{
     Class c = Class.forName("android.os.PowerManager");
     PowerManager  mPowerManager = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
     for(Method m : c.getDeclaredMethods()){
        if(m.getName().equals("goToSleep")){
          m.setAccessible(true);
          if(m.getParameterTypes().length == 1){
            m.invoke(mPowerManager,SystemClock.uptimeMillis()-2);
          }
        }
     } 
  } catch (Exception e){
  }
}

이:

public void turnOnScreen(){
  Intent i = new Intent(this,YOURACTIVITYWITHFLAGS.class);
  startActivity(i);
}

내 하찮은 영어 실력에 죄송하다는 말씀을 드리고 싶습니다.


안녕하세요, Rodrigo Gontijo 우리가 장치를 루트해야하는 이유 pl. 말해?
Kinjal

@Kinjal ( "goToSleep") 함수를 호출해야하고이 함수에는 시스템 앱에만 부여 된 특별한 권한이 필요하기 때문에 : <uses-permission android : name = "android.permission.DEVICE_POWER"/>
Rodrigo Gontijo

감사합니다. 가능한 경우 장치를 루팅하는 방법 또는 링크를 제공하십시오. 미리 감사드립니다.
Kinjal

4

다음은 낮은 화면 밝기 값을 지원하는 장치에서 동일한 구현의 성공적인 예입니다 (API15를 실행하는 Allwinner Chinese 7 "태블릿에서 테스트했습니다).

WindowManager.LayoutParams params = this.getWindow().getAttributes();

/** Turn off: */
params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
//TODO Store original brightness value
params.screenBrightness = 0.1f;
this.getWindow().setAttributes(params);

/** Turn on: */
params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
//TODO restoring from original value
params.screenBrightness = 0.9f;
this.getWindow().setAttributes(params);

다른 사람이 이것을 시도하면 작동 / 작동하지 않았고 장치, Android API가 아래에 설명되어 있습니다.


2
내 기기 인 넥서스 7에서는이 기능이 제대로 작동하지 않고 화면이 여전히 켜져 있고 조금 더 어둡지 만 완전히 검은 색은 아닙니다.
JackWM 2013

확실히이 구현은 특정 장치와의 통합을 제공 할 수 있지만 공개 릴리스에 사용해서는 안됩니다. 나중에 누군가에게 도움이 될 수 있으므로 게시물을 유지하겠습니다.
ılǝ 2013

3

화면을 계속 켜려면 :

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

화면 기본 모드로 돌아 가기 : 플래그 FLAG_KEEP_SCREEN_ON을 지우십시오.

getWindow().clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

3

이것은 Marshmallow에서 작동합니다.

private final String TAG = "OnOffScreen";
private PowerManager _powerManager;
private PowerManager.WakeLock _screenOffWakeLock;

public void turnOnScreen() {
    if (_screenOffWakeLock != null) {
        _screenOffWakeLock.release();
    }
}

public void turnOffScreen() {
    try {
        _powerManager = (PowerManager) this.getSystemService(POWER_SERVICE);
        if (_powerManager != null) {
            _screenOffWakeLock = _powerManager.newWakeLock(PROXIMITY_SCREEN_OFF_WAKE_LOCK, TAG);
            if (_screenOffWakeLock != null) {
                _screenOffWakeLock.acquire();
            }
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

SO 회원이 더 잘 이해하는 데 도움이 될 귀하의 답변이 작동하는 이유를 설명하면 좋을 것입니다.
dkb

근접 센서는 훨씬 근처에서가는 때 화면 끄면 ... 너무 잘 작동하지 않는, 화면에 ... 다시 와서 내가 그 전에 웨이크 잠금을 해제하는 경우, 그것은 여전히 온다 즉시 !
Michael


2

앱이 시스템 앱인 경우 PowerManager.goToSleep ()을 사용하여 화면을 끌 수 있으며 특별한 권한이 필요합니다.

goToSleep ()을 사용하기 전에 다음과 같이 리플렉션을 사용해야합니다.

public static void goToSleep(Context context) {
    PowerManager powerManager= (PowerManager)context.getSystemService(Context.POWER_SERVICE);
    try {
        powerManager.getClass().getMethod("goToSleep", new Class[]{long.class}).invoke(powerManager, SystemClock.uptimeMillis());
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }
}

이제 goToSleep ()을 사용하여 화면을 끌 수 있습니다.

이것은 화면을 끄기 위해 전원 키를 눌렀을 때 발생합니다.


2

간단히 추가

android:keepScreenOn="true" 

또는 전화

setKeepScreenOn(true) 

부모보기에서.


1

나는 활동에서 "화면을 깨우는"희망이 없을 것이다. 화면이 꺼져 있으면 활동이 일시 중지 된 상태 일 수 있으며 코드를 실행하면 안됩니다.

깨어날 때 잠금 화면 문제가 있습니다. 어떤 앱이 자동으로 잠금 화면을 우회 할 수 있는지 모르겠습니다.

서비스에서 백그라운드 작업을 실행 한 다음 알림 관리자를 사용하여 무엇이든 감지되면 알림을 보내는 것을 고려해야합니다. 알림은 일종의 장치 경고 (화면 깨우기, 알림 아이콘, 알림 LED 등)를 제공해야합니다. 알림을 클릭하면 활동을 시작하려는 의도를 시작할 수 있습니다.

서비스에서 직접 활동을 시작하려고 할 수도 있지만 이것이 화면을 켜거나 잠금 화면을 우회 할 것인지는 잘 모르겠습니다.


응답 해 주셔서 감사합니다. 진동 코드를 입력하고 화면을 끄고 센서 중 하나를 활성화하면 진동이 발생합니다. 따라서 코드는 확실히 실행 중입니다. 잠금 화면은 큰 문제가 아니라 키 가드 만 사용합니다.
thegreyspot 2012 년

코드가 실행 되더라도 수명주기 밖에 있습니다. 화면에서 벗어난 활동은 믿을 수 없습니다. 게임 다운로더는 대부분 활동에 작성되어 있으며 30 초에서 몇 분 정도 남겨 두어도 여전히 다운로드되지만 OS가 사용 패턴에 따라 활동을 종료하기 때문에 일반적으로 중단됩니다.
HaMMeReD

1

Android API 28 이상에 따라 화면을 켜려면 다음을 수행해야합니다.

setShowWhenLocked(true); 
setTurnScreenOn(true); 
KeyguardManager keyguardManager = (KeyguardManager)
getSystemService(Context.KEYGUARD_SERVICE);
keyguardManager.requestDismissKeyguard(this, null);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.