32

Android 2.3以下では、アプリケーションを全画面表示にしてから、false onKeyDown()を返すだけでメニュー/戻る/検索ボタンを「ハイジャック」し、アプリをデフォルトのホームランチャーアプリケーションとして登録できます。アプリケーションを終了する方法はありません。

Android 3.0(Honeycomb)では、ナビゲーションボタン(システムバー)が常に表示されているので、非表示にします。出来ますか?

参考までに、私はこのアプリケーションをAndroidマーケットで公開していません。これは、内部で使用されるデバイス用の内部アプリケーションです。デバイスを保護する必要があります。

4

11 に答える 11

31

これはパブリックAPIを使用して行うことはできないため、ルート化されたデバイスを必要とする非常に「ハックっぽい」方法でそれを行う方法を見つけました。

更新: user864555が以下に指摘しているように、これは別の解決策です

$ adb remount
$ adb shell mv /system/app/SystemUI.odex /system/app/SystemUI.odexold
$ adb shell mv /system/app/SystemUI.apk /system/app/SystemUI.apkold
$ adb reboot

「そのコードは、実際にはメニューバーであるアプリSystemUIを無効にします。その変更により、そのシステムバーのスペースも確保されます。ただし、戻るボタンなどを必ず終了してください。」

それもうまくいきます。彼の答えに投票してください。私はこれを可能な限り最新の状態に保つように努めます。


更新:これが3番目の方法です。プログラムで、またはコマンドラインを使用してそれを行う方法。ここで見つかりました:http ://android.serverbox.ch/?p = 306

この方法ではrootアクセスが必要ですが、LCD密度を変更する必要はなく、元の方法と同じままです。また、毎回再起動しなくても、UIナビゲーションバーをすばやく簡単に戻すことができます。

ブログ投稿には、Androidアプリケーションに実装する方法も示されています。ルートが必要であることを忘れないでください。アプリケーションがキオスクまたは独自のデバイスで実行されていない限り、実装するのは得策ではない可能性があります。この方法を実装しないでください。 Androidマーケットまたは一般のどこでも公開されているアプリ。

システムバーを停止/削除/無効にするには(このコマンドを発行する前にsuである必要があります):

$ service call activity 79 s16 com.android.systemui

システムバーを復元するには、次のコマンドを発行するだけです。

$ am startservice -n com.android.systemui/.SystemUIService

とても簡単です。ICSがソースコードとともにまもなくリリースされ、誰でもキオスクタブレット用のAndroidを構築できるようになることを願っています。

于 2011-05-10T20:54:01.860 に答える
11

Android3.0ではシステムバーを非表示にすることはできません。

于 2011-02-24T22:44:25.590 に答える
7

システムファイルにアクセスできる場合は、これを行うことができます(私のロックは解除され、ルート化されているため、何が必要かわかりません。工場出荷時の新しいxoomを試していません)。

adb shell
cd /system/app/
mv SystemUI.odex SystemUI.odexold
mv SystemUI.apk SystemUI.apkold
exit
adb reboot

そのコードは、実際にはメニューバーであるアプリSystemUIを無効にします。この変更により、そのシステムバーのスペースも確保されますが、アプリで終了するボタンなどがあることを確認してください。

編集:

