天天看点

java屏蔽虚拟按键代码_Android虚拟按键 Recent键屏蔽(隐藏)

最近做项目碰到一个需求,把那个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中可以看到:

**

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下拉的,比如电话、锁屏模块。想要调用该方法,你还需要以下权限:

会报出以下错误提示:

Neither user 10076 nor current process has android.permission.STATUS_BAR.

提示缺少权限,Manifest添加之,提示:Permission is only granted to system apps

总结:通过这种方法屏蔽状态栏下拉,必须得有系统签名,WTF。。。