Androidでホームボタンやその他のシステムボタンを無効にする方法は?


80

Androidアプリケーションでホームボタンやその他のシステムボタンを無効にする必要があります。

例: MX PlayerGoogle Playを参照)-プレーヤー画面で「ロック」アイコンを押すと、すべてのハードウェアおよびソフトウェアシステムボタンがロックされます。

それはroot化なしでうまく動作します。

異なるAndroidバージョンのいくつかのデバイスでテストしました。キッズロック(プラグイン)を分解しようとしましたが、まだどのように機能するのかわかりません。

キッズロック(プラグイン)のような同じソリューションが必要ですMX Player:-ホーム、戻る、その他すべてのシステムボタンを無効にします。

助言がありますか?


1
stackoverflow.com/questions/17183905/…。ホームボタンを無効にすることはできません。
ラグナンダン2013

2
@ user1024あなたの質問に対する解決策を見つけましたか?MXPlayerと同じ機能もやりたいので。
Chirag Shah 2013

2
MXPlayerの方法はかなり興味深いものです。彼らは実際にナビゲーションバーが戻るのを抑制しています。
nhaarman 2014年

この問題の解決策を見つけたことがありますか?また、これらのボタンを無効にする方法を理解する必要があります。少なくとも、マルチタスクボタンを管理するにはどうすればよいですか。
ポートフォリオ

あなたは私の答えをチェックするかもしれません、私はあなたが望むものを達成するのに役立つと思いますstackoverflow.com/a/28603790/3300883
ミゲル

回答:


91

まず、Homeボタンやその他のボタン(Backボタンなど)を本当に無効にしたい場合は、じっくり考えてください。これは行うべきことではありません(少なくともほとんどの場合、これは悪い設計です)。 )。私は自分のことしか話せませんが、OSボタンをクリックするようなことをさせないアプリをダウンロードした場合、次に行うことはそのアプリをアンインストールして非常に悪いレビューを残すことです。また、あなたのアプリはAppStoreで紹介されないと思います。

今...

MX Player他のアプリケーションの上に描画する許可を求めていることに注意してMX Player permissions
ください。デバイスのHomeボタンを上書きできないためAndroid(少なくとも最新のOSバージョンではありません)。MX Playerアプリを「ロック」してHomeボタンをクリックすると、ランチャーの上に自分自身を描画します。
その例をもう少し簡単でわかりやすい例として見るには、FacebookMes​​sengerアプリをご覧ください。

MX PlayerStatus BarNavigation Bar「オーバーライド」についてさらに情報を提供するように求められたので、これらのトピックも含めるように回答を編集しています。

まず最初に、MX PlayerはでイマーシブフルスクリーンモードDevBytes Video)を使用していKitKatます。
Android 4.4(APIレベル19)では、setSystemUiVisibility()に新しいSYSTEM_UI_FLAG_IMMERSIVEフラグが導入され、アプリを真に「フルスクリーン」にすることができます。このフラグは、SYSTEM_UI_FLAG_HIDE_NAVIGATIONと組み合わせるとおよびSYSTEM_UI_FLAG_FULLSCREEN組み合わせるとフラグは、ナビゲーションバーやステータスバーを非表示にし、あなたのアプリが画面上のすべてのタッチイベントをキャプチャすることができます。

没入型フルスクリーンモードが有効になっている場合、アクティビティは引き続きすべてのタッチイベントを受信します。ユーザーは、システムバーが通常表示される領域に沿って内側にスワイプすることで、システムバーを表示できます。これにより、SYSTEM_UI_FLAG_HIDE_NAVIGATIONフラグ(および適用されている場合はSYSTEM_UI_FLAG_FULLSCREENフラグ)がクリアされ、システムバーが表示されます。これにより、View.OnSystemUiVisibilityChangeListenerもトリガーされます設定されている場合、。ただし、しばらくしてからシステムバーを自動的に非表示にする場合は、代わりにSYSTEM_UI_FLAG_IMMERSIVE_STICKYを使用できます。フラグを。このモードで一時的に表示されるシステムバーは一時的な状態であるため、フラグの「スティッキー」バージョンはリスナーをトリガーしないことに注意してください。

2番目:ステータスバーを非表示にする
3番目:ナビゲーションバーを非
表示にする没入型フルスクリーンの使用は専用ですがKitKat、を非表示にすることに注意してくださいStatus BarそしてNavigation BarのためだけではありませんKitKat

