安卓源码预置ADB命令-导航栏三个按键的显示与隐藏

实现目标

adb 发送对应广播,实现导航栏按钮的显示与隐藏

方法详解

路径

vendor\mediatek\proprietary\packages\apps\SystemUI\src\com\android\systemui\statusbar\phone\NavigationBarView.java

没有这个路径怎么办?
在打开的项目中用命令:

find -name "NavigationBarView.java"

全局搜索,找到对应类就好了

修改

首先导入我们需要用的包

import android.content.Intent;
import android.content.IntentFilter;
import android.content.BroadcastReceiver;

其次,由于我们这个并不是Activity或Services,所以,我们在动态注册广播接受者时需要一个对象,而最好找的就是上下文对象。

private Context mContext;

先定义一个全局的变量,在这个类的构造方法中拿到这个context。
构造方法
怎么拿?
在构造方法中就有,直接拿

this.mContext = context;

上下文对象有了,接下来就是我们的广播接收者

private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (DEBUG) Log.v(TAG, "onReceive: " + intent);
            String action = intent.getAction();
            if (ACTION_SHOW_HOME_BUTTON.equals(action)) {
              getHomeButton().setVisibility(View.VISIBLE); 
            }
            else if(ACTION_HIDE_HOME_BUTTON.equals(action)){
                    getHomeButton().setVisibility(View.GONE);         
                      }
		    else if(ACTION_SHOW_BACK_BUTTON.equals(action)){
                    getBackButton().setVisibility(View.VISIBLE);         
                      }
			else if(ACTION_HIDE_BACK_BUTTON.equals(action)){
                    getBackButton().setVisibility(View.GONE);         
                      }
			 else if(ACTION_SHOW_RECENTS_BUTTON.equals(action)){
                    getRecentsButton().setVisibility(View.VISIBLE);         
                      }
			else if(ACTION_HIDE_RECENTS_BUTTON.equals(action)){
                    getRecentsButton().setVisibility(View.GONE);         
                      }
        }
    };

上面的广播接收者就做了对按键的显示与隐藏(setVisibility()方法),这里为什么是getXXXButton(),找到方法就知道了
以home键为例,想在细点的可以找对应的资源id拿到布局去验证。

public ButtonDispatcher getHomeButton() {
        return mButtonDispatchers.get(R.id.home);
    }

可以看到广播接受者需要action作为过滤条件,触发不同的时间,这里有多个action,就需要一个IntentFilter,这里我们用一个方法去做这些事情

@VisibleForTesting
    protected void registerBroadcastReceiver() {
        IntentFilter filter = new IntentFilter();       
		filter.addAction(ACTION_SHOW_HOME_BUTTON);
		filter.addAction(ACTION_HIDE_HOME_BUTTON);
		filter.addAction(ACTION_SHOW_BACK_BUTTON);
		filter.addAction(ACTION_HIDE_BACK_BUTTON);
		filter.addAction(ACTION_SHOW_RECENTS_BUTTON);
		filter.addAction(ACTION_HIDE_RECENTS_BUTTON);
		mContext.registerReceiver(mBroadcastReceiver, filter);
    }

这个方法就添加了对应的action,这些action需要定义成全局变量方便使用

    private static final String ACTION_SHOW_HOME_BUTTON = "home_button_is_show";
	private static final String ACTION_HIDE_HOME_BUTTON = "home_button_is_hide";
	private static final String ACTION_SHOW_BACK_BUTTON = "back_button_is_show";
	private static final String ACTION_HIDE_BACK_BUTTON = "back_button_is_hide";
	private static final String ACTION_SHOW_RECENTS_BUTTON = "recents_button_is_show";
	private static final String ACTION_HIDE_RECENTS_BUTTON = "recents_button_is_hide";

最后,也是最重要的,要在构造方法中调用我们的registerBroadcastReceiver() 方法

// receive broadcasts
        registerBroadcastReceiver();

注意一定要在这个类的构造方法中加,才能起作用。

最后做个测试

发送广播的命令是

adb shell am broadcast -a <action>

这里是通过action,如果是DATA_URI则用参数 -d ,如果是MIME_TYPE则用**-t**

注意如果你的手势导航不是三按钮导航则不会生效,需要是在三按钮导航的情况下才是实用的。
这里为了方便,把隐藏home键的adb命令写一下

adb shell am broadcast -a home_button_is_hide

如果运行结果是

Broadcasting: Intent { act=home_button_is_hide flg=0x400000 }
Broadcast completed: result=0

证明广播是发送成功的,如果功能没有实现,可能是找错了路径,因为部分公司对需要改的代码是会做一个小的集成的。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值