2

我正在构建一个将成为展览一部分的应用程序。它将显示在牢固安装的 Nexus 7 上。该应用程序具有触摸屏功能,并将显示交互式内容。

我需要能够在展示时禁用尽可能多的功能,因为我不希望公众能够访问除应用程序之外的任何内容。

我正在努力解决的主要问题是返回/主页/最近的应用程序列表按钮。我发现了一些禁用主页按钮的示例(儿童锁Android - 是否可以禁用主页按钮的点击 )但理想情况下我需要按钮不可见,因此关闭“发光”(黑色会很好)。

Nexus 7 的底部是否以某种方式受到保护,是否有其他版本的 Android 允许我这样做?Nexus 设备仅用于显示此应用程序,不需要其他功能。

任何建议都会很棒,非常感谢。

4

3 回答 3

9

在不创建自己的自定义 Android rom 来删除底部按钮的情况下,您最好的解决方案是使应用全屏显示,覆盖后退按钮,并使您的应用成为启动器以覆盖主页按钮。

AFAIK,没有办法覆盖最近的应用程序按钮。

编辑:另一种选择是拥有一个全屏应用程序,然后使用覆盖按钮的支架。(感谢 MaciejGórski 的想法)。

要使您的应用全屏显示,请将以下内容放入您的活动中onCreate()

requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

或者您也可以在清单中使应用全屏显示,这要感谢@Niels:

<application android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen">

要覆盖后退按钮,请添加此方法:

@Override
public void onBackPressed() {
    return;
}

现在主页按钮变得更加棘手,将以下内容添加到您的清单中:

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

这到你的清单下<activity>

<intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.HOME" />
            <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

并将其添加到您的清单中<application>,确保<receiver name>是您定义的完整包名称路径:

<receiver android:name="com.example.BootCompleteReceiver">
   <intent-filter>  
        <action android:name="android.intent.action.BOOT_COMPLETED" />
   </intent-filter>
</receiver>

最后,创建一个名为BootCompleteReceiver的 java 类文件,并使用以下代码:

public class BootCompleteReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    Intent startActivityIntent = new Intent(context, YourActivityName.class);
    startActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(parentActivityIntent);
  }
}

要稍后禁用您的应用程序作为主屏幕启动器,请按最近的应用程序按钮,从右侧向下滑动,点击设置,转到应用程序,然后点击右上角的三个点(垂直对齐),按“重置应用程序首选项”,然后最后按“重置应用程序”。

我认为这应该涵盖所有内容。

编辑 2我刚刚意识到/测试过,如果你让你的应用程序成为启动器,你不一定需要这个BOOT_COMPLETED意图。这意味着不需要<uses-permission>,<receiver>BootComplete.java您可以只使用<intent-filter>包含 MAIN、HOME 和 DEFAULT 属性的 。

编辑 3此处提供更多/不同信息: Home Launcher issue with Fragments after reboot

于 2013-05-20T19:57:49.430 回答
4

除上述之外,一切都很好,并确保有一个全面的答案......

AFAIK,没有办法覆盖最近的应用程序按钮。

我通过更改 onPause 应用程序行为来启动警报管理器来解决这个问题。可能有一个更优雅的解决方案,但这有效。

首先,创建重复警报管理器 setupAlarm(seconds)(此处此处的完整详细信息,注意我使用重复警报而不是一次,但认为两者都可以工作) 开始您的活动

然后更改 onPause 以设置 2 秒警报,因此每当有人选择导航栏上的最近应用程序按钮时,都会设置 2 秒“警报”以启动 mainActivity。

@Override
public void onPause() {
    setupAlarm(2);
    finish(); //optional
    super.onPause();

}

因此,通过以上方式,任何使用导航按钮或重新启动应用程序的尝试都会导致应用程序启动。因此,在我开始研究“kiosk”风格的 rom 之前,这是一个非常好的折衷方案。

于 2013-06-02T09:23:06.923 回答
0

我可能有点晚了。

但在我看来,我发现了最近应用程序按钮问题的最佳解决方案:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (&& !hasFocus) {
        // Close every kind of system dialog
        Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
        sendBroadcast(closeDialog);

        // send task back to front
        ActivityManager activityManager =
                (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
        activityManager.moveTaskToFront(getTaskId(), 0);
    }
}

“将任务发送回前面”部分将通过简单地立即发送通知栏来防止下拉通知栏,并将关闭最近的应用程序视图。另一种是在他试图关闭手机时关闭“关机/重启”视图。

现在原谅我的英语,祝你有美好的一天。

问候吉米

于 2019-06-21T23:16:54.987 回答