私は2番目と3番目について言うことはあまりありません、あなたは私が信じている考えを理解します、それはとにかく速い読みです。細心の注意を払ってくださいView.OnSystemUiVisibilityChangeListenerにください

私が意味したことを説明する要点を追加しました。それは完全ではなく、修正が必要ですが、あなたはその考えを理解するでしょう。 https://gist.github.com/Epsiloni/8303531

これを実装して頑張って、楽しんでください!


1
では、どのようにしてナビゲーションバーを非表示にし、画面に触れたときに再びポップアップするのを防ぐのでしょうか。また、スワイプ動作を実行して没入型モードを終了すると、ナビゲーションバーがすぐに表示および非表示になります。さらに、「没入型スワイプ」によってステータスバーが表示された場合でも、ロック時に通知パネルを引き出すことはできません。それはどのようにそれをしますか?
nhaarman 2014年

2
さて、これは大いに役立ちますが、私たちはまだそこにいません。2つのコメントを付けます。1つはKitKat、もう1つはJellyBeanです。キットカットのために、フラグを使用してTYPE_SYSTEM_ALERTSYSTEM_UI_FLAG_HIDE_NAVIGATIONそしてSYSTEM_UI_FLAG_IMMERSIVE_STICKY、アプリを出の方法はありません。両方のシステムバーは非表示のままです。電源メニューを開かない限り。その後、ナビゲーションバーが再び表示され、ホームボタンが機能するようになります。MXプレーヤーは、その場合には隠されたナビゲーションバーを維持するために管理しています。したがって、キットカットを実行しているデバイスの場合は、これを修正する必要があります。
nhaarman 2014年

1
Jelly Bean(16+)の場合、IMMERSIVE_STICKY機能しません。したがって、ナビゲーションバーを表示することができます(ステータスバーはのために非表示のままになりますSYSTEM_ALERT)。を使用してこれを検出しOnSystemUiVisibilityChangeListener、フラグを再度有効にすることができます。ただし、何らかの理由で、これは1秒ほど後にのみ機能します。これは、ホームボタンを押すのに十分な時間です。MX Playerは使用しませんIMMERSIVE STICKY(バーはキットカットに表示されます)が、バーは気付かないうちに再び消えます。
nhaarman 2014年


7
参考までに、一部のアプリはロックする必要があります。たとえば、所有者がハードウェアへの一時的なアクセスを許可しているキオスクタイプのアプリ。現在、フォトブースアプリを作成していますが、ユーザー(写真を撮る人)に写真を撮る以外のこと(およびその他のいくつかのこと)をさせたくありません。所有者はソフトウェアボタンを使用してロックを解除できますが、それ以外の場合はシャットダウンする必要があります。申し訳ありませんが、あなたの答えの冒頭にあるあなたの「母のアドバイス」は私を(そしてOPを含む他の人たちが)間違った方法でこすりました。答えてくれてありがとう、調べてみます。
ntgCleaner 2016

13

私はshaobin0604の答えに従い、最終的に次のように追加してHOMEボタンをロックすることができました。

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

AndroidManifest.xmlあなたがしなければならないすべてコピーするのであるHomeKeyLocker.javaからshaobinのlibプロジェクトにとのようにそれを実装shaobinの例。ところで:私のAVDのAndroidバージョンはAndroid4.0.3です。


Android 4.4.4で動作しますか?なぜなら、4.4.4で実行されているMotoGで試してみたからです。それは私にはうまくいきませんでした。
venkat 2014

1
このライブラリは、ハードホームボタンを無効にするだけです。MotoGにはソフトホームボタンがあるため、機能しません。@ venkat
Harry Sharma

アラートは最善ではないにしても良い解決策ですが、一部のデバイス(Nexus 4など)ではこれが機能せず、ホームボタンは引き続き使用できることに注意してください。
jacksOnF1re 2015

12

Android-HomeKey-Lockerを使用して、ホームキーやその他のシステムキー(戻るキーやメニューキーなど)を無効にすることができます。

これがアプリケーションで役立つことを願っています。ありがとう。


1
これはハードホームボタンを無効にするだけです... !!
ハリーシャルマ2015年

