Android 禁用Nexus 7上的所有主页按钮和任务栏功能

Android 禁用Nexus 7上的所有主页按钮和任务栏功能,android,operating-system,nexus-7,Android,Operating System,Nexus 7,我正在构建一个应用程序,它将成为展览的一部分。它将显示在Nexus 7上,Nexus 7将牢固安装。该应用程序具有触摸屏功能,将显示交互式内容 我需要能够在显示时禁用尽可能多的功能,因为我不希望公众能够访问应用程序以外的任何内容 我最头疼的是back/home/recent应用程序列表按钮。我发现了一些禁用主页按钮(儿童锁)的示例 )但理想情况下,我需要按钮不可见,所以要关闭“发光”(黑色就可以了) Nexus7的底部部分是否受到某种保护,是否有其他版本的Android允许我这样做?Nexus设

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

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

我最头疼的是back/home/recent应用程序列表按钮。我发现了一些禁用主页按钮(儿童锁)的示例 )但理想情况下,我需要按钮不可见,所以要关闭“发光”(黑色就可以了)

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


任何建议都非常好,非常感谢。

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

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

编辑:另一个选项是使用全屏应用程序,然后使用覆盖按钮的挂载。(感谢MaciejGórski的想法)

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

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

<application android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen">
现在“主页”按钮更为棘手,请将以下内容添加到清单中:

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
若要稍后禁用作为主屏幕启动器的应用程序,请按“最近使用的应用程序”按钮,从右侧向下滑动,点击“设置”,转到“应用程序”,然后点击右上角的三个点(垂直对齐),按“重置应用程序首选项”,最后按“重置应用程序”

我认为这应该涵盖所有的事情

编辑2我刚刚实现/测试,如果您将应用程序设置为启动器,则不一定需要
启动完成
意图。这意味着不需要
BootComplete.java
。您只需使用包含MAIN、HOME和DEFAULT属性的


编辑3此处提供更多/不同的信息:

更进一步,所有这些都非常有效,并确保有一个全面的答案

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

我通过改变暂停应用程序的行为来启动alarmmanager来解决这个问题。也许有一个更优雅的解决方案,但这是可行的

首先,创建启动活动的重复alarmmanager设置alarm(秒)(完整的详细信息,注意我使用的是重复报警而不是一次性报警,但我认为两者都可以)

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

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

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

我可能会晚一点

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

@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);
    }
}
“将任务发送回前台”部分将通过立即将通知栏发送回来防止其下拉,并将关闭最近的应用程序视图。 另一个是在他试图关闭手机时关闭“关机/重启”视图

现在请原谅我的英语,祝你今天愉快

问候
吉米

按钮上的黑色管道胶带怎么样?;)出于安全原因,不能覆盖“主页”按钮。除了自定义rom之外,还有什么其他的吗SOL@tyczj你不能覆盖home按钮,但你可以使你的应用程序成为一个“启动器”,然后成为你的新“home”屏幕,并取消home按钮的正常功能。但这是可以撤销的。@MaciejGórski好主意!:)Nexus设备上的定制ROM将比其他一些设备更合理,但要想用外壳从物理上消除非法按钮的框架是相当困难的。为了保证启动的可靠性,您可能需要更换主屏幕(或者至少是启动接收器)。好的,那么定制ROM有多棘手呢?是的,我曾考虑建造一个覆盖按钮的底座,但可能很难以足够美观的方式拉动(这是一个摄影展览,应用程序将显示照片和文本中的细节)。好吧,因此我2周的java经验和动力不足的工作笔记本可能不太理想;-)代码将是伟大的。不太担心有人用足够的技术来破解它,只是想劝阻这个随意的恶作剧者和意外的下手。这将是一个干净的开箱即用的设备,因此除了应用程序之外没有其他内容需要担心。将应用程序设置为全屏也可以在清单中完成:
(我不敢相信这篇文章没有更多的投票权,这是一个真正的宝石!)@Niels谢谢你。我没有从舱单中想到全屏。我将在中编辑它,使其更完整。非常感谢。
<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>
<receiver android:name="com.example.BootCompleteReceiver">
   <intent-filter>  
        <action android:name="android.intent.action.BOOT_COMPLETED" />
   </intent-filter>
</receiver>
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);
  }
}
@Override
public void onPause() {
    setupAlarm(2);
    finish(); //optional
    super.onPause();

}
@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);
    }
}