文档章节

Android虚拟按键 Recent键屏蔽(隐藏)

徐昊
 徐昊
发布于 2016/11/03 12:18
字数 718
阅读 102
收藏 0

最近做项目碰到一个需求,把那个Android 手机里面平板的虚拟 RecentApplication 键给隐藏掉,(我自己搞了好久,一直把他当成菜单键,看过源码的朋友就不要说了,O(∩_∩)O哈哈~)!

我在这里说下吧:

Android 4.0 桌面底部状态栏分为两个部分:左边是三个导航键:从左置右依次是:返回键 ,Home键和RecentApplication键,就是查看最近打开的所有程序,多任务切换就在这里。 这三个键为一个区域 叫NavigationArea,即导航区。 最右边是NotificationArea,也就是提示信息区,有电量,无线信号,蓝牙等信息显示。 这条StatusBar,是无论打开哪个程序都会显示在最下方的。
Home键与Recent键的点击事件是在framework层进行处理的,因此onKeyDown与dispatchKeyEvent都捕获不到点击事件。
查看StatusBarManager.java源码,目前只能通过其void disable(int what) {…}设置,并可传入值:

public static final int DISABLE_HOME = View.STATUS_BAR_DISABLE_HOME;    //二进制的值是0x00200000
public static final int DISABLE_RECENT = View.STATUS_BAR_DISABLE_RECENT;  //二进制的值是
0x01000000
public static final int DISABLE_BACK = View.STATUS_BAR_DISABLE_BACK;  //二进制的值是 0x00400000
public static final int DISABLE_NONE = 0x00000000;   

等等一些属性,具体的可以查看View的源码,因为都是@hide 的,Android中有许多隐藏的Service,StatusBarManager就是其中一个,在Context.java中可以看到:

**
/** * Use with {@link #getSystemService} to retrieve a {@link * android.app.StatusBarManager} for interacting with the status bar. * * @see #getSystemService * @see android.app.StatusBarManager * @hide */ 
public static final String STATUS_BAR_SERVICE = "statusbar";** 

表明该service不对外提供,如果要调用的话需要在源码树上编译,才能调用到标记为@hide的接口。也可以将源码编译出来的classes.jar包添加到工程里面。(这种方式我嫌麻烦)然后去网上找了下,可以利用反射来进行调用;
代码如下:

public static final String STATUS_BAR_SERVICE = "statusbar";
    public static final String CLASS_STATUS_BAR_MANAGER = "android.app.StatusBarManager";
    public static final String METHOD_DISABLE = "disable"; 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        try {
            Object service = getSystemService(STATUS_BAR_SERVICE);
            Class<?> statusBarManager = Class.forName(CLASS_STATUS_BAR_MANAGER);
            Method disable = statusBarManager.getMethod(METHOD_DISABLE,
                    int.class);
// disable.invoke(service, 0x00200000); // 为View.STATUS_BAR_DISABLE_HOME 的值
// disable.invoke(service, 0x00400000); // 为View.STATUS_BAR_DISABLE_BACK 的值
            disable.invoke(service, 0x01000000); // 为View.STATUS_BAR_DISABLE_RECENT的值
        } catch (Exception e) {
            e.printStackTrace();
        }


    }

上面的“返回键”和“home”键我也这样加了进去,但效果不理想,只执行最后一条(谁放在后面最后执行谁),我后来把他们分开 也不行。但是需求没。

StatusBarManager提供了一些有用的接口,像disable()方法正是我们需要的,一些系统级的应用也是调用的该方法禁止StatusBar下拉的,比如电话、锁屏模块。想要调用该方法,你还需要以下权限:

<uses-permission android:name=”android.permission.EXPAND_STATUS_BAR”/>

会报出以下错误提示:
Neither user 10076 nor current process has android.permission.STATUS_BAR.
提示缺少权限,Manifest添加之,提示:Permission is only granted to system apps
总结:通过这种方法屏蔽状态栏下拉,必须得有系统签名,WTF。。。

© 著作权归作者所有

徐昊

徐昊

粉丝 0
博文 84
码字总数 174446
作品 2
杨浦
Android工程师
私信 提问
如何隐藏android4.*系列的虚拟按键???

android4.*系列原生桌面的虚拟按键(Home键、返回键、菜单键)是在触摸屏幕上显示的,如下: 现在有个需求就是在自己写的android程序打开时隐藏这些虚拟按键。我在官方: https://developer....

樂天
2014/05/31
5.7K
3
andrpid开发pad怎么屏蔽home键和power键吗?

1. android在2.0系统时,home键可以通过onKeyDown屏蔽,但是到4.0时就无效了,除了设置luncher还有其他方法么? 2. android手机上的三个按键是back,home和menu,但是pad上只有back,home另外...

爵色
2013/10/23
1K
1
Android P 导航栏变为两颗虚拟键,或支持原生手势操作

从目前的趋势来看,手机继续弱化按键将成为主流,技术支撑包括全面屏、屏下指纹,以后今后的屏下摄像头、传感器甚至是听筒等。 没有了按键,交互完全依赖屏幕,所以在iPhone X的iOS 11系统上...

局长
2018/04/15
1K
10
浅谈Android动态加载界面设计技巧

Android应用如果加载zip格式插件中的类,该类中的界面会需要用纯代码进行编写。插件中的界面是基于加载插件的Activity的。所以插件中的界面基本会用到Dialog作为基础界面。开发过程中会有一些...

KingJerry
2013/03/07
2.1K
0
dialog,activity 屏蔽Home键详解

相信在Android应用上,很多时候逻辑是需要屏蔽Home键的,但这个用户体验是否需要,就看各位的需求了。 一般的方法屏蔽Home键,大家一定看过不少文章了。我总结一下,先说一下一般情况下Activ...

雨焰
2013/07/11
951
0

没有更多内容

加载失败,请刷新页面

加载更多

Vue学习01

我的github地址https://github.com/zhangl-w/VueDemo/tree/master/VueDemo 一、基本代码 1.导入Vue包,导包后浏览器内存中会产生一个Vue的构造函数 2.创建一个Vue实例 3.el 表示,当前我们n...

zhang_l
28分钟前
5
0
centos7.x 安装harbor 1.9.3

首先必须安装docker和docker-compose 推荐使用pip安装docker-compose,因为pip可以为你自动对应版本问题 1.docker安装 curl -sfL https://get.docker.io | sh -systemctl start docker 2.d...

Elson
29分钟前
5
0
每天积累一点:射频阻抗

对我来说,阻抗是一个非常令人困惑的概念(术语)。以下是我第一次学习阻抗概念时脑海中出现的许多问题。同样的问题也让你烦恼吗? 当我第一次在高中物理中学习“电阻(Resistance )”时,它...

demyar
30分钟前
5
0
人生苦短?试试Groovy进行单元测试

如果您今天正在编程,那么您很可能听说过单元测试或测试驱动的开发过程。我还没有遇到一个既没有听说过又没有听说过单元测试并不重要的程序员。在随意的讨论中,大多数程序员似乎认为单元测试...

八音弦
31分钟前
4
0
GMAT词汇怎么背?简单记忆法让你不再害怕背单词

GMAT考试对于词汇的掌握和使用要求高,可以说是GMAT考试的难关之一。面对学术化专业化难度颇高的词汇,考生难免会产生畏惧退缩的情绪。GMAT难词怎么背?有没有轻松背单词的方法呢?下面小编就为...

bole6
33分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部