Android 上层权限的获取与使用

在 Android 系统中,有一种特殊的权限称为“显示在其他应用的上层权限”,该权限可以让应用在其他应用的上层显示内容,例如悬浮窗、悬浮球等功能。这种权限通常用于需要在全局显示信息的应用,比如悬浮窗广告、视频播放器等。

获取上层权限

要获取“显示在其他应用的上层权限”,首先需要在 AndroidManifest.xml 文件中声明权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

然后在运行时动态请求权限:

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

使用上层权限

获取到上层权限之后,可以通过以下代码在其他应用的上层显示内容:

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
        PixelFormat.TRANSLUCENT
);

WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
View view = LayoutInflater.from(this).inflate(R.layout.overlay_layout, null);

windowManager.addView(view, params);

示例代码

下面是一个简单的示例,演示如何在其他应用的上层显示一个悬浮窗口:

// MainActivity.java
public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_CODE_OVERLAY_PERMISSION = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, REQUEST_CODE_OVERLAY_PERMISSION);
        } else {
            showOverlayView();
        }
    }

    private void showOverlayView() {
        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT
        );

        WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        View view = LayoutInflater.from(this).inflate(R.layout.overlay_layout, null);

        windowManager.addView(view, params);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE_OVERLAY_PERMISSION) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Settings.canDrawOverlays(this)) {
                showOverlayView();
            } else {
                Toast.makeText(this, "未授予悬浮窗权限", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

结语

通过以上示例代码,我们可以实现在 Android 应用中获取并使用“显示在其他应用的上层权限”,从而实现全局悬浮窗等功能。在使用该权限时应当注意用户体验,避免滥用该权限,以免给用户带来困扰。