2016-11-17 36 views
0

我的應用程序需要權限才能使其他應用程序正常工作,因此在應用程序開始時我會檢查權限,並在需要時請求用戶授予權限,然後啓動請求通過下面的代碼:請求SYSTEM_ALERT_WINDOW權限後返回到應用程序

Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + activity.getPackageName())); 
    activity.startActivityForResult(intent, REQUEST_OVERLAY_PERMISSION); 

這需要用戶按權限啓用後,後退按鈕,但我注意到,一些應用程序能夠自動返回或前往其他活動的用戶啓用後。這是如何完成的?是否有服務在後臺偵聽,定期檢查用戶是否啓用了某些功能?

+1

無論你想做什麼,你都可以在onActivityResult()方法中做到。檢查resultCode是否等於Activity.RESULT_OK,然後做任何你想做的事情。 –

+0

對不起,我錯過了原始問題中的一些單詞。我可以根據結果做些東西,但是我要做的是讓它自動返回到活動狀態,而無需用戶按下。 –

回答

1

看來,沒有辦法觀察這個設置,所以實際上沒有優雅的解決方案。

您可以執行的操作是將用戶發送到設置屏幕後,使用Handler每秒檢查一次設置。

您不能從設置屏幕以編程方式真正地「返回」,因此唯一的選擇是重新啓動活動並清除以前的活動(否則它會在後退按回到設置屏幕) 。

下面的例子中,在啓用設置的一秒內,它將重新啓動MainActivity。

首先定義了Runnable:

Handler handler = new Handler(); 
Runnable checkOverlaySetting = new Runnable() { 
    @Override 
    @TargetApi(23) 
    public void run() { 
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { 
      return; 
     } 
     if (Settings.canDrawOverlays(MainActivity.this)) { 
      //You have the permission, re-launch MainActivity 
      Intent i = new Intent(MainActivity.this, MainActivity.class); 
      i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
      startActivity(i); 
      return; 
     } 
     handler.postDelayed(this, 1000); 
    } 
}; 

然後開始了Runnable當您發送用戶設置屏幕:

Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, 
        Uri.parse("package:" + getPackageName())); 
startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE); 
//Add this here: 
handler.postDelayed(checkOverlaySetting, 1000); 

請注意,您應該設置超時或最大努力使之如果用戶沒有啓用覆蓋設置,它將不會永遠持續。

+0

這與我一直在慢慢擡頭的事情一致。通過像這樣的其他權限,比如通知設置,我可以觀察到一個URI,但在我的情況下卻沒有。在從最新的Android Auto APK中提取源代碼後,它看起來像這正是他們正在做的,儘管在後臺服務。我會繼續,並將其標記爲答案,但我認爲在將它們發送到屏幕之前,我會繼續向用戶提供一些說明。 –

相關問題