目前公司在做新项目开发,项目目前是不让有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 gesturesmSystemGestures = new SystemGesturesPointerEventListener(context,new SystemGesturesPointerEventListener.Callbacks() {@Overridepublic void onSwipeFromTop() {if (mStatusBar != null) {// 下拉框 系统已经实现的 如 systemUI 通知栏等requestTransientBars(mStatusBar);}}@Overridepublic void onSwipeFromBottom() {// 添加底部往上滑动事件doPersitKey(SystemProperties.get("persist.gesturekey.bottom"));if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_BOTTOM) {requestTransientBars(mNavigationBar);}}@Overridepublic void onSwipeFromRight() {// 添加右滑动doPersitKey(SystemProperties.get("persist.gesturekey.right"));if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_RIGHT) {requestTransientBars(mNavigationBar);}}@Overridepublic 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 {@Overridepublic 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");}}
}

Android 7.1 增加屏幕边缘滑动事件(手势滑动)两种方式(Back,Home,Menu功能键) 免开启无障碍功能相关推荐

  1. javascript添加HTML事件处理程序的两种方式学习

    以按钮单击事件为例: 可以直接在button元素的onclick属性中直接执行javascript代码:示例代码和结果如下图: 也可以在onclick属性中指定要调用的函数:示例代码和结果如下图: 在 ...

  2. Vue阻止事件冒泡的两种方式

    1.阻止事件冒泡方式1 如下有父子标签的点击事件 在子类中调用stopPropagation()方法即可禁止事件的传递 boxClick:function () {alert("父标签被点击 ...

  3. android app内部打开word pdf .doc类型文件的两种方式

    1.是集成了x5内核的webview使用的是腾讯的tbs 这种的直接上github找一个demo集成一下就可以了 2.直接接入第三方 sdk进行开发 https://github.com/Office ...

  4. linux耳机插拔检测,Android应用开发之耳机插拔处理两种方式

    本文将带你了解Android应用开发[RK3288][Android6.0] 耳机插拔处理两种方式,希望本文对大家学Android有所帮助. [RK3288][Android6.0]   耳机插拔处理 ...

  5. Android学习之为按钮添加事件监听器的两种方法

    为按钮(包括普通按钮和图片按钮等)添加单击事件监听器有两种方法,第一种是利用匿名内部类来实现,第二种是使用onClick属性来实现 1.匿名内部类 使用匿名内部类,我们首先需要在布局文件中给按钮设置i ...

  6. android 图片铺满imageview,简单实现ImageView宽度填满屏幕,高度自适应的两种方式...

    两种方式 1.重写View的onMeasure方法 参考这里easion_zms的专栏 核心代码 protectedvoidonMeasure(intwidthMeasureSpec,intheigh ...

  7. android数据库侵入,Android中实现侵入式状态栏的两种方式

    最近对"爸比讲故事"Android版本进行代码重构的时候,对之前版本的大部分界面的头部侵入式效果,作了一个总结和梳理,在期间查阅了thinkcool的博客和结合亲身实践,总结了2种 ...

  8. android asynctask源码分析,Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)...

    本文实例讲述了Android通过Handler与AsyncTask两种方式动态更新ListView的方法.分享给大家供大家参考,具体如下: 有时候我们需要修改已经生成的列表,添加或者修改数据,noti ...

  9. 创建安卓模拟器的两种方式及常用Android命令介绍

    创建安卓模拟器有以下两种方式: 1>通过图形界面创建,在Eclipse中单击Windows->Android Virtual Device Manager启动图形界面窗口 2>如果用 ...

最新文章

  1. mysql linux改user_linux mysql误修改user表导致无法root用户登录,求大神帮助。-问答-阿里云开发者社区-阿里云...
  2. Web 前沿——HTML5 Form Data 对象的使用
  3. 八十八、CSS两列三列的布局方式
  4. Emacs基本快捷键
  5. [转载]c#委托事件简单例子
  6. 计算机考试如何添加打印机,如何添加网络打印机?
  7. NPM ---- 配置淘宝镜像CNPM
  8. 计算机一级幻灯片样式,PPT怎么设置单个幻灯片为背景样式4?网友:原来这么简单!...
  9. python绘制缓和曲线_CAD中如何绘制缓和曲线
  10. Drools教程(基础篇)—— Eclipse插件安装
  11. R语言与Python对比
  12. from scipy.misc import comb ImportError: cannot import name ‘comb‘
  13. 升华网第三次培训心得
  14. 软件公司绩效考核(大家提提建议)
  15. 苹果手机更新ios9后,APP设置
  16. 【C++】getchar()有什么用
  17. 一句话的结束!句号问号叹号
  18. 用python输入概率分布,计算信源熵/信息熵
  19. 风暴孵化:手游代理几大优势分析
  20. 计算机网络:P4.1-网络层(上)

热门文章

  1. 微信小程序实战篇:实现抖音评论效果
  2. 七牛前端使用JS-SDK上传文件完成时返回code:400报错
  3. 网络安全——通用渗透测试框架
  4. 免费的样机素材,拿走不谢
  5. java语音通信软件1 绪论
  6. 一级建造师初始注册企业上报多少天住建部受理?
  7. java实现剪刀石头布程序
  8. 【数据库-MySql】[Err] 1062 - Duplicate entry '1-1' for key 'PRIMARY'
  9. php获得mysql版本信息,PHP获取php、mysql与apache版本
  10. Uni-app从入门到实战3天训练营 (二)