【问题标题】:how to go full-screen on android with no status bar and renderMode set to direct?如何在没有状态栏且renderMode设置为direct的情况下在android上全屏显示?
【发布时间】:2015-09-22 09:36:14
【问题描述】:

我正在为零售亭构建一个 AIR->android 应用程序。我们将隐藏“状态栏”,因此应用程序是全屏的,并且没有软按钮栏(它也将使用 3rd 方应用程序锁定到信息亭模式)。

当我在隐藏状态栏的设备上发布和运行我的应用程序时,flash 阶段颜色在原始状态栏所在的位置可见。该空间应填充应用程序内容(全屏图像等),但最初包含栏的 68px 空间只是纯白色(或舞台设置的任何背景颜色)

经过大量试验和错误后,我将其归结为我在应用程序描述符 xml 中将 renderMode 设置为 direct 的事实。如果我删除它,应用内容会填满屏幕,但显然我无法访问 GPU 加速渲染系统。

我假设这与 AIR 向设备硬件询问其分辨率有关,即使实际像素数为 1920x1080,它也会返回 1920x1032。所以在引擎盖下 AIR 只是设置了一个 1920x1032 的可渲染窗口(在 renderMode>direct 时)。

有没有人知道在 renderMode>direct 中启用真正全屏的方法?

【问题讨论】:

  • 与渲染模式无关,许多 Android 设备返回不可靠的分辨率值,因此不可能指望 AIR 100% 的时间为您提供正确的分辨率值。您必须使用将使用 Metrics java 类正确返回这些值的 ANE。
  • 感谢 BotMaster,这似乎也是我在 Starling 论坛上遇到的解决方案,所以我想它是正确的。我还没有机会实现它,但有人将我指向这个 ANE github.com/mesmotronic/air-fullscreen-ane,它旨在在 android 上启用“沉浸式全屏模式”并返回正确的分辨率。无论它是否有效,我都会在这里发布。

标签: android actionscript-3 flash air starling-framework


【解决方案1】:

Android MEtrics ANE 是最简单的组合之一。这是我获取 x 分辨率的示例。如果您没有做 ANE 的经验,这可能是一个合适的开始:

@Override
public FREObject call(FREContext arg0, FREObject[] arg1)
{
    try
    {
        DisplayMetrics metrics = arg0.getActivity().getResources().getDisplayMetrics();
        int realWidth = metrics.widthPixels;
        try
        {
            Display display = arg0.getActivity().getWindowManager().getDefaultDisplay();
            display.getRealMetrics(metrics);
            int rawWidth = metrics.widthPixels;
            if(rawWidth > realWidth)
            {
                realWidth = rawWidth;
            }
        }
        catch(Exception e)
        {

        }
        try
        {
            Display display = arg0.getActivity().getWindowManager().getDefaultDisplay();
            int rawWidth = 0;
            Method getRawWidth = Display.class.getMethod("getRawWidth");
            rawWidth = (Integer) getRawWidth.invoke(display);               
            if(rawWidth > realWidth)
            {
                realWidth = rawWidth;
            }
        }
        catch(Exception e)
        {

        }           
        FREObject baseValue = FREObject.newObject(realWidth);
        return baseValue;
    }
    catch(Exception e)
    {

    }
    return null;
}

【讨论】:

    【解决方案2】:

    Scalefusion 在 Kiosk 软件中提供解决方案,支持安全和保护、远程管理和大规模部署、应用和用户管理、健康监控和诊断以及健康监控和诊断等功能。

    我们的Retail Kiosk Software 将主要基于从 DeviceAdminReceiver 和 ComponentName 继承的类。首先,我们必须告诉系统我们的应用程序正在假装成为设备管理员。我们可以通过在包含名为 android.app.device_admin 的元数据的 AndroidManifest.xml 中添加一个接收器来实现:

    <application 
    ... 
    android:testOnly="true">
    <receiver
        android:name=".MyDeviceAdminReceiver"
        android:description="@string/admin_description"
        android:label="@string/app_name"
        android:permission="android.permission.BIND_DEVICE_ADMIN">
        <meta-data
            android:name="android.app.device_admin"
            android:resource="@xml/device_admin_receiver" />
        <intent-filter>
            <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
        </intent-filter>
    </receiver>
    

    【讨论】:

      猜你喜欢
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      • 2018-12-30
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      相关资源
      最近更新 更多