SYSTEM_ALERT_WINDOW – 如何在Android 6.0和targetSdkVersion 23上自动获取此权限

Facebook,Evernote,Pocket – 所有应用程序都自动获得Android 6.0的权限,即使它们的目标是23( targetSdkVersion=23 )。

关于新的棉花糖许可模式有很多文件。 其中之一就是SYSTEM_ALERT_WINDOW被“提升”为“高于危险”的权限类别,因此需要特殊的用户干预才能授予应用程序权限。 如果应用程序的targetSdkVersion 22或更低,则应用程序会自动获取此权限(如果在清单中请求)。

不过,我注意到一些应用程序获得这个权限,而不需要发送用户到Draw over other apps权限Draw over other apps设置特殊页面。 我看到Facebook,Evernote,Pocket – 也许还有更多。

任何人都知道如何在没有用户通过Settings -> Apps -> Draw over other apps情况下授予应用程序的权限?

谢谢

这是Marshmallow 6.0.1中引入的新行为。

每个需要SYSTEM_ALERT_WINDOW权限并通过Play Store( 6.0.5或更高版本)安装的应用程序都将自动授予权限。

如果应用程序是侧载的,则不会自动授予该权限。 您可以尝试从apkmirror.com下载并安装Evernote APK。 正如你所看到的,你需要在Settings -> Apps -> Draw over other apps手动授予权限。

这些是允许Play商店给出SYSTEM_ALERT_WINDOW许可的自动许可的提交[1] [2] 。

是的棉花糖来Android后安全级别更坚持,但对于

 SYSTEM_ALERT_WINDOW 

你可以显示浮动动作和任何你可以强制用户给它的权限通过你的Oncreate()方法中的代码把这个代码放在setContentView

 / // Check if Android M or higher if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ // Show alert dialog to the user saying a separate permission is needed // Launch the settings activity if the user prefers Intent myIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); startActivity(myIntent); } 

操作ACTION_MANAGE_OVERLAY_PERMISSION直接启动“通过其他应用程序绘制”权限屏幕。


编辑

你好我的以上代码工作100%正确

但我只是发现,许多人仍然在search,如何可以允许ACTION_MANAGE_OVERLAY_PERMISSION 永久性如果用户已经允许一次,那么不要问它每次他打开应用程序,所以听你的解决scheme – 1)检查是设备有api 23+

2)如果23+ api,然后检查用户是否允许

3)如果只有一次没有将他驱动到Settings.ACTION_MANAGE_OVERLAY_PERMISSION&如果还没有允许,则请求运行时权限检查

  Put below line in in your Oncreate() method Put this after setContentView checkPermission(); 

现在把下面的代码放在onActivityResult

  @TargetApi(Build.VERSION_CODES.M) @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) { if (!Settings.canDrawOverlays(this)) { // You don't have permission checkPermission(); } else { //do as per your logic } } } 

现在最后是checkPermission方法的代码

 public void checkPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!Settings.canDrawOverlays(this)) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE); } } } 

并且不要忘记在你的类中声明这个公共variables

 public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE= 5469; 

欢呼! 😉

如果应用程序的目标是API 22或更低版本,则Play Store将授予SYSTEM_ALERT_WINDOW权限,而当用户点击安装(显示警报)时,即使其设备是Android 6.0,也会授予SYSTEM_ALERT_WINDOW权限。否则,如果应用程序的目标是API 23或更高版本,许可将在运行时请求授予。