Android悬浮窗不申请SYSTEM_ALERT_WINDOW权限
时间: 2023-09-16 14:08:28 浏览: 166
在Android 6.0及以上的版本中,应用需要动态申请SYSTEM_ALERT_WINDOW权限才能显示悬浮窗。如果你不想申请这个权限,可以考虑使用TYPE_TOAST类型的悬浮窗。这种类型的悬浮窗只能显示短暂的文本信息,而且不能接收用户的输入。如果你需要实现更复杂的悬浮窗功能,还是建议申请SYSTEM_ALERT_WINDOW权限。
相关问题
android 使用代码申请申请SYSTEM_ALERT_WINDOW权限
在Android应用中,申请`SYSTEM_ALERT_WINDOW`权限是为了显示系统级别的窗口,比如悬浮窗功能。这个权限通常用于广告、弹幕等需要覆盖其他应用程序内容的情况。在AndroidManifest.xml文件中直接声明权限不够,因为运行时权限管理在Android M及以上版本(API level 23)开始强制要求动态请求权限。以下是在代码中申请该权限的步骤:
1. 首先检查当前设备是否支持运行时权限,并在`onCreate()`或相应的生命周期方法中进行判断:
```java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.SYSTEM_ALERT_WINDOW)
!= PackageManager.PERMISSION_GRANTED) {
// Permission is not granted
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.SYSTEM_ALERT_WINDOW},
REQUEST_SYSTEM_ALERT_WINDOW);
}
}
```
2. 定义一个常量REQUEST_SYSTEM_ALERT_WINDOW作为请求码,这是请求权限时的一个唯一标识符。
3. 创建一个`onRequestPermissionsResult()`方法来处理权限结果:
```java
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_SYSTEM_ALERT_WINDOW: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission granted, do something with SYSTEM_ALERT_WINDOW here
} else {
// Permission denied, handle accordingly
}
return;
}
// ... other cases for other permissions
}
}
```
请注意,如果用户拒绝了权限,你需要提供一个合适的反馈给用户,比如提示他们为什么需要此权限以及如何启用它。
android 11以上获取SYSTEM_ALERT_WINDOW权限
在Android 11及以上版本中,由于隐私政策的变化,系统不再允许应用直接请求`SYSTEM_ALERT_WINDOW`权限,因为这种权限允许应用程序显示在其他应用之上,可能会干扰用户的正常操作并被视为潜在的风险。从Android 10(API级别29)开始,对于需要使用这个权限的应用,开发者需要遵循以下步骤:
1. **权限迁移**: 如果您的应用需要此权限,您应该将其添加到您的`AndroidManifest.xml`文件中的`uses-permission`标签,但在`<queries>`元素内声明意图检查条件(Intents),以便在运行时根据用户的行为动态请求权限。
```xml
<manifest>
<queries>
<!-- 检查设备是否支持悬浮窗 -->
<intent>
<action>android.media.BIND_REMOTE_AUDIO_PLAYBACK</action>
</intent>
</queries>
...
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
...
</manifest>
```
2. **用户授权**: 当第一次运行时,如果发现应用符合条件,系统会提示用户手动授予权限,而不是默认授予。用户可以选择始终允许、仅在特定条件下允许或者拒绝。
3. **处理无权限情况**: 应用需要检测是否有此权限,并在没有的情况下提供替代方案或者向用户解释为何需要该权限以及如何获得它。
4. **运行时请求**: 使用`ActivityManager.requestWindowFeature()`或`WindowManager.LayoutParams.FLAG_SYSTEM_ALERT_WINDOW`来临时申请权限,但这只适用于某些特殊情况,不是常规做法。
记住,尽量减少对`SYSTEM_ALERT_WINDOW`权限的依赖,因为它可能导致用户体验下降,尤其是在不需要的时候滥用此权限可能导致应用被用户卸载或者权限被撤销。
阅读全文