• 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 摄像头
    }
    

      

  • 相关阅读:
    requests 发送请求时 保持 headers 的顺序
    python邮件测试时遇到的 u202aF和 u202a 问题
    nexus 5x 刷机指北
    idea 添加自定义模板
    ast入门 (二)
    Django 路由校验
    无法远程连接 VMware
    ubuntu安装TRex
    eclipse 创建 springboot 项目时 报json 错误
    @RestController注解下返回到jsp视图页面
  • 原文地址:https://www.cnblogs.com/Jason-c/p/10900409.html
Copyright © 2020-2023  润新知