如何在任务管理器中隐藏应用程序的预览?

3
我将使用Java和LibGdx制作一款游戏。
这是一个有时间限制的技巧游戏,问题在于玩家可以按Home键暂停应用程序,并进入任务管理器,可以查看应用程序的预览以寻找他需要找到的内容而不计时。

task manager

我希望当玩家按下主页按钮暂停时,能够隐藏应用程序的预览。

我的尝试

我重写了暂停和恢复处理程序。

@Override
public void pause() {
    Gdx.app.log("LibGDX", "pause");
    state = State.PAUSE;

    Gdx.graphics.setContinuousRendering(false);
    Gdx.graphics.requestRendering();
}

@Override
public void resume() {
    Gdx.app.log("LibGDX", "resume");
    state = State.RUN;
    Gdx.graphics.setContinuousRendering(true);
}

这是我的public void render(float)函数的主要部分。

    switch (state)
    {
        case RUN:
            // game
            break;
        case PAUSE:
            // a black rectangle on screen
            shapeRenderer.setProjectionMatrix(camera.combined);
            shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
            shapeRenderer.setColor(Color.BLACK);
            shapeRenderer.rect(0, 0, GameScreen.WIDTH, GameScreen.HEIGHT);
            shapeRenderer.end();
            break;
        default:
            break;
    }

日志告诉我暂停和恢复确实被调用了

但在任务管理器中,我仍然看到游戏而不是黑色矩形

更新1

回答Ridcully:

我尝试了你建议的方法

package com.mygdx.game;

import android.os.Bundle;
import android.view.WindowManager;

import com.badlogic.gdx.backends.android.AndroidApplication;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;

public class AndroidLauncher extends AndroidApplication {
    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
        // --
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
        // --
        initialize(new MyGame(), config);
    }
}

但是同样的问题,我仍然看到了截图

我使用的是Android Studio 2.1 我的手机是Oneplus One 运行的是Android 6.0.1

你有什么想法吗?谢谢

2个回答

6

这个问题有一个解决办法。你可以使用这个小方法,例如在onCreate()方法中,防止Android创建“最近活动”列表的“屏幕截图”。你可以随意开启/关闭该功能,例如只在实际游戏棋盘可见时激活它等。

/**
 * Sets/clears FLAG_SECURE which prevents system from creating screenshots for 'recent activities' list.
 * Flag should be set while user is in vault.
 *
 * @param set
 */
protected void setWindowFlagSecure(boolean set) {
    if (set) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
    } else {
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
    }

我刚刚找到了一个有关Libgdx应用程序的这个SO答案:似乎你必须在调用initialize()方法之后设置标志。

1
不要把它放在Application类中,而是放在你不想显示的Activities中。 - Ridcully
我认为我的AndroidLauncher只有一个Activity。Android应用程序可以拥有多个活动。Libgdx游戏通常只包含一个活动。游戏的不同屏幕是在libgdx中实现的,而不是作为单独的活动。原因是创建新活动也意味着创建新的OpenGL上下文,这需要时间,并且还意味着必须重新加载所有图形资源。我的项目中的其他类只有“Screen”和“Game”类。 - Monir Hadji
啊,我没有使用过Libgdx的经验,但是看起来AndroidApplication类(你的AndroidLauncher继承的类)实际上是从Activity继承的(我已经想过Application类是否有访问Window的权限)。也许Libgdx环境也会操作窗口标志。你可以尝试在onPause()方法中设置断点,并检查SECURE标志是否仍然设置--或者只需尝试在onPause()中设置该标志。 - Ridcully
是的,我是正确的 - 请查看我在答案中的编辑。 - Ridcully
感谢您的回答,我尝试在调用initialize()方法后设置标志,但像alan_derua在这个线程https://dev59.com/95Hea4cB1Zd3GeqPp3w7中所说的那样并没有起作用。我放弃了禁用屏幕保护的想法,我会用不同的方式解决我的问题。 - Monir Hadji

-2

你可以使用以下方法实现

public class SampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
            WindowManager.LayoutParams.FLAG_SECURE);

setContentView(R.layout.main);
}
}

确保在调用setContentView之前执行此操作。

1
这有什么不同于 Ridcully 的回答吗? - Bonatti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接