私のために完璧に働いた。私はおそらくすべての物理的なボタンを無効にしたいでしょう、実際には...私の場合はそれに当たるので、これをGoogleCardboardに使用してホームボタンを無効にします。
Matt Cruikshank 2015

最近のアプリボタンを無効にする方法
user3106818 2016年

#shaobin0604githubコードがMotorolaデバイスで機能していません。
Brajendra Pandey 2016

11

ここに記載さている画面固定機能を使用して、ホームボタンと最近のボタンAndroid5.0を無効にすることができます

Android 5.0には、ユーザーがタスクを離れたり、通知によって中断されたりするのを一時的に制限できる新しい画面固定APIが導入されています。これは、たとえば、Androidでハイステークス評価要件をサポートする教育アプリ、または単一目的またはキオスクアプリケーションを開発している場合に使用できます。アプリが画面の固定を有効にすると、アプリがモードを終了するまで、ユーザーは通知を表示したり、他のアプリにアクセスしたり、ホーム画面に戻ったりすることはできません。

デバイスをロックしてキオスクにすることができます。ナビゲーションバーは非表示ではありませんが、モードのアクティブ化方法に応じて、ホームボタンと最近のボタンを削除または無効にすることができます。この機能をテストした後、ここにいくつかの情報を書きました


6

推測ですが、SYSTEM_ALERT_WINDOW権限(「他のアプリの上に描画」として表示されます。ここを参照)があれば、アプリをフルスクリーンのシステムアラートタイプのウィンドウとして表示できる可能性があると思います。このようにすると、ホーム画面も含めて他のアプリが非表示になるため、[ホーム]を押しても、目に見える効果がないだけで、実際には無効になりませ

MX Playerにはこの許可が宣言されており、Facebook Messengerには、何にでも「チャットヘッド」を表示するための許可があります。これが解決策になる可能性があります。

更新(私のコメントから追加):次に、SYSTEM_UI_FLAG_HIDE_NAVIGATIONをタッチイベントのキャプチャ/ OnSystemUiVisibilityChangeListenerの使用と組み合わせて使用​​して、デフォルトの動作(タッチに表示されるナビゲーションバー)をオーバーライドします。また、イマーシブ終了ジェスチャが機能しないと言ったので、SYSTEM_UI_FLAG_IMMERSIVE_STICKYも設定してみてください(SYSTEM_UI_FLAG_FULLSCREENおよびSYSTEM_UI_FLAG_HIDE_NAVIGATIONを使用)。


簡単なテスト(権限の追加と呼び出し)getWindow().addFlags(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);では、ステータスバーが非表示になります(没入型フルスクリーンを終了するために使用される下へのスワイプ動作は機能しません)が、ナビゲーションバーは非表示になります。このバーのボタンは引き続き機能します。
nhaarman 2014年

現在SDKを持っていませんが、次のアイデアは、SYSTEM_UI_FLAG_HIDE_NAVIGATIONをタッチイベントのキャプチャと組み合わせて使用​​するか、OnSystemUiVisibilityChangeListenerを使用してデフォルトの動作(タッチで表示されるナビゲーションバー)をオーバーライドすることです。
molnarm 2014年

また、イマーシブ終了ジェスチャが機能しないと言ったので、SYSTEM_UI_FLAG_IMMERSIVE_STICKYも設定してみてください(SYSTEM_UI_FLAG_FULLSCREENおよびSYSTEM_UI_FLAG_HIDE_NAVIGATIONを使用)。
molnarm 2014年

4

以前はホームボタンを無効にすることができましたが、現在は無効にできません。これは、ユーザーをトラップする悪意のあるソフトウェアが原因です。

詳細については、こちらをご覧ください:Android4.0以降でホームボタンを無効にする

最後に、この他の質問でわかるように、戻るボタンを無効にすることができます:Androidで戻るボタンを無効にする


2
Nexus 4で彼が言ったようにMXプレーヤーをテストしたところ、ホームボタンが本当にロックされました= S
Pozzo Apps

戻るボタンは、設計どおりに機能するように設計されています。戻るボタンを無効にしないことをお勧めします。
ラグナンダン2013

@Raghunandan、あなたの主張を理解し、同意します。それでも、[戻る]ボタン無効にすることでき、開発者はこれを考慮に入れると信じています。彼がなんとかアプリの使いやすさを壊した場合、彼のユーザーは彼に知らせます。
Alvaro Cavalcanti 2013

