为了账号安全,请及时绑定邮箱和手机立即绑定

SYSTEM_ALERT_WINDOW - 如何在Android 6.0

SYSTEM_ALERT_WINDOW - 如何在Android 6.0

人到中年有点甜 2019-08-16 15:42:34
SYSTEM_ALERT_WINDOW - 如何在Android 6.0和targetSdkVersion 23上自动获得此权限Facebook,Evernote,Pocket - 所有应用程序都会自动在Android 6.0上获得此权限,即使它们的目标是23(targetSdkVersion=23)。关于新的Marshmallow权限模型有很多文档。其中一个SYSTEM_ALERT_WINDOW被“提升”为“高于危险”的权限级别,因此需要特殊的用户干预才能授予应用程序这些权限。如果应用程序有targetSdkVersion22或更低,app会自动获得此权限(如果在清单中请求)。但是,我注意到一些获得此权限的应用程序,无需将用户发送到设置特殊页面的Draw over other apps权限。我看到Facebook,Evernote,Pocket - 也许还有更多。任何人都知道在没有用户通过的情况下如何授予应用程序此权限Settings -> Apps -> Draw over other apps?谢谢
查看完整描述

3 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

在棉花糖来之后,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%正确

但我发现很多人仍然在寻找ACTION_MANAGE_OVERLAY_PERMISSION 永久性的允许方式如果用户已经允许Permission Once那么每次打开应用程序时都不要问它,所以请听你的解决方案 -

  1. 检查设备是否具有API 23+

  2. 如果23+ API然后检查用户是否有许可

  3. 如果有许可,一旦不驱使他Settings.ACTION_MANAGE_OVERLAY_PERMISSION,如果还没有许可,那么请求运行时权限检查

在你的onCreate()方法中放在下面。把它放在后面setContentView

checkPermission();

现在把代码放在下面 onActivityResult

@TargetApi(Build.VERSION_CODES.M)@Overrideprotected 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);
        }
    }}

并且不要忘记在您的类中声明此公共变量

public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469;


查看完整回答
反对 回复 2019-08-16
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

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


查看完整回答
反对 回复 2019-08-16
  • 3 回答
  • 0 关注
  • 1094 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号