硬件平台:RK3288
软件平台:Android 5.1
本篇基于RK3288硬件平台和Android 5.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
然后再重启设备即可。