android 动态显示状态栏和导航栏
来源:互联网 发布:python 当前日期时间 编辑:程序博客网 时间:2024/05/17 22:56
开始的时候在网上搜过很多方法,包括
1.通过命令移除SystemUI.apk放到一个文件夹中,然后重新启动com.systemui.SystemUIService这个服务
如果想恢复就把SystemUI.apk移到/system/app/下并且重新启动com.systemui.SystemUIService这个服务。
2.通过不断查杀com.android.systemui(这种暴力的方式不知道有什么后果)
这种方式可以使用如下命令搜出进程号:
process = ps | grep -i "systemui"|busybox awk 'BEGIN {FS=" "} {print $2}'
然后kill $process
不过现象是总是会回到锁屏界面,可以尝试使用定时器每五百毫秒进行一次查杀。
3.还有一种是使用标准的api ,在apk中去使用这个方法去隐藏,不过下拉之后就会显示出状态栏。
猜想:这个要结合禁止下拉一起使用,方才可以。
public void is_full(boolean enable) { if (enable) { WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN ;// lp.flags |= WindowManager.LayoutParams.TYPE getWindow().setAttributes(lp); getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); } else { WindowManager.LayoutParams attr = getWindow().getAttributes(); attr.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().setAttributes(attr); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); } }
还有一个api是使用如下方法,不过也没有效果,只能实现如图库,视频等的“不触摸全屏显示”:
(具体更多的flag请自行搜索)
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
最后成功的方法是:
在PhoneStatusBar.java中添加广播接受器,动态地add 和 remove 相应的视图。
在其中添加了静止下拉的操作,和禁掉了一些StatusBar的UI,并隐藏了NavigationBar。
也算勉强达到了效果。
完整的补丁如下,本人是在4.4的平台上操作的,仅供参考(不同平台请移植):
$ git diff packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.javadiff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.javaindex a4d1b5f..f21c8ce 100644--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java@@ -38,6 +38,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter;+import android.content.SharedPreferences; import android.content.res.Configuration; import android.content.res.Resources; import android.database.ContentObserver;@@ -254,6 +255,13 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { int[] mAbsPos = new int[2]; Runnable mPostCollapseCleanup = null;+ //modified by 3110 hide or display navbar+ private boolean mDisplayNav = true;+ private final String PREF_NAME = "systemui";+ private final String PREF_DISPLAY_NAV = "display_nav";+ private SharedPreferences mSharePref;++ // for disabling the status bar int mDisabled = 0;@@ -279,6 +287,29 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { } };+ //modified by 3110 hide and display NavBar+ private BroadcastReceiver mBroadcastReceiver1 = new BroadcastReceiver() {+ @Override+ public void onReceive(Context context, Intent intent) {+ String action = intent.getAction();+ //thisone+ // if (isOrderedBroadcast()) {+ if (action.equals("MyRecv_action")) {+ Log.d("hhhh","now i come");+ Log.v("hhhh","2222222");+ String cmd = intent.getStringExtra("cmd");+ if(cmd.equals("hide")){+ removeNavigationBar();+ }else if(cmd.equals("show")){+ addNavigationBar();+ }+ }+ // this.abortBroadcast();+ // }+ }+ };++ // ensure quick settings is disabled until the current user makes it through the setup wizard private boolean mUserSetup = false; private ContentObserver mUserSetupObserver = new ContentObserver(new Handler()) {@@ -348,7 +379,16 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { super.start(); // calls createAndAddWindows()- addNavigationBar();+ // addNavigationBar();++ //modified by 3110+ IntentFilter filter1 = new IntentFilter();+ filter1.addAction("MyRecv_action");+ mContext.registerReceiver(mBroadcastReceiver1, filter1);++ if(mDisplayNav){+ addNavigationBar();+ } // Lastly, call to the icon policy to install/update all the icons. mIconPolicy = new PhoneStatusBarPolicy(mContext);@@ -544,6 +584,17 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { mNetworkController.addSignalCluster(signalCluster); signalCluster.setNetworkController(mNetworkController);+ //modified by 3110 rick:put display nav values into shares+ mSharePref = mContext.getSharedPreferences(PREF_NAME,+ Context.MODE_PRIVATE);+ if(mSharePref != null){+ mDisplayNav = mSharePref.getBoolean(PREF_DISPLAY_NAV, true);+ Log.d("RickOne____makeStatusBarView","===="+"mDisplayNav="+mDisplayNav);+ }else{+ Log.d("RickOne____makeStatusBarView_null","===="+"mDisplayNav="+mDisplayNav);+ }++ final boolean isAPhone = mNetworkController.hasVoiceCallingFeature(); if (isAPhone) { mEmergencyCallLabel =@@ -800,13 +851,59 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { // For small-screen devices (read: phones) that lack hardware navigation buttons private void addNavigationBar() {+ final int mode = StatusBarManager.DISABLE_NONE;+ if (DEBUG) Log.v(TAG, "addNavigationBar: about to add " + mNavigationBarView); if (mNavigationBarView == null) return; prepareNavigationBarView();+ + //modified by 3110+ mDisplayNav = true;+ if(mSharePref != null){+ mSharePref.edit().putBoolean(PREF_DISPLAY_NAV, mDisplayNav)+ .commit();+ } mWindowManager.addView(mNavigationBarView, getNavigationBarLayoutParams());- }+ //addStatusBarWindow();+ + mHandler.post(new Runnable() {++ @Override+ public void run() {++ disable(mode);+ }+ });++ + }++ //modified by 3110+ private void removeNavigationBar(){+ + final int mode = StatusBarManager.DISABLE_EXPAND |StatusBarManager.DISABLE_SYSTEM_INFO;+ if(mNavigationBarView == null){+ return;+ }+ mDisplayNav = false;+ if(mSharePref != null){+ mSharePref.edit().putBoolean(PREF_DISPLAY_NAV, mDisplayNav)+ .commit();+ }+ mWindowManager.removeView(mNavigationBarView);+ //mWindowManager.removeView(mStatusBarView);+ mHandler.post(new Runnable() {+ + @Override+ public void run() {+ + disable(mode);+ }+ }); + }+ private void repositionNavigationBar() { if (mNavigationBarView == null || !mNavigationBarView.isAttachedToWindow()) return;@@ -1410,8 +1507,14 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { mExpandedVisible = true; mPile.setLayoutTransitionsEnabled(true);- if (mNavigationBarView != null)- mNavigationBarView.setSlippery(true);+ + //modified by 3110+ //if (mNavigationBarView != null)+ // mNavigationBarView.setSlippery(true);+ //modified by 3110+ if (mNavigationBarView != null && mDisplayNav){+ mNavigationBarView.setSlippery(mDisplayNav);+ } updateCarrierLabelVisibility(true);
测试代码:
$adb remount && adb shell//显示诸多栏$am broadcast -a MyRecv_action --es cmd "show"//隐藏诸多栏$am broadcast -a MyRecv_action --es cmd "hide"
- android 动态显示状态栏和导航栏
- Android 动态隐藏显示导航栏,状态栏
- Android开发 之 动态显示和隐藏状态栏和导航栏
- Android动态控制状态栏以及系统导航栏显示和隐藏
- android 动态显示和隐藏状态栏
- Android动态显示和隐藏状态栏
- Android动态显示和隐藏状态栏
- android 动态显示和隐藏状态栏
- android 动态显示和隐藏状态栏
- Android 状态栏的动态显示和隐藏
- Android状态栏动态显示和隐藏
- Android动态显示和隐藏状态栏探究。
- Android动态显示和隐藏状态栏/实现沉浸式状态栏
- Android 5.0 隐藏状态栏和导航栏
- Android 5.0状态栏和导航栏
- Android 透明状态栏和导航栏
- Android 5.0状态栏和导航栏
- Android管理系统状态栏和导航栏
- 一. play绪论
- composer安装laravel phpmailer smarty
- http头中的host字段详解
- 数据结构之树的遍历
- iOS 多线程编程<十六、RunLoop的基本应用>
- android 动态显示状态栏和导航栏
- 寡谈自动化测试(Selenium)
- 解决 ORA-21561: OID generation failed
- 解决Android拍照保存在系统相册不显示的问题
- [有奖活动]51Testing2016软件测试现状调查活动!
- ORACLE的order by中文排序
- sqlite3命令大全
- spring的BeanUtils.copyProperties用法
- LLDB调试神器之Chisel的安装