机顶盒底部导航栏的显示与隐藏

本文详细介绍了在Android 6.0系统上修改机顶盒底部导航栏显示与隐藏的具体步骤,涉及多个核心文件的修改,包括IStatusBar.aidl、IStatusBarService.aidl等,以及对软件导航栏配置的调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此篇博客以及最近关于机顶盒的相关博文,早该在两年多前或是更早以前就该写出来的,如今物是人非了,问及以前的同事,机顶盒系统貌似是android8.1的了,此文基于6.0系统上修改的,望知悉。

1、主要修改如下

modified:   core/java/com/android/internal/statusbar/IStatusBar.aidl
#       modified:   core/java/com/android/internal/statusbar/IStatusBarService.aidl
#       modified:   core/res/res/values/config.xml
#       modified:   packages/SystemUI/res/layout-sw600dp/navigation_bar.xml
#       modified:   packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
#       modified:   packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
#       modified:   packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
#       modified:   packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
#       deleted:    packages/SystemUI/tests/Android.mk
#       modified:   services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java
#       modified:   services/core/java/com/android/server/policy/PhoneWindowManager.java
#       modified:   services/core/java/com/android/server/statusbar/StatusBarManagerService.java

git diff 对比查看改动

 2、修改IStatusBar.aidl

git diff core/java/com/android/internal/statusbar/IStatusBar.aidl
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl
index ba67cf4..ba7e54b 100644
--- a/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -76,5 +76,7 @@ oneway interface IStatusBar
      * @param source the identifier for the gesture, see {@link StatusBarManager}
      */
     void onCameraLaunchGestureDetected(int source);
+    /**add for show NavigationBar20161212*/
+   void showNavigationBar();

3、修改IStatusBarService.aidl

git diff core/java/com/android/internal/statusbar/IStatusBarService.aidl
diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarServ
index 7db2cc9..c0663c3 100644
--- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
@@ -90,4 +90,6 @@ interface IStatusBarService
     void appTransitionStarting(long statusBarAnimationsStartTime, long statusBarAnimationsDuration);

     void startAssist(in Bundle args);
+    /**add for show NavigationBar 20161212*/
+    void showNavigationBar();
 }

4、修改config.xml

git diff core/res/res/values/config.xml
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index f76dfb2..a54213e 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1509,7 +1509,7 @@

     <!-- Whether a software navigation bar should be shown. NOTE: in the future this may be
          autodetected from the Configuration. -->
-    <bool name="config_showNavigationBar">false</bool>
+    <bool name="config_showNavigationBar">true</bool>

     <!-- Whether action menu items should be displayed in ALLCAPS or not.
          Defaults to true. If this is not appropriate for specific locales

5、修改navigation_bar.xml 

git diff packages/SystemUI/res/layout-sw600dp/navigation_bar.xml
diff --git a/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml b/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml
old mode 100644
new mode 100755
index 9912343..0ab3109
--- a/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml
+++ b/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml
@@ -53,6 +53,14 @@
                 android:layout_height="match_parent"
                 android:layout_weight="1"
                 />
+           <!-- 20161212 add screenshort-->
+           <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/screenshort"
+                android:layout_width="128dp" android:paddingLeft="25dp" android:paddingRight="25dp"
+                android:layout_height="match_parent"
+                android:src="@drawable/ic_sysbar_screenshot"
+                android:layout_weight="0"
+                />
+              <!--code end -->
             <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back"
                 android:layout_width="128dp" android:paddingStart="25dp" android:paddingEnd="25dp"
                 android:layout_height="match_parent"
@@ -80,6 +88,36 @@
                 android:layout_weight="0"
                 android:contentDescription="@string/accessibility_recent"
                 />
+           <!--20161212 add -->
+           <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/sub"
+                android:layout_width="128dp" android:paddingLeft="25dp" android:paddingRight="25dp"
+                android:layout_height="match_parent"
+                android:src="@drawable/sub_normal"
+                android:layout_weight="0"
+               systemui:keyCode="25"
+                />
+           <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/add"
+                android:layout_width="128dp" android:paddingLeft="25dp" android:paddingRight="25dp"
+                android:layout_height="match_parent"
+                android:src="@drawable/add_normal"
+                android:layout_weight="0"
+               systemui:keyCode="24"
+           <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/bt_power"
+                android:layout_width="128dp" android:paddingLeft="25dp" android:paddingRight="25dp"
+                android:layout_height="match_parent"
+                android:src="@drawable/ic_power"
+                android:layout_weight="0"
+                systemui:keyCode="26"
+                />
+            <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/hide_bar_btn"
+                android:layout_width="wrap_content" android:paddingLeft="25dp" android:paddingRight="25dp"
+                android:layout_height="match_parent"
+               android:scaleType="centerInside"
+               android:src="@drawable/ic_sysbar_hide"
+                android:layout_weight="0"
+                />
+             <!--code end-->
             <Space
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
(END)
      />