MXPlayerをインストールしてテストしてみてください。HOMEボタンを無効にします。すべてのシステムボタンを無効にします。MXPlayerはKidsLock(プラグイン)を使用します。キッズロック(プラグイン)を分解しようとしましたが、まだどのように機能するのかわかりません。これが私がこの質問をする理由です。
user1024 2013

1
この回答は、mxplayerがこの機能を実装する方法を提供しないことに注意してください。
nhaarman 2014年

3

Android5.0以降をターゲットにしている場合。あなたが使用することができます:

Activity.startLockTask()

これは質問に対する答えを提供しません。著者に批評したり、説明を求めたりするには、投稿の下にコメントを残します。自分の投稿にいつでもコメントできます。十分な評判得られたら、どの投稿にもコメントできます。-レビューから
user1140237

1
@ user1140237どうしてですか?
トリラリオン2016

1
これは、デバイス管理者である場合にのみ実行できますが、通常のアプリでは実行できません
Ron

3

最初にメソッドを作成します:

public void hideNavigationBar() {
        final View decorView = this.getWindow().getDecorView();
        final int uiOptions =
                View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;

        Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                YourActivityName.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        decorView.setSystemUiVisibility(uiOptions);

                    }
                });
            }
        };

        timer.scheduleAtFixedRate(task, 1, 2);

    }

それからあなたonCreate()はあなたの活動の方法でそれを呼びます。onResume()メソッドでもう一度呼び出します。次に、次のような別のメソッドをアクティビティに追加できます。

@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        hideNavigationBar();
    }

それだけです。次回ユーザーが画面に触れるまで画面がロックされることを忘れないでください。Timerクラスでは、遅延を変更して、そのインスタンスの変更を許可します。その後、画面が再びロックされます。


2

私もしばらくの間これを探していましたが、最終的に必要に応じてそれを行うことができました。つまり、電源ボタンを長押ししても、ナビゲーションバーにアクセスできず、ステータスバーにアクセスできず、電源メニューもナビゲーションボタンも表示されません。@Assaf Gamlielのおかげで、彼の答えは私を正しい道に導いてくれました。私はこのチュートリアルに従い少し変更を加えました。タイプを指定WindowManager.LayoutParams.TYPE_SYSTEM_ERRORするときにWindowManager.LayoutParams.TYPE_PHONE、の代わりに指定しました。そうしないと、「オーバーレイ」によってシステムバーが非表示になりません。フラグ、高さ、幅などをいじって、思いどおりに動作するようにすることができます。


1

ホームボタンを無効にする方法がわかりません。私の知識がある限り、私は次のリンクを取得しました。

リンクを参照してください:- -http //developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_HOME

キーコード定数:ホームキー。このキーはフレームワークによって処理され、アプリケーションに配信されることはありません。

ただし、戻るボタンは無効にできます。次のコードがお役に立てば幸いです。

@Override
public void onBackPressed() {
    //return nothing 
    return;
}

2
問題は、MXプレーヤーの機能を具体的に模倣することです。
nhaarman 2014年

1

古いトピックを更新します。ホームボタン(物理または仮想)を押してもアクティビティが折りたたまれないようにすることができました。アクティビティonCreate()メソッドのコードは次のとおりです。

super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alarm_screen);
        context = getApplicationContext();
        int windowType;
        if (Build.VERSION.SDK_INT>=26) windowType = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
        else windowType = WindowManager.LayoutParams.TYPE_TOAST;
        final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                windowType,
                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                        | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                        | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                        | WindowManager.LayoutParams.FLAG_FULLSCREEN,
                PixelFormat.TRANSLUCENT
        );
        wm = (WindowManager) getApplicationContext()
                .getSystemService(Context.WINDOW_SERVICE);

        mTopView = (ViewGroup) getLayoutInflater().inflate(R.layout.activity_alarm_screen, null);
        getWindow().setAttributes(params);
        //Set up your views here
        testView = mTopView.findViewById(R.id.test);
        wm.addView(mTopView, params);

API 26以降では、ユーザーから画面オーバーレイ権限を取得する必要があります。Android7および8でテスト済み。


0

ICS onwordsからホームボタンを無効にすることはできませんが、次のように他のボタンを無効にすることはできます

