2017-05-05 13 views
11

dialog(下記のようなUSSDなど)がAndroidに表示されるかどうかを確認するにはどうすればよいですか?システムダイアログが表示されるかどうかを確認する方法は?

airplane mode switching dialog

プログラム的な方法やcmdのルート方法はありますか? 任意のバリアント。

+2

「システムダイアログ」は、他のアクティビティと同様に単なるアクティビティです。あるアクティビティを「システムダイアログ」とし、もう1つを「システムダイアログ」とする魔法はありません。したがって、まず「システムダイアログ」と他のダイアログをテーマにしたいくつかのアクティビティとの間の区別される特性を自分で決める必要があります。 – CommonsWare

+0

「飛行機モードのオン/オフ」に関するメッセージやussdメッセージなどのダイアログが表示されます... – Andreyua

答えて

2

システムダイアログはアクティビティです。 ActivityManagerを使用して、トップアクティビティクラス名で検出できます。新しいデバイスで

final List<ActivityManager.RunningTaskInfo> runningTasks = manager.getRunningTasks(1); 
final ComponentName componentName = runningTasks.get(0).topActivity; 
final String className = componentName.getClassName(); 

if (className.equals("YOUR_EXPECTED_ACTIVITY_CLASS_NAME")) { 
    // do something 
} 

:APIレベルのデバイス未満23(M)で

final ActivityManager manager = (ActivityManager) context 
    .getSystemService(Activity.ACTIVITY_SERVICE); 

final List<ActivityManager.AppTask> appTasks = manager.getAppTasks(); 
final ComponentName componentName = appTasks.get(0).getTaskInfo().topActivity; 
final String className = componentName.getClassName(); 

if (className.equals("YOUR_EXPECTED_ACTIVITY_CLASS_NAME")) { 
    // do something 
} 

それとも、この場合のデバイスが内にある場合、あなたは確認することができます飛行機モードを開始する前に:

private boolean isAirplaneModeOn(final Context context) { 
    final int airplaneMode = Settings.System.getInt(
     context.getContentResolver(), 
     Settings.System.AIRPLANE_MODE_ON, 
     0 
    ); 

    return airplaneMode != 0; 
} 

... 

if (!isAirplaneModeOn(this)) { 
    // do something 
} 
+0

ありがとうございました。しかし残念ながらあなたの選択は私のためには機能しません。私の場合、classNameは常に私の主な活動クラス名と同じです。私は以前あなたの方法をチェックしていて、彼らは私のために働いていませんでした。だから私はこの質問をしました。 また、あなたのisAirplaneModeOnメソッドが私の必要としているものではありません。私はAirplaneModeダイアログの外観を追跡する必要があります。 私はあなたの答えに投票しますが、私はそれを受け入れることができません。ごめんなさい。 – Andreyua

+0

テスト用のコード: https://gist.github.com/goodandrewsoft/b961c2b6cfc6666bcbbb2a617f6f8d9e – Andreyua

+0

申し訳ありませんが、私は誤解しています。 –

3

理論的にはAccessibilityServiceを使用してこれを行うことはできますが、複雑で、さまざまなデバイスで動作する場合と動作しない場合があります。ユーザーはアプリケーションのアクセシビリティ機能を手動で有効にする必要があります。ウィンドウが開かれるたびにアンドロイドからコールバックを受け取ることができます。次に、特定のテキストがあるか特定のパッケージに属しているかを判断するためにウィンドウを調べることができます。これは "強力な"アプローチですが、いくつかの状況では。

+0

何かそんなものhttp://stackoverflow.com/a/32251469/3478155? – Andreyua

2

あなたの質問は、Android 6+のアクセス許可管理で使用されているソリューションを考えました。権限を設定しようとしているときにトーストまたはシステムアラートダイアログが表示されたら、エラーメッセージが表示されましたか? Android "Screen Overlay Detected" message if user is trying to grant a permission when a notification is showing

彼らのやり方は、ActivitydispatchTouchEventメソッドをオーバーライドすることです。これは、「途中で」タッチイベントをインターセプトするものがあるかどうかを確認できます。特別なアクティビティを、アプリケーション内のオーバーレイを検出したいアクティビティの基本クラスとして使用することができます。

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

あなたの活動が

public boolean isObscured() { 
    return mObscured; 
} 

を隠されている場合は注意する必要があり、任意の時点で確認するためにパブリックメソッドを追加 - それは質問から明らかではないとして - 2番目の活動であれば、システムからか、特権付きアプリがスタックの先頭にある場合、自分のアクティビティはタッチイベントを受け取らなくなります。これは、フラグメント、トースト、フローティングウィジェット、およびビュー階層を共有する可能性のある他のアイテムをキャプチャするためです。

+0

残念ながら、kitkatで作業しないでください – Andreyua

関連する問題