2016-11-07 44 views
1

我的應用主要用途是覆蓋,覆蓋從服務運行。避免使用SYSTEM_ALERT_WINDOW的服務檢測到屏幕覆蓋

Android安全性添加漂亮的"Screen Overlay Detected"

我想避免當用戶試圖更改權限「檢測到屏幕疊加」。所以...我已經添加一個AccessiblityService來檢測:

if (event.getPackageName().equals("com.google.android.packageinstaller")){ 
    stopService(myServiceIntent); 
} 

但是,即使現在我看到這條消息彈出。 (當我的服務停止時...)。我看到Twilight沒有問題。

我錯過了什麼?

p.s. - 我也嘗試過構建一個簽名的apk,但看到完全相同的行爲。

回答

1

看來我已經能夠解決這個問題。

a)stopService不保證您的服務將被停止。 描述here

它不會被破壞,直到所有這些綁定被刪除。有關服務生命週期的更多詳細信息,請參閱服務文檔。

b)我能夠通過發送名爲stopSelf()的意圖殺死我的服務。 但是,流程殺死/啓動可能會很慢。

c)最佳分辨率:所以它似乎Android檢查視圖的可見性。沒有必要殺死服務或做任何更復雜的事情。

當前我正在做的方式: - AccessibilityService(已被我的應用程序使用)monitor「com.google.android.packageinstaller」儘管它可以被提煉爲類:「com.android.packageinstaller.permission.ui .ManagePermissionsActivity」

  • 一旦這類檢測,我們發送意向‘鴨’,當我們出門在外,我們再派意圖,我們是重新打開。

  • 該服務通過處理這些電話:

    [ourView].setVisibility(View.INVISIBLE); // when permission settings shown

    [ourView].setVisibility(View.VISIBLE); // when normal flow

+0

只是後續爲將來閱讀此內容的人, 從Android O起,Google似乎終止了對支持SYSTEM_ALERT_WINDOW的許多應用程序的支持。 可能對於吸入系統來說,這些解決方法將不再需要。特別是如果您希望覆蓋諸如狀態欄之類的系統組件時。 –

0

只要安卓6.x的是在某些設備上,其中這個 「覆蓋警報」 越野車,而不顯示任何原因(根據我的分析數據,有2%到5%的設備),最好的解決方案是通過將targetSdk定義爲22來避免整個權限過程。請注意,您不能將目標sdk降級爲新版本或這將導致INSTALL_FAILED_PERMISSION_DOWNGRADE錯誤,當用戶更新需要應用程序的unisntall /安裝。