2017-03-08 49 views
0

我正在構建一個DPC(設備策略控制器),我看到的其中一個問題是,在Play商店和Play服務正在更新時,Google Contact Sync服務崩潰 - 將典型的崩潰對話框屏幕。由於初始設置過程的部分思想是儘可能少的用戶交互,我怎樣才能以編程方式忽略此對話框(因爲我似乎幾乎保證會發生這種情況)?如何以編程方式解除崩潰對話框?

我試圖解僱系統對話框......

ctx.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); 

...但是,這似乎並沒有這樣的伎倆。

既然這是一個DPC,那麼任何需要設備所有權/管理的事情都可以。

編輯:通常我沒有在屏幕上的用戶界面,所以如果有必要請提及它。此外,如果不是4.0+,則解決方案最好至少應工作在6.0+以上。

回答

1

嘗試做onWindowsFocusChanged方法是這樣的例子:

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
     super.onWindowFocusChanged(hasFocus); 

     if (!hasFocus) { 
      Intent ctx= new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
      sendBroadcast(ctx); 
     } 
    } 

我不知道有關程序崩潰的對話,但也許它會幫助你

0
ACTION_CLOSE_SYSTEM_DIALOGS

AppErrorDialog可以通過廣播被解僱,如果Android版本是N.

ctx.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); 

但是,如果手機被鎖定,AppErrorDialog將不會顯示。

public boolean canShowErrorDialogs() { 
    return mShowDialogs && !mSleeping && !mShuttingDown 
      && mLockScreenShown != LOCK_SCREEN_SHOWN; 
} // ActivityManagerService 
+0

如此接近。但不幸的是我需要這在早期版本的工作,再加上我需要保持在屏幕上,以便以後我可以證明我的UI(出於某種原因FLAG_DISMISS_KEYGUARD和FLAG_SHOW_WHEN_LOCKED是不夠的突破至少一個測試設備上的輕掃鍵盤保護裝置)。 – Keilaron

0

請試試這段代碼。

try { 

     Class ActivityManagerNative = Class.forName("android.app.ActivityManagerNative"); 
     Class IActivityManager = Class.forName("android.app.IActivityManager"); 

     Method getDefault = ActivityManagerNative.getMethod("getDefault", null); 
     Object am = IActivityManager.cast(getDefault.invoke(ActivityManagerNative, null)); 

     Method closeSystemDialogs = am.getClass().getMethod("closeSystemDialogs", String.class); 
     closeSystemDialogs.invoke(am, "DPC close"); 

    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch (NoSuchMethodException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
+0

這與廣播意圖不一樣嗎?無論哪種方式,它似乎沒有做任何事情,我沒有得到例外。 – Keilaron