unity 显示、隐藏Android导航栏

1、下面的返回、home栏可用Screen.fullScreen控制

2、导航栏的显示和隐藏用下面代码控制

 private AndroidJavaObject currentActivity
    {
        get
        {
            return new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
        }
    }

    /// <summary>
    ///  隐藏上方状态栏
    /// </summary>
    public void HideStatusBar()
    {
#if UNITY_ANDROID
        currentActivity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
        {
            currentActivity.Call<AndroidJavaObject>("getWindow").Call("clearFlags", 2048);

        }));
#endif
        Debug.Log("hide status bar");
    }

    /// <summary>
    ///  显示上方状态栏
    /// </summary>
    public void ShowStatusBar()
    {
#if UNITY_ANDROID
        currentActivity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
        {
            currentActivity.Call<AndroidJavaObject>("getWindow").Call("addFlags", 2048);// WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN
        }));
#endif
        Debug.Log("show status bar");
    }

  

3、

using System.Collections;
using System.Collections.Generic;
using UnityEngine;



public class AndroidInterface
{

    private static AndroidInterface instance;
    public static AndroidInterface Instance {
        get {
            if (instance==null)
            {
                instance = new AndroidInterface();
            }
            return instance;
        }
    }
    private AndroidInterface() { }

    private AndroidJavaObject currentActivity
    {
        get
        {
            return new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
        }
    }
    
