2016-07-04 7 views
2

システムアラートや他のオーバーレイ(たとえば、電源ボタンを長押ししたときの電源メニュー)や起動を検出するマルウェアなどで、自分のアクティビティが隠れているかどうかを検出できるようにしたいと考えています私の活動の私は、この場合foregroundアプリがまだ私のアプリになることに気づいたので、フォアグラウンドアプリが何であるかを単純に判断することはできません。また、私のアクティビティが隠されているときにonPause()が呼び出されないので、onPause()にもロジックを入れることができません。たとえ缶ができたとしても、私はシステム警告/オーバーレイとバック/ホームボタンを押したユーザーを区別する必要があります。アクティビティが不明瞭になったときを検出するにはどうすればよいですか?

これを達成する他の方法はありますか?

+0

onPause()がその場所になります。あなたの活動がバックグラウンドで行われるたびに呼び出される必要があります。再チェックしていただけますか? –

+0

私は、あなたはonBackPressedまたはHomePressEnabled条件でいくつかのブール値を追加する必要がありますと思います。 –

+0

@ abhishek-bansal私はすでにそれを確認して確認しました。パワーメニューや音量コントロールなどのシステムアラートが自分のアクティビティにオーバーレイされているときは、onPause()は呼び出されません。 – user1118764

答えて

0

PackageManagerを使用すると、インストールされているパッケージのうちSYSTEM_ALERT_WINDOW、BIND_ACCESSIBILITY_SERVICE、BIND_DEVICE_ADMINなどの疑わしいアクセス権を持つものをクエリできます。

Some code ideas

1

活動、断片またはビューが隠されているかどうかをチェックすることができます。

アクティビティの場合は、オーバーライドdispatchTouchEventメソッドが必要で、イベントにフラグFLAG_WINDOW_IS_OBSCUREDがあるかどうかを確認する必要があります。サンプルコードがあります:

public class OverlayTouchActivity extends Activity { 
    private boolean mObscuredTouch; 

    public boolean isObscuredTouch() { 
     return mObscuredTouch; 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent event) { 
     mObscuredTouch = (event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0; 
     return super.dispatchTouchEvent(event); 
    } 
} 

これはAndroidのコードの一部である、OverlayTouchActivity.javaを確認してください。断片が隠されている場合、チェックOverlayTouchActivity活動に属する断片は次のコードを実行するために:

OverlayTouchActivity activity = (OverlayTouchActivity) getActivity(); 
if (activity.isObscuredTouch()) { 
    // Fragment is bbscured 
} 

AppPermissionsFragment.java断片(OverlayTouchActivityの検索)を参照してください。

の場合、onFilterTouchEventForSecurityメソッドをオーバーライドする必要があります。詳細については、Viewドキュメントのsecurity sectionを参照してください。

関連する問題