永久全屏显示android应用程序

永久全屏显示android应用程序,android,android-fullscreen,Android,Android Fullscreen,我正在为一个客户开发一个应用程序,该客户希望使用平板电脑显示交互式广告和游戏。平板电脑将放置在一个支架中,避免使用任何物理按钮 我正在尝试让应用程序全屏运行,从顶部滑动时,我希望应用程序保持全屏。但有一段时间,状态栏出现了,按钮也出现了 我的活动代码: public class OrderActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) {

我正在为一个客户开发一个应用程序,该客户希望使用平板电脑显示交互式广告和游戏。平板电脑将放置在一个支架中,避免使用任何物理按钮

我正在尝试让应用程序全屏运行,从顶部滑动时,我希望应用程序保持全屏。但有一段时间,状态栏出现了,按钮也出现了

我的活动代码:

public class OrderActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_order);
        hideSystemUi();
        getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(
                new OnSystemUiVisibilityChangeListener() {
                    @Override
                    public void onSystemUiVisibilityChange(int visibility) {

                        if (visibility == 0) {
                            hideSystemUi();
                        }
                    }
                });
    }

    private void hideSystemUi() {

        getWindow().getDecorView().setSystemUiVisibility(

            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_IMMERSIVE);

    }


}

PD:我知道这种行为在市场上的应用程序中是不受欢迎的,但在这种特定情况下,这是必需的,也是“正确的”。

您可以在样式xml文件中自定义主题:

style name="fullscreen_theme" parent="Theme.AppCompat.Light">
<item name="android:windowFullscreen">true</item>
</style>
style name=“全屏主题”parent=“theme.AppCompat.Light”>
符合事实的

您可以在样式xml文件中自定义主题:

style name="fullscreen_theme" parent="Theme.AppCompat.Light">
<item name="android:windowFullscreen">true</item>
</style>
style name=“全屏主题”parent=“theme.AppCompat.Light”>
符合事实的

在应用程序标记内的android清单中,添加以下行:

android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"

在应用程序标记内的android清单中,添加以下行:

android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"

通过在终端外壳中运行以下命令,可以去掉底部的按钮(假设设备是根设备):

setprop qemu.hw.mainkeys 1
killall surfaceflinger
您可以在Android中通过以下程序运行此功能:

try {
    Process process = Runtime.getRuntime().exec("getprop qemu.hw.mainkeys");
    BufferedReader prop = new BufferedReader(new InputStreamReader(process.getInputStream()));

    if (prop == null || !prop.trim().equals("1")) {
        Runtime.getRuntime().exec("setprop qemu.hw.mainkeys 1");
        Runtime.getRuntime().exec("killall surfaceflinger");
    }
} catch (Exception e) {
    e.printStackTrace();
}
这是关于在build.prop中执行的,但是我无法让它为我工作。另外,通过编程实现,我可以在用户退出应用程序时重新启用它

使用通知栏更新

对于顶部的通知栏,我所能做的就是阻止它扩展。它仍然会弹出,但是用户不能用它做很多事情

这实际上与我在这里找到的另一个答案略有不同:

您还必须将以下内容添加到AndroidManifest.xml中:

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

我只在Jelly Bean 4.2(API 17)和更高版本中使用过它。在那之前不确定它是否有效

希望有帮助


正如在其他回答中所指出的,这在L中变得更容易,也可以通过自定义ROM来完成。我的目标是一个在KitKat中工作的编程解决方案,假设设备是根设备,则可以通过在终端外壳中运行以下命令来去掉底部的按钮:

setprop qemu.hw.mainkeys 1
killall surfaceflinger
您可以在Android中通过以下程序运行此功能:

try {
    Process process = Runtime.getRuntime().exec("getprop qemu.hw.mainkeys");
    BufferedReader prop = new BufferedReader(new InputStreamReader(process.getInputStream()));

    if (prop == null || !prop.trim().equals("1")) {
        Runtime.getRuntime().exec("setprop qemu.hw.mainkeys 1");
        Runtime.getRuntime().exec("killall surfaceflinger");
    }
} catch (Exception e) {
    e.printStackTrace();
}
这是关于在build.prop中执行的,但是我无法让它为我工作。另外,通过编程实现,我可以在用户退出应用程序时重新启用它

使用通知栏更新

对于顶部的通知栏,我所能做的就是阻止它扩展。它仍然会弹出,但是用户不能用它做很多事情

这实际上与我在这里找到的另一个答案略有不同:

您还必须将以下内容添加到AndroidManifest.xml中:

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

我只在Jelly Bean 4.2(API 17)和更高版本中使用过它。在那之前不确定它是否有效

希望有帮助



正如在其他回答中所指出的,这在L中变得更容易,也可以通过自定义ROM来完成。我的目标是一个在KitKat中工作的编程解决方案

更重要的是,至少在“L”开发者预览之前,在“L”开发者预览中,真正的kiosk模式是可用的(如果您至少有根访问权限)。构建自己的ROM模块,删除导航栏和状态栏。设备是否根目录?您使用的API级别是什么?@sarme设备理想情况下没有根目录。如果它能产生最好的选择,它可能是。目标API尚未定义。(我们正在为客户构建完整的项目,我们将提供平板电脑)哈维尔,你成功了吗?因为我处于相同的情况下,需要永久全屏编辑,而您想要的内容则被特别阻止,至少在“L”开发者预览之前,在“L”开发者预览之前,真正的kiosk模式是可用的(如果您具有根访问权限,至少)。构建自己的ROM模块,删除导航栏和状态栏。设备是否根目录?您使用的API级别是什么?@sarme设备理想情况下没有根目录。如果它能产生最好的选择,它可能是。目标API尚未定义。(我们正在为客户构建完整的项目,我们将提供平板电脑)哈维尔,你成功了吗?因为我处于相同的情况,需要永久全屏如果用户拖动屏幕顶部,他将能够看到状态栏和按钮。我实现了您的解决方案,从屏幕顶部拖动状态栏和按钮时,会显示用户是否拖动屏幕顶部,他将能够看到状态栏和按钮。我实现了您的解决方案,从屏幕顶部拖动后,状态栏和按钮显示与上面的答案相同。如果用户拖动屏幕顶部,他会看到状态栏和按钮我认为这是设计的,当你触摸屏幕时按钮会返回,因为否则用户将无法退出应用程序,我唯一能想到的是用View.SYSTEM\u UI\u flag\u LOW\u PROFILE替换隐藏导航标志,但不确定为什么状态栏会一直返回,因为在清单中添加主题始终适用于meSame,如上所述。如果用户拖动屏幕顶部,他会看到状态栏和按钮我认为这是设计的,当你触摸屏幕时按钮会返回,因为否则用户将无法退出应用程序,我唯一能想到的是用View.SYSTEM\u UI\u flag\u LOW\u PROFILE替换隐藏导航标志,不知道为什么状态栏会一直出现,因为在清单中添加主题对meDo总是有效的你知道如何摆脱状态栏吗?这就完成了答案。您能解释一下为什么需要使用
killall-surfaceflinger
吗?@MattD
killall-surfaceflinger
是为了强制surfaceflinger重新启动并加载属性更改。否则,它只会继续使用启动时的qemu.hw.mainkeys。冲浪