web-dev-qa-db-ja.com

Androidでホームおよびその他のシステムボタンを無効にする方法

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

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

ルーティングなしで正常に動作します。

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

MX PlayerにはKids Lock(プラグイン)のような同じソリューションが必要です:-Home、Back、その他すべてのシステムボタンを無効にします。

助言がありますか?

76
user1024

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

今...

MX Playerは、他のアプリケーションの上に描画する許可を求めていることに注意してください。MX Player permissions
HomeデバイスのAndroidボタンを上書きできないため(少なくとも最新のOSバージョンでは無効です)。アプリを「ロック」し、Homeボタンをクリックすると、MX Playerがランチャーの上に表示されます。
もう少しシンプルでわかりやすい例は、 Facebook Messenger App をご覧ください。

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

まず最初に、MX PlayerはKitKat没入型フルスクリーンモード (- DevBytes Video )を使用しています。
Android 4.4(APIレベル19)では、新しい SYSTEM_UI_FLAG_IMMERSIVEsetSystemUiVisibility() のフラグが導入され、アプリを真に「フルスクリーン」にできます。このフラグを 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 BarNavigation Barを非表示にすることはKitKatだけではないことに注意してください。

私は2番目と3番目についてあまり話すことはありません、あなたは私が信じているアイデアを得る、それはどんな場合でも速い読みだ。 View.OnSystemUiVisibilityChangeListener に細心の注意を払ってください。

意味を説明するGistを追加しました。完全ではなく、修正が必要ですが、アイデアは得られます。 https://Gist.github.com/Epsiloni/8303531

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

88
Assaf Gamliel

shaobin0604's answer に従い、最終的にHOMEボタンをロックすることに成功しました:

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

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

12
Lê Quang Duy

Android-HomeKey-Locker を使用して、ホームキーおよびその他のシステムキー(バックキーやメニューキーなど)を無効にできます。

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

11
shaobin0604

前述の画面のピン留め機能を使用して、ホームと最近ボタンAndroid 5.0を無効にできます here

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

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

10
tagy22

ただの推測ですが、 SYSTEM_ALERT_WINDOW パーミッション(「他のアプリの上に描画」として表示、 ここ を参照)で可能だと思います。 システムアラートタイプ ウィンドウ。このように、ホーム画面を含め、他のアプリを非表示にします。したがって、ホームを押しても、目に見える効果がなければ、本当に無効になりません。

MX Playerにはこの許可が宣言されており、Facebook Messengerにも「 chat heads 」を表示するための許可があります。

更新(コメントから追加):次に、SYSTEM_UI_FLAG_HIDE_NAVIGATIONをタッチイベントのキャプチャと併用するか、OnSystemUiVisibilityChangeListenerを使用してデフォルトの動作をオーバーライドします(タッチ時に表示されるnavbar) 。また、イマーシブジェスチャの終了が機能しないと述べたため、SYSTEM_UI_FLAG_IMMERSIVE_STICKYも設定してみてください(SYSTEM_UI_FLAG_FULLSCREENおよびSYSTEM_UI_FLAG_HIDE_NAVIGATIONを使用)。

6
molnarm

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

詳細はこちらをご覧ください: Android 4.0+のホームボタンを無効にする

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

4

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

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クラスでは遅延を変更でき、そのインスタンスの事柄を変更できます。その後、画面を再度ロックします。

3

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

2
aravindsagar

Android 5.0以降を対象とする場合。次を使用できます。

Activity.startLockTask()
2
lowolfne

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

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

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

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

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

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

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

を探している方は、ルート化された(またはカスタムROM)のソフトナビゲーションを完全に削除してください Androidデバイスの場合、システムフォルダー内のbuild.propテキストファイルを変更できます。

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

gemu.hw.mainkeys=1

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

0
Le-roy Staines

古いトピックを更新します。ホームボタン(物理または仮想)を押してもアクティビティがフォールドしないようにすることができました。アクティビティ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以降では、ユーザーからスクリーンオーバーレイのアクセス許可を取得する必要があります。 Android 7および8でテスト済み。

0
Dmitri Borohhov

私は、アプリケーションのためだけにタブレットをロックする必要があるアプリケーションに取り組んでいます。まず、アプリを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にアクセスし、ファイル全体を書き換えてボタンを無効または有効にすることです。

お役に立てれば。

そして、質問は引き続き利用可能です。

回転を使用すると例外が発生するため、これを使用してアクティビティを修正しました。

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êQuang Duyの提案を使用する必要があります。

0
Oscar Romero

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

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

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

そうすれば、ホームボタンが押された場合でも、アプリをトップに表示できます。

また、この種のアプリは本当に煩わしく、開発すべきではないため、アプリを終了する方法があることを確認してください。

ハッピーコーディング。

追伸:ホームボタンが押された場合、ホームイベントを傍受することはできません。

On attach on windowメソッドとkeyguardメソッドを使用できますが、4.0以降のAPIレベルでは使用できません。

Post ICSすなわちAndroid 4+、セキュリティ上の理由からHomeButtonのオーバーライドは削除され、アプリケーションがマルウェアであることが判明した場合にユーザー出口を有効にします。

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

次のリンクを使用できます。

http://dharmendra4Android.blogspot.in/2012/05/override-home-button-in-Android.html

0