在服务中将方向设置为横向模式

Cal*_*ron 3 android screen-orientation

我发现代码可以满足我的需求,例如:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
Run Code Online (Sandbox Code Playgroud)

但这似乎要求参与活动,而不是服务.

基本上我想要做的是接收ON_BOOT_COMPLETED意图并启动服务,让服务定期检查是否(或最好通知屏幕方向已更改),并将其设置回Landscape.

有没有办法在服务中做到这一点?我一直在寻找答案而一直找不到任何东西,所以如果这是一个重复的问题,我会大声道歉.

注意:这是一个付费的自由职业项目,仅用于支付我工作的人所拥有的设备.它不适用于恶意软件或任何其他此类目的

Pau*_*sma 5

首先,强制性的"请不要那样做".我希望你有充分理由这样做,因为用户可以通过禁用屏幕旋转来设置此首选项.

也就是说,你不能从服务中做到这一点.正如您所指出的,Activity.setRequestedOrientation(int)属于Activity类,不能在任何其他上下文中使用.

您可能会考虑做的是创建一个透明的系统覆盖窗口,并强制执行它的横向方向.

要回答您的后续问题,可以从服务中调用以下代码片段:

private static final boolean DISPLAY = false;

@Override
public void onCreate() {
    final View view = new View(this);
    int dimension = 0;
    int pixelFormat = PixelFormat.TRANSLUCENT;
    if (DISPLAY) {
        view.setBackgroundColor(Color.argb(128, 255, 0, 0));
        dimension = LayoutParams.MATCH_PARENT;
        pixelFormat = PixelFormat.RGBA_8888;
    }
    final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            dimension, dimension,
            WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            pixelFormat);
    params.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
    final WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    wm.addView(view, params);
}
Run Code Online (Sandbox Code Playgroud)

在代码段中,DISPLAY是一个简单的开关,可以显示覆盖窗口以进行测试.(你应该看到一个半透明的红色覆盖层.)