android三个虚拟按钮 安卓下面三个虚拟按键

您所在的位置:网站首页 安卓桌面三个按键 android三个虚拟按钮 安卓下面三个虚拟按键

android三个虚拟按钮 安卓下面三个虚拟按键

2024-07-10 09:25| 来源: 网络整理| 查看: 265

最近做项目碰到一个需求,把那个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下拉的,比如电话、锁屏模块。想要调用该方法,你还需要以下权限:

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3