6、修改CommandQueue.java类

git diff packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statu
old mode 100644
new mode 100755
index 897f5e5..d25dc6d
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -25,6 +25,7 @@ import android.util.Pair;
 import com.android.internal.statusbar.IStatusBar;
 import com.android.internal.statusbar.StatusBarIcon;
 import com.android.internal.statusbar.StatusBarIconList;
+import android.util.Log;
/**
  * This class takes the functions from IStatusBar that come in on
@@ -65,6 +66,7 @@ public class CommandQueue extends IStatusBar.Stub {
     private static final int MSG_ASSIST_DISCLOSURE          = 22 << MSG_SHIFT;
     private static final int MSG_START_ASSIST               = 23 << MSG_SHIFT;
     private static final int MSG_CAMERA_LAUNCH_GESTURE      = 24 << MSG_SHIFT;
+    private static final int MSG_SHOW_NAVIGATIONBAR         = 25 << MSG_SHIFT;//20161212 add for show NavigationBar

     public static final int FLAG_EXCLUDE_NONE = 0;
     public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0;
@@ -111,6 +113,7 @@ public class CommandQueue extends IStatusBar.Stub {
         public void showAssistDisclosure();
         public void startAssist(Bundle args);
         public void onCameraLaunchGestureDetected(int source);
+       public void showNavigationBar();//20161212 add for show NavigationBar
     }

     public CommandQueue(Callbacks callbacks, StatusBarIconList list) {
@@ -126,6 +129,15 @@ public class CommandQueue extends IStatusBar.Stub {
         }
     }

+    /**20161212 add for show NavigationBar*/
+    public void showNavigationBar(){
+           synchronized(mList){
+                mHandler.removeMessages(MSG_SHOW_NAVIGATIONBAR);
+                mHandler.sendEmptyMessage(MSG_SHOW_NAVIGATIONBAR);
+                Log.d("CommandQueue-------","show NavigationBar-------------");
+            }
+        }
+    /**code end*/
     public void removeIcon(int index) {
         synchronized (mList) {
             int what = MSG_ICON | index;
@@ -348,6 +360,9 @@ public class CommandQueue extends IStatusBar.Stub {
                 case MSG_SET_SYSTEMUI_VISIBILITY:
                     mCallbacks.setSystemUiVisibility(msg.arg1, msg.arg2);
                     break;
+                case MSG_SHOW_NAVIGATIONBAR://20161212 add
+                    mCallbacks.showNavigationBar();
+                    break;//code end
                 case MSG_TOP_APP_WINDOW_CHANGED:
                     mCallbacks.topAppWindowChanged(msg.arg1 != 0);
                     break;
(END)

7、修改NavigationBarView.java类

git diff packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/sys
index 8046eb5..19c83f4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -50,6 +50,7 @@ import android.widget.LinearLayout;
 import com.android.systemui.R;
 import com.android.systemui.statusbar.policy.DeadZone;
 import com.android.systemui.statusbar.policy.KeyButtonView;
+import com.android.systemui.statusbar.policy.KeyButtonRipple;

 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -255,6 +256,17 @@ public class NavigationBarView extends LinearLayout {
         return mCurrentView.findViewById(R.id.ime_switcher);
     }

+    /**20161212add for hidenavigationbar*/
+    public View getHideBarButton() {
+       View view = mCurrentView.findViewById(R.id.hide_bar_btn);
+       view.setBackground(new KeyButtonRipple(getContext(), view));
+       return view;
+    }
+
+    public View getScreenShotButton(){
+       return mCurrentView.findViewById(R.id.screenshort);
+    }
+    /**code end*/
     private void getIcons(Resources res) {
         mBackIcon = res.getDrawable(R.drawable.ic_sysbar_back);
         mBackLandIcon = mBackIcon;
(END)

8、修改PhoneStatusBar.java类

git diff packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/system
old mode 100644
new mode 100755
index 73361bd..e4e703b
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -183,6 +183,10 @@ import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSLUCE
 import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
 import static com.android.systemui.statusbar.phone.BarTransitions.MODE_WARNING;

+//add import 20161212
+import android.content.ComponentName;
+import android.content.ServiceConnection;
+import android.os.Messenger;
 public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
         DragDownHelper.DragDownCallback, ActivityStarter, OnUnlockMethodChangedListener,
         HeadsUpManager.OnHeadsUpChangedListener {
@@ -1068,7 +1072,107 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
             toggleRecentApps();
         }
     };
+    /**20161212 add for show NavigationBar***/
+    @Override
+    public void showNavigationBar() {
+        if (mNavigationBarView != null) {
+           return;
+        }
+        mNavigationBarView = (NavigationBarView) View.inflate(mContext, R.layout.navigation_bar, null);
+        mNavigationBarView.setBar(this);
+        mNavigationBarView.setOnTouchListener(new
+             View.OnTouchListener() {
+             @Override
+             public boolean onTouch(View v, MotionEvent event) {
+             checkUserAutohide(v, event);
+             return false;
+             }});
+       addNavigationBar();
+       //Log.d("PhoneStatus!!!","addNaviGationBar!!!!!!!!");
+    }
+    private View.OnClickListener mScreenShotClickListener = new View.OnClickListener() {
+        public void onClick(View v) {
+                       takeScreenshot();
+            //Log.d("PhoneStatusBar!!", "click screenshort--------");
+        }
+    };
+    final Object mScreenshotLock = new Object();
+    ServiceConnection mScreenshotConnection = null;
+    final Runnable mScreenshotTimeout = new Runnable() {
+        @Override public void run() {
+            synchronized (mScreenshotLock) {
+                if (mScreenshotConnection != null) {
+                    mContext.unbindService(mScreenshotConnection);
+                    mScreenshotConnection = null;
+                }
+            }
+        }
+    };

+    private void takeScreenshot() {
+        synchronized (mScreenshotLock) {
+            if (mScreenshotConnection != null) {
+                return;
+            }
+            ComponentName cn = new ComponentName("com.android.systemui",
+                    "com.android.systemui.screenshot.TakeScreenshotService");
+            Intent intent = new Intent();
+            intent.setComponent(cn);
+            ServiceConnection conn = new ServiceConnection() {
+                @Override
+                public void onServiceConnected(ComponentName name, IBinder service) {
+                    synchronized (mScreenshotLock) {
+                        if (mScreenshotConnection != this) {
+                            return;
+                        }
+                        Messenger messenger = new Messenger(service);
+                        Message msg = Message.obtain(null, 1);
+                        final ServiceConnection myConn = this;
+                        Handler h = new Handler(mHandler.getLooper()) {
+                            @Override
+                            public void handleMessage(Message msg) {
+                                synchronized (mScreenshotLock) {
+                                    if (mScreenshotConnection == myConn) {
+                                        mContext.unbindService(mScreenshotConnection);
+                                        mScreenshotConnection = null;
+                                        mHandler.removeCallbacks(mScreenshotTimeout);
+                                    }
+                                }
+                            }
+                        };
+                        msg.replyTo = new Messenger(h);
+                        msg.arg1 = msg.arg2 = 0;
+                        msg.arg1 = 1;
+                        try {
+                            messenger.send(msg);
+                        } catch (RemoteException e) {
+                        }
+                    }
+                }
+                @Override
+                public void onServiceDisconnected(ComponentName name) {}
+            };
+            if (mContext.bindService(intent, conn, Context.BIND_AUTO_CREATE)) {
+                mScreenshotConnection = conn;
+                mHandler.postDelayed(mScreenshotTimeout, 10000);
+            }
+        }
+    }
+    private View.OnClickListener mHideNavClickListener = new View.OnClickListener() {
+        public void onClick(View v) {
+           removeNavigationBar();
+           //Log.d("PhoneStatusBar================","click");
+        }
+    };
+    private void removeNavigationBar(){
+        if (DEBUG) Log.d(TAG, "removeNavigationBar: about to remove " + mNavigationBarView);
+        if ( mNavigationBarView != null) {
+            mWindowManager.removeView(mNavigationBarView);
+        }
+        mNavigationBarView = null;
+       //Log.d("PhoneStatusBar================","removeNavigationBar+++++");
+    }
+    /**code end*/
     private long mLastLockToAppLongPress;
     private View.OnLongClickListener mLongPressBackRecentsListener =
             new View.OnLongClickListener() {
@@ -1128,7 +1232,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
         mNavigationBarView.getBackButton().setLongClickable(true);
         mNavigationBarView.getBackButton().setOnLongClickListener(mLongPressBackRecentsListener);
         mNavigationBarView.getHomeButton().setOnTouchListener(mHomeActionListener);
+        mNavigationBarView.getHideBarButton().setOnClickListener(mHideNavClickListener);//20161212 add for navigationbar
         mNavigationBarView.getHomeButton().setOnLongClickListener(mLongPressHomeListener);
+        mNavigationBarView.getScreenShotButton().setOnClickListener(mScreenShotClickListener);//20161212 add for screenshort
         mAssistManager.onConfigurationChanged();
     }

(END)

9、修改TvStatusBar.java类

git diff packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java b/packages/SystemUI/src/com/android/systemui/sta
index bbe5dd9..cdd878e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
@@ -166,6 +166,10 @@ public class TvStatusBar extends BaseStatusBar {
     public void appTransitionCancelled() {
     }

+    @Override//20161212 add for show NavigationBar
+    public void showNavigationBar(){
+    }//code end
+
     @Override
     public void appTransitionStarting(long startTime, long duration) {
     }
(END)

10、修改ImmersiveModeConfirmation.java类

git diff services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java
diff --git a/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java b/services/core/java/com/android/server/polic
index 160d44c..17b0973 100644
--- a/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java
+++ b/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java
@@ -344,7 +344,7 @@ public class ImmersiveModeConfirmation {
         public void handleMessage(Message msg) {
             switch(msg.what) {
                 case SHOW:
-                    handleShow();
+                    //handleShow();
                     break;
                 case HIDE:
                     handleHide();
(END)

11、修改PhoneWindowManager.java类

git diff services/core/java/com/android/server/policy/PhoneWindowManager.java
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/Phone
index 9c17151..cc59ff0 100755
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -1534,14 +1534,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                     public void onSwipeFromBottom() {
                         if (mNavigationBar != null && mNavigationBarOnBottom) {
                             requestTransientBars(mNavigationBar);
+                        }else{
+                          if (SystemProperties.getBoolean("ro.is.ShowNavigationBar", false)){
+                             showNavigationBar();/**20161212add for navigationbar*/
+                          }
+                      }
+                    }
                     @Override
                     public void onSwipeFromRight() {
                         if (mNavigationBar != null && !mNavigationBarOnBottom) {
@@ -1568,6 +1566,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                         mOrientationListener.onTouchEnd();
                     }
                 });
+
         mImmersiveModeConfirmation = new ImmersiveModeConfirmation(mContext);
         mWindowManagerFuncs.registerPointerEventListener(mSystemGestures);

@@ -1607,6 +1606,24 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                 mStatusBarController.getAppTransitionListener());
     }
+       /**20161212 add for show NavigationBar*/
+        private void showNavigationBar(){
+            mHandler.post(new Runnable(){
+                @Override
+                public void run(){
+                    try{
+                        IStatusBarService statusbar=getStatusBarService();
+                        if(null!=statusbar){
+                            statusbar.showNavigationBar();
+                         //Log.d("PhoneWindowManager!!!!!!","showNavigationBar-----------------------");
+                        }
+                    }catch(Exception  e){
+                        mStatusBarService =null;
+                    }
+                }
+            });
+        }
+       /**code end*/
     /**
      * Read values from config.xml that may be overridden depending on
      * the configuration of the device.
(END)

12、修改StatusBarManagerService.java类

git diff services/core/java/com/android/server/statusbar/StatusBarManagerService.java
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/stat
old mode 100644
new mode 100755
index e9ace29..3c3543f
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -41,7 +41,7 @@ import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.List;
-
+import android.util.Log;

 /**
  * A note on locking:  We rely on the fact that calls onto mBar are oneway or
@@ -188,6 +188,26 @@ public class StatusBarManagerService extends IStatusBarService.Stub {
         }
     };

+       /*20161212 add for show NavigationBar**/
+       @Override
+       public void showNavigationBar(){
+           enforceStatusBar();
+           synchronized(mLock){
+                mHandler.post(new Runnable(){
+                        public void run(){
+                       if(null!=mBar){
+                           try{
+                               mBar.showNavigationBar();
+                               //Log.d("StatusBarManagerService","-------showBar----------");
+                           }catch (RemoteException ex){
+
+                           }
+                        }
+                   }
+               });
+           }
+       }
+       /**code end*/
     // ================================================================================
     // From IStatusBarService
     // ================================================================================
(END)

以上即为机顶盒底部导航栏显示与隐藏的主要改动地方,“+”即为添加的代码,添加到源码中验证即可。6.0,framework中的源码是否和8.1framework源码相同,请自行斟酌变动咯。

最后,提供资源下载链接 点我下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值