Android 7.1 增加屏幕边缘滑动事件(手势滑动)两种方式(Back,Home,Menu功能键)
目前公司在做新项目开发,项目目前是不让有Back,Home,Menu实体按键,这就导致了一个问题,点开其它应用无法返回到桌面,
当然些问题对于做开发的我们肯定是难不到的,如果我们开发碰到这问题肯定是adb链接 终端输入对应的key值 命令就搞定了
例如
$adb shell input keyevent 4
或者我们使用投屏神器 scrcpy 也能搞定.
问题是产品要面向客户展示,总不能抱个电脑链接产品机器让客户看吧...这样也太丢人了,使用的是Android 7.1 原生系统,又不支持边缘滑动,问题总是要解决的,经过前期的调研发现了两种方式可以完成.
第一种是系统层面增加
好处:系统自己维护,定制化强
缺点:需要有自己的ROM包
第二种是写一个手势APP
好处:不需要修改系统.
缺点:受系统限制比较大
第一种方式
经过查询代码发现其实Google 在7.1 上面已经写好对应的借口,只是空着没实现.
那具体的实现方式就是 我在系统中属性里面增加属性值来决定每个滑动事件对应的动作,这样以来只需要改动配置文件就行,不需要每次修改framework代码.
我开发的版本的系统属性路径如下,添加系统属性,默认是配置是空(关闭状态)想要使用该功能的时候直接打开即可.
device/qcom/msmXXX/system.prop
#Edge Gesture Function
persist.gesturekey.bottom= #HOME
persist.gesturekey.right= #MENU
persist.gesturekey.left= #BACK
然后在 PhoneWindowManager.java中添加滑动事件
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
// monitor for system gestures
mSystemGestures = new SystemGesturesPointerEventListener(context,
new SystemGesturesPointerEventListener.Callbacks() {
@Override
public void onSwipeFromTop() {
if (mStatusBar != null) {
// 下拉框 系统已经实现的 如 systemUI 通知栏等
requestTransientBars(mStatusBar);
}
}
@Override
public void onSwipeFromBottom() {
// 添加底部往上滑动事件
doPersitKey(SystemProperties.get("persist.gesturekey.bottom"));
if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_BOTTOM) {
requestTransientBars(mNavigationBar);
}
}
@Override
public void onSwipeFromRight() {
// 添加右滑动
doPersitKey(SystemProperties.get("persist.gesturekey.right"));
if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_RIGHT) {
requestTransientBars(mNavigationBar);
}
}
@Override
public void onSwipeFromLeft() {
// 添加左滑动
doPersitKey(SystemProperties.get("persist.gesturekey.left"));
if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_LEFT) {
requestTransientBars(mNavigationBar);
}
}
...........省略代码.........
});
可以看到我没有在具体的事件中进行处理,这样是为了后期方便,我处理时间的时候去读取配置文件对应的值,通过对应的值来决定做左滑动,上滑动以及右滑动的值
具体的处理滑动事件逻辑逻辑
private void doPersitKey(String persistkey) {
if ("BACK".equals(persistkey)) {
long now = SystemClock.uptimeMillis();
KeyEvent down = new KeyEvent(
now, now, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK, 0);
InputManager.getInstance().injectInputEvent(
down, InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
KeyEvent up = new KeyEvent(
now, now, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK, 0);
InputManager.getInstance().injectInputEvent(
up, InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
} else if ("HOME".equals(persistkey)) {
launchHomeFromHotKey();
} else if ("MENU".equals(persistkey)) {
toggleRecentApps();
}
}
第二种APP方式
代码已经写好,直接用AndroidStudio打开运行即可
运行之后需要打开无障碍模式模式才能进行使用
如果不想每次使用都开启无障碍服务就需要系统签名 系统签名详解
1.AndroidManifest.xml 增加
添加 sharedUserId
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:sharedUserId="com.xxx.gesture"
package="com.xxx.gesture">
添加开机启动权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
添加开机启动广播
<action android:name="android.intent.action.BOOT_COMPLETED" />
2.在静态开机广播中增加如下代码,这样的话开机就会启动此服务,越过用户手动开启,就可以使用边缘手势滑动功能
public class SystemReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
Settings.Secure.putString(context.getContentResolver(),
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "com.xxx.gesture/com.xxx.gesture.AccessibilityServiceGesture");
Settings.Secure.putString(context.getContentResolver(),
Settings.Secure.ACCESSIBILITY_ENABLED, "1");
}
}
}
上一篇: 微信小程序之下拉列表实现(附完整源码)