Android 在导航栏添加关机虚拟按键

硬件平台:RK3288

软件平台:Android 5.1

本篇基于RK3288硬件平台和Android 5.1,并实现了如下效果 。其他硬件或者软件平台可能有所不同经供参考。

实现效果前:

实现效果后:

如上所示在导航栏中添加了一个关机按钮,点击该按钮后弹出关机选择菜单。

Android 在导航栏添加关机虚拟按键_第1张图片

实现步骤如下:

步骤一:复制资源文件

复制关机图片 ic_sysbar_poweroff 到SDK源码目录下 frameworks/base/packages/SystemUI/res/drawable/ 目录下。

步骤二:添加布局至导航栏

在SDK源码目录下 frameworks/base/packages/SystemUI/res/ 找到分辨率对应的 layout 文件夹  里面的 navigation_bar.xml 添加关机按钮布局:

            
             
             

步骤三:修改java代码

在SDK源码目录下 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java 中添加代码:

public View getPowerButton(){
		return mCurrentView.findViewById(R.id.soft_poweroff);
	}

在SDK源码目录下 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java 的
 prepareNavigationBarView方法中添加按钮响应代码:

mNavigationBarView.getPowerButton().setOnClickListener(mPowerOnClickListener);

然后在PhoneStatusBar.java添加mPowerOnClickListener 一定要记住广播名称

       View.OnClickListener mPowerOnClickListener = new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                         Intent i = new Intent();
                         i.setAction("com.google.systemui.poweroff");    //广播名称
                         mContext.sendBroadcast(i);

                        }
        };

在SDK源码目录下 frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java 的 init 方法中找到如下位置添加注册广播代码:广播名称一定要跟PhoneStatusBar.java添加的广播名称一致。

// register for dream-related broadcasts
        filter = new IntentFilter();
        filter.addAction(Intent.ACTION_DREAMING_STARTED);
        filter.addAction(Intent.ACTION_DREAMING_STOPPED);
        filter.addAction("com.google.systemui.poweroff");    //注册广播
        context.registerReceiver(mDreamReceiver, filter);

然后在 PhoneWindowManager.java 找到如下位置添加判断:

    BroadcastReceiver mDreamReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (Intent.ACTION_DREAMING_STARTED.equals(intent.getAction())) {
                if (mKeyguardDelegate != null) {
                    mKeyguardDelegate.onDreamingStarted();
                }
            } else if (Intent.ACTION_DREAMING_STOPPED.equals(intent.getAction())) {
                if (mKeyguardDelegate != null) {
                    mKeyguardDelegate.onDreamingStopped();
                }        //添加如下代码
            } else if ("com.google.systemui.poweroff".equals(intent.getAction())) {
               showGlobalActionsInternal();    
            }
        }
    };

步骤四:编译模块并且push到机器上

修改玩代码后使用 mmm 命令编译模块

首先 输入命令: source build/envsetup.sh

然后编译frameworks/base/policy模块命令:mmm frameworks/base/policy -B

执行完命令后生成一个 jar 文件,目录: out/target/product/rk3288/system/framework/android.policy.jar

然后编译frameworks/base/packages/SystemUI/模块命令:mmm frameworks/base/packages/SystemUI -B

执行完后生成一个 apk文件,目录:out/target/product/rk3288/system/priv-app/SystemUI/SystemUI.apk

把两个文件复制到电脑的E盘。

进入cmd 输入 adb root 和adb remount 命令执行如下两步操作:

1、adb push E:\SystemUI.apk system/priv-app/SystemUI/SystemUI.apk

2、adb push E:\android.policy.jar system/framework/android.policy.jar

然后再重启设备即可。

你可能感兴趣的:(Android 在导航栏添加关机虚拟按键)