2017-05-05 2 views
11

안드로이드에 dialog (아래 또는 USSD와 같은) 시스템이 표시되는지 확인하는 방법은 무엇입니까?시스템 대화 상자가 표시되는지 확인하는 방법은 무엇입니까?

airplane mode switching dialog

프로그래밍 방식 또는 cmd를 루트 방법은? 변종입니다.

+2

"시스템 대화 상자"는 다른 활동과 마찬가지입니다. 하나의 활동을 "시스템 대화"로 만드는 마법과 "시스템 대화"가 아닌 마법은 없습니다. 따라서 먼저 "시스템 대화 상자"와 다른 대화 상자를 주제로 한 활동 사이의 구분되는 특성을 스스로 결정해야합니다. – 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 
} 

: 장치가있는 경우

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 
} 

또는이 경우

, 당신은 확인할 수 있습니다 API 레벨 미만 23 (M)와 장치에서

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

비행기 모드를 시작하기 전에 :

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

메서드를 Activity으로 재정의했습니다. 이렇게하면 터치 이벤트를 가로 채고있는 중 어떤 것이 있는지 확인할 수 있습니다. 특수 액티비티를 앱의 오버레이를 감지하려는 모든 액티비티의 기본 클래스로 사용할 수 있습니다. 이 질문에서 명확하지으로 - - 활동이

public boolean isObscured() { 
    return mObscured; 
} 

당신은주의해야을 가려 경우

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

주어진 시간에 확인하는 공공 방법을 추가하면 시스템에서 두 번째 활동 또는 권한이 부여 된 앱이 스택 맨 앞에 있으면 자신의 활동에 더 이상 터치 이벤트가 수신되지 않습니다. 이것은 조각, 토스트, 부동 위젯 및 뷰 계층을 공유 할 수있는 다른 항목을 캡처하는 것입니다.

+0

불행히도 kitkat에서 작업하지 마십시오. – Andreyua

관련 문제