2012-04-10 12 views
17

Androidのディスプレイの前面に常にあるアクティビティを作成したいと考えています。 入力を受け取らず、その下にあるアプリケーションに渡します。 HUDのようなもの。Androidで常にトップのフルスクリーンオーバーレイアクティビティを作成する方法

基本的なウィンドウタイプをTYPE_SYSTEM_ALERTに設定する必要があることを調査できましたが、Androidが自分のコードを無視しているように見えます。マニフェストの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 /透明としての活性を設定されています。私がしようとしていることは、ユーザーが何をしているのか(他のアプリケーションの起動、電話のロックなど)にかかわらず、一番上に常にアクティビティを作成することです。 – tmouse

+0

あなたは '使用しました。<使用許可アンドロイド:名=「android.permission.SYSTEM_ALERT_WINDOW」>私は私が使用した書いたように、はいこの – 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に設定されているので、にはと入力しないでください。そしてを明示的にに設定しても、デバイスの寸法に合わせてレイアウトの幅と高さを設定してください。は、画面の向きが変わったときに更新されます。私たちは、私はフルスクリーンオーバーレイの正しい建設はとても似ていることがわかった...


を異なるアプローチが必要になります。

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ソースコードを提供しています。

関連する問題