天天看點

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。。。