@Override
public boolean dispatchKeyEvent(KeyEvent keyEvent){
   return true;
}

1
問題は、MXプレーヤーの機能を具体的に模倣することです。
nhaarman 2014年

0

ICS以降、つまりAndroid 4以降では、セキュリティ上の理由からHomeButtonのオーバーライドが削除され、アプリケーションがマルウェアであることが判明した場合にユーザーが終了できるようになりました。

さらに、ユーザーがアプリケーションから離れないようにすることは、あまり良い習慣ではありません。ただし、ロック画面アプリケーションを作成しているので、アクティビティをランチャーとして宣言することで、HomeButtonを押すと、アプリケーションが再起動され、そのまま残ります(ユーザーはわずかなちらつきに気付くだけです)。画面内)。

次のリンクをたどることができます。

http://dharmendra4android.blogspot.in/2012/05/override-home-button-in-android.html


問題は、MXプレーヤーの機能を具体的に模倣することです。
nhaarman 2014年

0

率直に言って、少なくとも新しいAPIレベル、つまり4.0以降ではホームボタンを無効にすることはできません。また、そうすることはお勧めできません。ただし、をオーバーライドすることで、戻るボタンをブロックできます。

public void onBackPressed() {
    // do not call super onBackPressed.
}

ホームボタンを上書きするには、たとえばタイマーを使用し、毎回メイン画面が画面であるかどうか、またはパッケージが一番上にあるかどうかを確認します(リンクが表示されると確信しています) )、フラグsingle_topを使用してアクティビティを表示します。

そうすれば、ホームボタンを押しても、アプリを一番上に表示できます。

また、そのような種類のアプリは本当に迷惑になる可能性があり、決して開発されるべきではないため、アプリに終了する方法があることを確認してください。

ハッピーコーディング。

PS:ホームボタンが押されたときにホームイベントをインターセプトすることはできません。

ウィンドウへのアタッチメソッドとキーガードメソッドで使用できますが、4.0以降のAPIレベルでは使用できません。


問題は、MXプレーヤーの機能を具体的に模倣することです。
nhaarman 2014年

@NiekHaarman、そうではありません。問題は、「ホーム、戻る、その他すべてのシステムボタンを無効にする」ことです。具体的には、MIMICではなくLIKEMXプレーヤーです。
アダム

@adamいいえ、この回答のきっかけとなった質問に私が付けた恩恵は、MXプレーヤーの機能を模倣することを特に求めていました。
nhaarman 2014

0

ローテーションを使用すると例外が発生するため、これを使用してアクティビティを修正しました。

HomeKeyLocker locker;

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

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_splash);

    locker = new HomeKeyLocker();               
    locker.lock(this);
}

@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    locker.unlock();
}

@Override
public void onConfigurationChanged(Configuration config) {
    super.onConfigurationChanged(config);
    locker.lock(this);
}

@LêQuangDuyの提案を使用する必要があります。


0

アプリケーションのためだけにタブレットをロックする必要があるアプリケーションに取り組んでいます。最初にアプリをMainLauncherとして配置し、次にAndroidViewを使用してタスクバーをロックします。最後にタブレットをブロックします。各デバイスモデルにはそれをブロックする機能があるため、複数のタブレットモデルで使用することを示す機能ではありません。

しかし、全体として、それはすべての人に有効です。コマンドを使用できます

Java.Lang.Runtime.GetRuntime().Exec("su -c sed -i '/VOLUME_UP/s/^# //g' /system/usr/keylayout/Generic.kl");

ボタンを無効にする例として。ただし、すべては、フォルダ「/ system / usr / keylayout / ...」内のシステムファイルの変更に基づいています。注:ルート化されたデバイスでのみ機能します。

まだ開発中ですが、私が試しているもう1つの方法は、StreamWriteとStreamReaderを使用してRootDirectoryにアクセスし、ファイル全体を書き換えてボタンを無効または有効にすることです。

お役に立てれば。

そして、どんな質問も利用可能なままです。


0

ルート化された(またはカスタムROM) Androidデバイスのソフトナビゲーション完全に削除したい人は、build.prop、システムフォルダー内のテキストファイルをます。

次の変数/値を設定します。

gemu.hw.mainkeys=1

これは、ベンダーが物理的なボタンがある場合にソフトナビゲーションを無効にするために使用するものです。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.