読み取り専用ファイルに問題がある場合は、/systemディレクトリを読み取り/書き込みとしてマウントする必要があります。これを行うには、adbシェルでこのコマンドを使用します(ソース:http ://forum.xda-developers.com/showthread.php?t = 1159495&page = 5 )

mount -o remount,rw /dev/block/stl6 /system

次のコマンドを使用して、読み取り専用として再マウントできます。

mount -o remount,ro /dev/block/stl6 /system

編集:

この方法により、必要なときにソフトキーボードを通常どおりに表示できます。

于 2011-07-29T08:59:18.673 に答える
1

これが私の以前の答えに関連するコードです。ステータスバーは自動的に非表示になり、終了すると再び表示されます。重要:もう一度表示するには、コードでsystem_serverを再起動する必要があります。再起動には時間がかかり、その間にハニカム起動アニメーションが表示されます。今のところ、ステータスバーをもう一度表示するのはこれだけです。SystemUIを再起動するだけでは不十分です。そのため、system_serverを再起動するとアプリがシャットダウンします。

このコードには、スーパーユーザーがインストールされたルート化されたOSが必要です。

package com.projects;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TableLayout.LayoutParams;

// http://www.stealthcopter.com/blog/2010/01/android-requesting-root-access-in-your-app/
public class FullScreenTestActivity extends Activity implements Button.OnClickListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        try
        {
            Process p;
            p = Runtime.getRuntime().exec("su"); 

            // Attempt to write a file to a root-only
            DataOutputStream os = new DataOutputStream(p.getOutputStream());
            os.writeBytes("mount -o remount,rw /dev/block/stl6 /system\n");
            os.writeBytes("mv /system/app/SystemUI.odex /system/app/SystemUI_Old.odex\n");
            os.writeBytes("mv /system/app/SystemUI.apk /system/app/SystemUI_Old.apk\n");
            os.writeBytes("mount -o remount,ro /dev/block/stl6 /system\n");

            // Close the terminal
            os.writeBytes("exit\n");
            os.flush();
            p.waitFor();

            new AlertDialog.Builder(this)
                .setIconAttribute(android.R.attr.alertDialogIcon)
                .setMessage("Android Honeycomb StatusBar removed successfully!")
                .show();

            // Set action for exiting.
            Button cmdExit = new Button(this);
            cmdExit.setText("Exit");
            cmdExit.setOnClickListener(this);
            this.addContentView(cmdExit, new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
        }
        catch (Exception e)
        {
            ShowErrorGlobal(e);
        }
    }

    public void onClick(View v) {
        try
        {
            Process p;
            p = Runtime.getRuntime().exec("su"); 

            // Attempt to write a file to a root-only
            DataOutputStream os = new DataOutputStream(p.getOutputStream());
            os.writeBytes("mount -o remount,rw /dev/block/stl6 /system\n");
            os.writeBytes("mv /system/app/SystemUI_Old.odex /system/app/SystemUI.odex\n");
            os.writeBytes("mv /system/app/SystemUI_Old.apk /system/app/SystemUI.apk\n");
            os.writeBytes("mount -o remount,ro /dev/block/stl6 /system\n");
            String systemServerPID = GetSystemServerPID();
            if (systemServerPID != null)
                os.writeBytes("kill " + systemServerPID + "\n");
            // else ... manual reboot is required if systemServerPID fail.

            // Close the terminal
            os.writeBytes("exit\n");
            os.flush();
            p.waitFor();
        }
        catch (Exception e)
        {
            ShowErrorGlobal(e);
        }
    }

    public String GetSystemServerPID()
    {
        try
        {
            Process p = Runtime.getRuntime().exec("ps -n system_server"); 
            p.waitFor();

            BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
            reader.readLine(); // Skip header.
            return reader.readLine().substring(10, 16).trim();
        }
        catch (Exception e)
        {
            return null;
        }
    }

    protected void ShowErrorGlobal(Exception e)
    {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PrintStream stream = new PrintStream( baos );
        e.printStackTrace(stream);
        stream.flush();

        new AlertDialog.Builder(this)
            .setIconAttribute(android.R.attr.alertDialogIcon)
            .setTitle("Epic fail")
            .setMessage("Error: " + new String( baos.toByteArray() ))
            .show();
    }
}
于 2011-07-29T21:58:10.187 に答える
0

これは画面を「ロック」するという質問には答えませんが、setSystemUiVisibillity api(APIレベル11)を使用すると、ルートにならずにステータスバーを非表示にできます。

いくつかの擬似コード:

public MyActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstance) {
        //...
        final View mainView = findViewById(R.id.you_main_view_id);
        mainView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);

        //Register a listener for when the status bar is shown/hidden:
        final Context context = getApplicationContext();
        mainView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener () {
            @Override
            public void onSystemUiVisibilityChange(int visibility) {
                if ((visibility == View.SYSTEM_UI_FLAG_VISIBLE)) {
                    //Do stuff here...pause the video/game?
                } else {
                    //Do other stuff here..resume the video/game?
                }
            }
        });
    }
}

これにより、ユーザーが画面の下端に沿ってクリックするまでステータスバーが非表示になります。クリックすると、ステータスバーが表示されます(数秒後に再び非表示になります)。

マニフェストでtargetSdkVersion="11"以上を指定していることを確認してください。

于 2011-12-08T21:27:44.403 に答える
0

アプリケーションHideBarを使用して、Androidタブレット(HC、ICS、JB)のシステムバーを非表示にすることができます。タブレットを完全にロックダウンするために使用できるオプションのキオスクモードと、非表示の戻るボタンなどの他のオプションが含まれています。GPLソフトウェアです。このアプリケーションを大量にインストールする必要がある場合は、開発者(私、アプリケーションWebサイトの電子メールを参照)に連絡してください。

于 2012-07-31T10:51:01.770 に答える
0

この問題を抱えている他の人のために:

AndroidManaifest.xmlファイルでandroid:targetSdkVersionを適切に設定していない場合、setSystemUiVisibilityは効果がありません(targetSDKVersionが適切に設定されているかどうかに関係なく機能する他の高度なAPIとは異なります)。

誤ってtargetSdkVersionを8のままにしてしまいました。16までバンプすると、すぐにsetSystemUIVisiblityが目的の効果を発揮しました。

于 2012-10-08T22:07:54.713 に答える
0

はい、デバイスにルートアクセス権がある場合は実行できます。

このコードは、プロセスを強制終了して再度呼び出すことにより、StatusBarを非表示および表示できます。

package com.example.statusbar;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;

public class MainActivity extends Activity {

    String commandToExecute;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);

        commandToExecute = "/system/xbin/su";
        executeShellCommand(commandToExecute);

        Button btHideStatusBar = (Button) findViewById(R.id.buttonHide);
        Button btShowStatusBar = (Button) findViewById(R.id.buttonShow);


        btHideStatusBar.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                commandToExecute = "/system/xbin/su -c /system/bin/service call activity 42 s16 com.android.systemui";
                executeShellCommand(commandToExecute);

            }
        });

    btShowStatusBar.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {

            commandToExecute = "/system/xbin/su -c /system/bin/am startservice -n com.android.systemui/.SystemUIService";
            executeShellCommand(commandToExecute);

        }
    });

    }

    private boolean executeShellCommand(String command) {
        try {

            Runtime.getRuntime().exec(command);

            return true;
        } catch (Exception e) {
            return false;

        }
    }


}
于 2014-12-10T18:14:42.770 に答える
0

4.4以降、これを行うことができます(この質問は非常に古いですが、常にこのトピックについて出てきます):

setSystemUiVisibility(View.SYSTEM_UI_FLAG_IMMERSIVE)

https://developer.android.com/training/system-ui/immersive.html

于 2015-02-03T02:11:56.543 に答える
-1

アプリケーション全体でナビゲーションバーを非表示にする場合は、ここが最も簡単な方法です。このコードをマニフェストファイルのアプリケーションタグに書き込むだけです

> <Application
> android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" <!--
> other parameters of application tag-->
> >
于 2013-03-26T06:42:04.780 に答える
-1

android:theme = "@ android:style / Theme.Black.NoTitleBar.Fullscreen

また

mainView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE)

いいえ、タスクバーはまだあります。クラシックアイコンの代わりに3つの灰色の点があります

于 2013-03-30T01:12:54.860 に答える