2016-11-17 70 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中提取源代码后,它看起来像这正是他们正在做的,尽管在后台服务。我会继续,并将其标记为答案,但我认为在将它们发送到屏幕之前,我会继续向用户提供一些说明。 –

相关问题