Android 4.4デバイスでシステムステータスバーを非表示にしようとしています。これは、自分のアプリがデバイスで実行される唯一のアプリであるキオスクモード用です。現在、2013 Nexus 7です。
デバイスはルート化されており、下のナビゲーションバーを this post からの情報とともに完全に削除することができました。
一番上のステータスバーについては、私が試したすべてが一時的にバーを隠すだけです。ユーザーが画面の上部を下に移動すると、ステータスバーが再び表示されます。私は、彼らに時間を見せたり、設定にアクセスしたり、通知を見ることを許可したくありません。
私が見つけてすでに試した投稿:
助言がありますか?
理想的には、これを行うためにbuild.propを編集できるようになりたいと思っています。これは、ナビゲーションバーに対して既に行っており、同時に行うことができるからです。私は自分でAndroidイメージをビルドする必要がないようにしています。
更新:
さらにいくつかの作業を行った後、これはAndroidの正確なビルド、またはそれが実行されているデバイスにある程度依存しているようです。
私が取り組んでいるNexusシリーズなどの一部のデバイスでは、ユーザーがスワイプしてバーを再表示できます。
しかし、私は最近Verizon Eclipseでこれを試してみましたが、バーが表示されないので、探していました。
私はまだすべてのデバイスを対象とするより良いソリューションを探していますが、おそらく自分のAndroidビルドを作成することになります。
KitKatデバイスのステータスがフルスクリーンモードで表示されるのを防ぐことができなかったため、要件に合ったハックを作成しました。つまり、ステータスバーの拡張をブロックしました。
それが機能するために、アプリは全画面表示されませんでした。ステータスバーにオーバーレイを配置し、すべての入力イベントを消費しました。ステータスの拡大を防ぎました。
注:
更新済み
<uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW"/>
customViewGroup実装 コード:
WindowManager manager = ((WindowManager) getApplicationContext()
.getSystemService(Context.WINDOW_SERVICE));
WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams();
localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
localLayoutParams.gravity = Gravity.TOP;
localLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
// this is to enable the notification to recieve touch events
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
// Draws over status bar
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
localLayoutParams.height = (int) (50 * getResources()
.getDisplayMetrics().scaledDensity);
localLayoutParams.format = PixelFormat.TRANSPARENT;
customViewGroup view = new customViewGroup(this);
manager.addView(view, localLayoutParams);
これがあなたを助けることを願っています
これは古い質問ですが、誰かの助けになることを願っています。これまでに使用したステータスバーを無効化および有効化する2つの非常に簡単な呼び出しを示します。コマンドラインから使用するか、Java app:
無効にする:
service call activity 42 s16 com.Android.systemui
有効にする:
am startservice -n com.Android.systemui/.SystemUIService
@gonglongが提供する回避策を試しましたが、回避策が開始されるとUIがフラッシュするため、結果に満足できませんでした。
代わりに、ルートとしてこれを行うことができました。
settings put secure user_setup_complete 0
通常のデバイスでは、これによりデバイスの初期セットアップが開始されると思いますが、私のデバイスでは、システムからそのAPKを削除したので、それは起こりません。
これは私が見つけることができる場所には文書化されていませんが、最高の設定UIを下にドラッグできないという素晴らしい効果があります。通知領域は引き続き下にドラッグできます。
私が便利だと思った別の設定は次のとおりです。
settings put global device_provisioned 0
これにより、[電源]メニューの[機内モード]および[サイレントモード]オプションが非表示になります。これは、私のアプリケーションの追加ボーナスです。
より多くの副作用があるかもしれませんが、私は私にとって重要なものをまだ見つけていません。
このリストは、Nexus 7 2013から取得したものですLTE Running new new Android 4.4.3(KTU84L)。角括弧内の数字は、 dbファイル。これは、基本的なセットアップデバイスのセットアップと開発者/ USBの有効化の後、ただし設定にその他の変更を加える前
このファイルはdata/data/com.Android.providers.settings/databases/settings.db
で見つかりました
注:一部のURLでは、SOフィルターをバイパスするために余分なスペース文字を追加する必要がありました
system
名前空間global
名前空間secure
名前空間私はこの答えを使ってソフトキーを隠しました: https://stackoverflow.com/a/27003890/1525867
そして、ステータスバーを無効にするために(これはあなたのデバイスに害を及ぼす可能性があるので、慎重に行ってください。それをする前に何度かデバイスを台無しにしました)Asus Tinker Boardでテスト、Android 6:
path
に追加してくださいデバイスからSystemUI.apk
を引き出します:adb pull /system/priv-app/SystemUI/SystemUI.apk
SystemUI.apk
へのパスは異なる場合があります
framework-res.apk
をデバイスからプルadb pull /system/framework/framework-res.apk
framework-res.apk
へのパスは異なる場合があります
apktool if framework-res.apk
を実行します
apktool if SystemUI.apk
を実行します
apktool d SystemUI.apk
を実行します
SystemUI\res\layout\status_bar.xml
を開き、Android:visibility="gone"
を一番上のxml要素に追加します(私にとってはcom.Android.systemui.statusbar.phone.PhoneStatusBarView
)
apktool b SystemUI
を実行します
SystemUI\original
に移動し、AndroidManifest.xml
とMETA-INF
をSystemUI\build\apk\
にコピーします
apktool b SystemUI
を再度実行します
SystemUI\dist\
に移動し、デバイスの元のSystemUI.apk
をSystemUI\dist\SystemUI.apk
のadb Push SystemUI\dist\SystemUI.apk /system/priv-app/SystemUI/SystemUI.apk
で上書きします
デバイスを再起動します
このスレッドに基づいて https://forum.xda-developers.com/showthread.php?t=2203166
その問題に対して私が見つけた素晴らしい解決策は、各アクティビティtheme
&windowSoftInputMode
を次の値に設定することです。
<activity Android:name=".MyActivity"
Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen"
Android:windowSoftInputMode="adjustResize"> <!-- theme : to set the activity to a full screen mode without a status bar(like in some games) -->
</activity> <!-- windowSoftInputMode : to resize the activity so that it fits the condition of displaying a softkeyboard -->
詳細については こちらを参照 。
完璧な解決策はありませんが、回避策はあります。基本的な考え方は、システムのUIステータスの変化をリッスンし、ナビゲーション/ステータスバーを強制的に非表示にすることです。 IMMERSIVE_STICKYモードの設定と同様に有効になりますが、ナビゲーション/ステータスバーがIMMERSIVE_STICKYより速く消えます。
ここにあります:
onCreate()およびonResume関数でシステムUIスタイルを設定し、システムUI変更リスナーを設定します
mDecroView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE);
mDecroView.setOnSystemUiVisibilityChangeListener(this);
onSystemUiVisibilityChangeでシステムバーを非表示に設定し、数秒後にシステムuiを設定します。そうしないと有効になります(システムバーがまだ完了していない場合、システムuiの設定要求を無視することがあります)
public void onSystemUiVisibilityChange(int visibility) {
// TODO Auto-generated method stub
Log.d(TAG, "onSystemUiVisibilityChange called with visibility " + visibility);
if((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0){
if(null == mHandler){
mHandler = new MyHandler();
}
if(null != mHandler){
mHandler.removeMessages(MSG_HIDE_SYSTEM_BAR);
mHandler.sendEmptyMessageDelayed(MSG_HIDE_SYSTEM_BAR, 50);
}
//the deccro view is not in full screen
Log.d(TAG, "setSystemUiVisibility");
Log.d(TAG, "current system ui is " + mDecroView.getSystemUiVisibility());
}
}
次のようにシステムUIを設定できます。
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch(msg.what){
case MSG_HIDE_SYSTEM_BAR:
mDecroView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE);
break;
}
}
これを前に追加:setContentView(R.layout.x);
this.requestWindowFeature(Window.FEATURE_NO_TITLE); // Removes title bar
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.x);