2012-04-10 4 views
17

항상 안드로이드 디스플레이 앞에있는 활동을 만들고 싶습니다. 입력이 없어야하며, 그 아래에있는 응용 프로그램으로 전달하십시오. HUD와 같은 것.안드로이드에서 항상 최상위 전체 화면 오버레이 활동을 만드는 방법

기본 윈도우 유형을 TYPE_SYSTEM_ALERT로 설정해야한다는 것을 조사 할 수 있었지만 안드로이드가 내 코드를 무시하는 것처럼 보입니다. 매니페스트에서 android.permission.SYSTEM_ALERT_WINDOW 권한을 삭제해도 예외가 발생하지 않습니다. (이 창 유형을 사용해야합니다). 대화 상자에 ALERT 유형을 사용하려고 시도했지만 정상적으로 작동했지만 대화 상자를 전체 화면 투명 엔터티로 만들 수 없습니다. 여기 내 코드가 있습니다. 아마도 간단한 누락이있을 수 있습니다.

public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);   

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);    
    getWindow().setBackgroundDrawableResource(android.R.color.transparent); 
    getWindow().setFormat(PixelFormat.TRANSLUCENT); 
    setContentView(R.layout.main); 
} 

반투명 설정은 그렇지도 작동하지 않았다, XML 매니페스트에서 외부에서 활성화해야합니다.

<item name="android:windowIsTranslucent">true</item> 

답변

23
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.FLAG_FULLSCREEN, 
WindowManager.LayoutParams.FLAG_FULLSCREEN, 
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, 
PixelFormat.TRANSLUCENT); 

WindowManager wm = (WindowManager) getApplicationContext() 
    .getSystemService(Context.WINDOW_SERVICE); 

ViewGroup mTopView = (ViewGroup) App.inflater.inflate(R.layout.main, null); 
getWindow().setAttributes(params); 
wm.addView(mTopView, params); 
+0

onCreate 메서드는 어떻게 생겼습니까? 나는 지금 이것을 직접 시험하고있다. – Rell3oT

+3

ViewGroup mTopView = (ViewGroup) App.inflater.inflate (R.layout.main, null); @tmouse 여기 APP는 무엇입니까? – rana

+1

@tmouse R.layout.main이란 무엇입니까? 활동 레이아웃입니까? 또는 필러 뷰가 투명합니까? – Premier

0

체크 아웃 당신이 당신의 활동을 전체 화면 및

체크 아웃이

또한 투명하게 만들려면이

당신의 AndroidManifest.xml 파일

<activity android:name=".MyActivity" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" /> 

에 언급

<activity android:name=".MyActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" /> 
+0

위의 내용은 액티비티를 fulscreen/transparent로 설정하는 것입니다. 내가 뭘 하려는지 사용자가 (다른 응용 프로그램을 시작, 전화를 잠그고 등) 뭐하고 있든 항상 상단에 활동을 만드는 것입니다. – tmouse

+0

체크 아웃하지 않은 경우 매니페스트 파일에서''을 사용 했습니까 – Ravi1187342

+0

예. 위의 코드가 실행될 때이 사용 권한은 사용되지 않습니다 (잘못된 경우 - 그러한 창이 표시 되려면 사용 권한이 필요합니다). – tmouse

1

나는 the accepted answer (by tmouse)이 나를 위해 잘 작동하지 않는다는 것을 발견했다. 이전 API 수준에서 작동했을 수도 있습니까? 나는 특히 대답이 추천 한 24

그건 API 레벨을 사용하고 있습니다 :

final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.FLAG_FULLSCREEN, 
    WindowManager.LayoutParams.FLAG_FULLSCREEN, 
    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 
    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, 
    PixelFormat.TRANSLUCENT 
); 

이 문제가 있습니다.

enter image description here

는 그래서 WindowManager.LayoutParams.FLAG_FULLSCREEN 플래그가 int wint h에 대한 명시 적 값으로 사용됩니다 다음과 같이 WindowManager.LayoutParams을 위해 존재하는 생성자입니다. 이것은 좋지 않다! 보기의 크기가 1024 * 1024로 설정되므로 을 채우지 않고 화면에을 입력하십시오. 그리고 비록 명시 적으로 장치의 치수와 일치하도록 레이아웃의 너비와 높이를 설정하면 화면 방향이 변경 될 때 이 아닌 업데이트가됩니다. 우리는 다른 접근 방식을 필요로 ... I 전체 화면 오버레이에 대한 올바른 건설과 같이 것으로 나타났습니다


:

final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, // TYPE_SYSTEM_ALERT is denied in apiLevel >=19 
    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_FULLSCREEN, 
    PixelFormat.TRANSLUCENT 
); 

이 우리를 명시 적으로 더 이상 이 폭을 지정 의미 신장. 레이아웃은 대신 우리 플래그에 전적으로 의존합니다.

예, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN은 필수 플래그입니다. 상태 표시 줄과 같은 장식을 그릴 필요가있을 때 필요합니다.

WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY은 API 레벨> = 19에서 TYPE_SYSTEM_ALERT 대신 사용해야합니다. 이것은 내가 잠시 전에 썼던 메모입니다. 슬프게도 제가 왜 그렇게 생각했는지 확인하기 위해 인용문을 찾을 수 없었기 때문에, 소금으로 꼬집어 말하십시오.

귀하의 이러한 권한이 필요합니다 매니페스트 (설명 here을) :

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


보너스 노트 (당신이이 글을 읽고 있다면, 당신은 아마 전체 화면 오버레이를 만들려고 노력하고 있습니다)

필자의 이해로는 SYSTEM_ALERT_WINDOW이 필요하지만 실제로는 ACTION_MANAGE_OVERLAY_PERMISSION이 필요합니다. 런타임시 사용자에게 SYSTEM_ALERT_WINDOW 권한을 요청할 수 있습니다.

전체 화면 오버레이를 만드는 내 작업 API 레벨 24 앱에 here 소스 코드를 제공합니다.

관련 문제