52

Facebook,Evernote,Pocket - 所有应用程序都自动获得Android 6.0的此权限,即使它们的目标是23(targetSdkVersion=23)。SYSTEM_ALERT_WINDOW - 如何在Android 6.0和targetSdkVersion上自动获得此权限23

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

但是,我注意到一些应用程序获得此权限,而无需将用户发送到设置特殊页面Draw over other apps权限。我看到了Facebook,Evernote,Pocket - 也许还有更多。

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

感谢

+0

http://stackoverflow.com/questions/33139754/android-6-0-marshmallow-cannot-write-to-sd-card这帮了我 – Bharath

+0

http://stackoverflow.com/questions/33139754/android-6-0-marshmallow-can not-write-to-sd-card这篇文章帮助我显示了写入外部的对话许可 – Bharath

回答

77

这是棉花糖6.0.1引入了新的行为。

每一个应用程序,请求SYSTEM_ALERT_WINDOW权限,并安装通过Play商店(版本6.0.5 或更高),都将自动授予的权限。

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

这些是提交[1][2],允许Play商店授予SYSTEM_ALERT_WINDOW权限的自动授予权限。

+4

虽然我想知道如何突然出现'高于危险'的许可现在'低于正常'。我的意思是,你甚至不会在弹出窗口中看到这个权限,而应用程序可以自动获取它。有什么想法吗? – oriharel

+0

如果您没有授予权限,则权限仍然处于“高于危险”的状态。只有Play商店具有不同的行为并自动授予权限,也许他们认为Play商店中的应用不是恶意的,并且可以信任它们。或者,他们可能会收到很多关于此次更改的投诉,并且他们决定寻找解决方法。 –

+2

@oriharel我不知道Facebook Messenger的大规模推动谷歌在这个方向支持这一点。可能是因为Facebook与Google达成协议,不强制用户授予权限,以便聊天头可以继续工作。 – dennisdrew

0

如果应用程序的目标API 22或更低,则Play商店会给SYSTEM_ALERT_WINDOW许可和别人当用户点击安装(显示警报),即使其设备的是Android 6.0 否则,如果应用程序的目标API 23或以上,以便在运行时请求许可。

30

叶棉花糖后前来的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永久像如果用户允许权限一次,然后唐每次打开应用程序时都不要问它所以为你解答 - 1)检查设备是否有api 23+

2)if 23+ api then then if if user如果有过一次permite不开车他Settings.ACTION_MANAGE_OVERLAY_PERMISSION &如果还没有允许尚未然后询问运行权限检查

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

checkPermission(); 

现在把下面的代码onActivityResult

许可证或不

3)

@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); 
     } 
    } 
} 

,不要忘了在你的类

public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE= 5469; 

欢呼声来声明这个公共变量! ;-)

+0

完美的工作,谢谢+1 –

+0

@HarinKaklotar欢迎高兴地帮助你:-) –

+0

完美答案buddy –

相关问题