Return 请求 SYSTEM_ALERT_WINDOW 权限后应用

Return to app after requesting SYSTEM_ALERT_WINDOW permission

我的应用程序需要权限才能覆盖其他应用程序才能正常工作,因此在应用程序启动时我会检查权限,如果需要,请要求用户授予它,然后通过以下代码启动请求:

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

这需要用户在启用权限后按下后退按钮,但我注意到某些应用程序能够在用户启用后自动return或转到另一个activity。这是如何实现的?是否有在后台侦听的服务定期检查用户是否启用了某些功能?

看来这个设置没法观察,所以真的没有优雅的解决办法。

您可以做的是在将用户发送到“设置”屏幕后使用处理程序每​​秒检查一次设置。

您无法真正从“设置”屏幕以编程方式 "go back",因此唯一的选择是重新启动 Activity 并清除之前的设置(否则它将返回到“设置”后按后退屏幕)。

在下面的示例中,启用设置后的一秒内,它将重新启动 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);

请注意,您应该设置超时或最大尝试次数,这样如果用户未启用覆盖设置,它就不会永远持续下去。

另一种返回方法是跟踪请求代码,然后 finishActivity

int REQ_CODE = 0;
public void requestPermission(){
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getContext().getPackageName()));
    startActivityForResult(intent, REQ_CODE);
}

public void onPermissionChanged(){
    runOnUiThread(new Runnable() {
      @Override
        public void run() {
          finishActivity(REQ_CODE);
        }
    });
}