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或更高版本,许可将在运行时请求授予。