    #region
    /// <summary>
    /// 设置全面屏
    /// </summary>
    /// <param name="isSetNotchScreen"></param>
    public void SafeArea(bool isSetNotchScreen)
    {
        currentActivity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
        {
            AndroidJavaObject currentWindow = currentActivity.Call<AndroidJavaObject>("getWindow");//返回Window 

            AndroidJavaObject lp = currentWindow.Call<AndroidJavaObject>("getAttributes");//返回WindowManager.LayoutParams
            if (isSetNotchScreen)
            {
                //int WindowManager_LayoutParams_FLAG_LAYOUT_IN_OVERSCAN = 33554432;//允许窗口内容扩展到屏幕的过扫描区域(如果有)。窗口仍应正确定位其内容以考虑过扫描区域。
                int WindowManager_LayoutParams_FLAG_TRANSLUCENT_STATUS = 67108864;//有透明的状态栏和导航栏,且屏幕延伸至状态栏内部
                lp.Set("flags", WindowManager_LayoutParams_FLAG_TRANSLUCENT_STATUS);
            }
            else
            {
                int WindowManager_LayoutParams_FLAG_LAYOUT_IN_SCREEN = 256;
                lp.Set("flags", WindowManager_LayoutParams_FLAG_LAYOUT_IN_SCREEN);
            }
            currentWindow.Call("setAttributes", lp);
        }));
    }
    #endregion

    #region 标题栏
    /// <summary>
    ///  隐藏上方状态栏
    /// </summary>
    public void HideStatusBar()
    {
#if UNITY_ANDROID&&!UNITY_EDITOR 
        //currentActivity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
        //{
            //currentActivity.Call<AndroidJavaObject>("getWindow").Call("clearFlags", 2048);
        //}));
        Screen.fullScreen = true;
#endif

        Debug.Log("hide status bar");
    }

    /// <summary>
    ///  显示上方状态栏
    /// </summary>
    public void ShowStatusBar()
    {
#if UNITY_ANDROID&&!UNITY_EDITOR 
        //currentActivity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
        //{
           // currentActivity.Call<AndroidJavaObject>("getWindow").Call("addFlags", 2048);// WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN
        //}));
        Screen.fullScreen = false;
#endif
        Debug.Log("show status bar");
    }
    #endregion 标题栏

    #region 摄像头
    AndroidJavaObject androidCamera;

    AndroidJavaObject CrazyFocusPocus()
    {

        // Get activity instance (standard way, solid)
        var pl_class = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        var currentActivity = pl_class.GetStatic<AndroidJavaObject>("currentActivity");

        // Get instance of UnityPlayer (hacky but will live)
        var pl_inst = currentActivity.Get<AndroidJavaObject>("mUnityPlayer");

        // Get list of camera wrappers in UnityPlayer (very hacky, will die if D becomes C tomorrow)
        //var list = pl_inst.Get<AndroidJavaObject>("D");
        var list = pl_inst.Get<AndroidJavaObject>("m");
        Debug.Log("--------" + list);

        int x = list.Call<int>("size");
        Debug.Log("--------"+x);
        if (x == 0) return null;

        // Get the first element of list (active camera wrapper)
        var cam_holder = list.Call<AndroidJavaObject>("get", 0);

        // get camera (this is totally insane, again if "a" becomes not-"a" one day )
        var cam = cam_holder.Get<AndroidJavaObject>("a");

        //// Call my setup camera routine in Android plugin  (will set params and call autoFocus)
        //var jc = new AndroidJavaClass("org.example.ScriptBridge.JavaClass");
        //jc.CallStatic("enableAutofocus", new[] { cam });

        return cam;
    }


    public void FlashCtrl(bool isOpenFlashOfthisCamera)
    {
        ////AndroidJavaObject cameraManager = new AndroidJavaClass("android.hardware.camera2.CameraManager");
        //AndroidJavaObject Camera2Wrapper_androidClass = currentActivity.Get<AndroidJavaObject>("mUnityPlayer").Get<AndroidJavaObject>("p");
        //AndroidJavaObject a_androidClass = Camera2Wrapper_androidClass.Get<AndroidJavaObject>("b");

        //AndroidJavaObject CameraManager_androidClass = a_androidClass.GetStatic<AndroidJavaObject>("b");
        //string[] cameraName= a_androidClass.GetStatic<string[]>("c");
        //Debug.Log(CameraManager_androidClass);

        //Debug.Log(cameraName);
        //CameraManager_androidClass.Call("setTorchMode", cameraName[0], isOpenFlashOfthisCamera);

        AndroidJavaClass cameraManager = new AndroidJavaClass("android.os.IHardwareService");
        cameraManager.Call("setFlashlightEnabled",  isOpenFlashOfthisCamera);
    }


    /// <summary>
    /// 打开摄像头
    /// </summary>
    public void StartCamera(int cameraID,WebCamTexture webCamTexture)
    {
        if (androidCamera==null)
        {
            //androidCamera = new AndroidJavaClass("android.hardware.Camera").CallStatic<AndroidJavaObject>("open", cameraID);
            androidCamera = CrazyFocusPocus();
        }
        AndroidJavaObject surfaceTexture = new AndroidJavaClass("android.graphics.SurfaceTexture");
        AndroidJavaObject setPreviewTexture= androidCamera.Call<AndroidJavaObject>("setPreviewTexture", surfaceTexture);
        Debug.Log("摄像头预览");
    }

    public void StartFlash()
    {
        try
        {
            //AndroidJavaObject androidCamera = new AndroidJavaClass("android.hardware.Camera").CallStatic<AndroidJavaObject>("open");
            if (androidCamera == null)
            {
                //androidCamera = CrazyFocusPocus();
                androidCamera = new AndroidJavaClass("android.hardware.Camera").CallStatic<AndroidJavaObject>("open");
            }

            AndroidJavaObject cameraParameter = androidCamera.Call<AndroidJavaObject>("getParameters");
            cameraParameter.Call("setFlashMode", new AndroidJavaObject("java.lang.String", "torch"));
            androidCamera.Call("setParameters", cameraParameter);
            androidCamera.Call("startPreview ");

            // androidCamera.Call("release");//释放掉,不释放其他程序无法调用摄像头
            



        }
        catch (AndroidJavaException e)
        {
            Debug.LogError(e.StackTrace);
        }
        Debug.Log("打开闪光灯");
    }

    public void StopFlash()
    {
        try
        {
            AndroidJavaObject androidCamera = new AndroidJavaClass("android.hardware.Camera").CallStatic<AndroidJavaObject>("open");
            AndroidJavaObject cameraParameter = androidCamera.Call<AndroidJavaObject>("getParameters");
            cameraParameter.Call("setFlashMode", new AndroidJavaObject("java.lang.String", "off"));
            androidCamera.Call("setParameters", cameraParameter);
            androidCamera.Call("release");//释放掉,不释放其他程序无法调用摄像头
        }
        catch (AndroidJavaException e)
        {
            Debug.LogError(e.StackTrace);
        }
        Debug.Log("关闭闪光灯");
    }
    #endregion 摄像头
}

  

原文地址:https://www.cnblogs.com/Jason-c/p/10900409.html