【问题标题】:How turn On/Off android flashlight using C# only in Unity3d如何仅在 Unity3d 中使用 C# 打开/关闭 android 手电筒
【发布时间】:2019-07-03 20:24:14
【问题描述】:

有人知道如何仅在 Unity 中使用 C# 打开/关闭 Android 手电筒吗? 我不喜欢插件,也不想自己做一个。为什么要使用纯 C# 让我的设备打开或关闭手电筒?

我尝试将此脚本添加到主摄像头,但没有成功:(

private bool Active;
private AndroidJavaObject camera1;

void FL_Start()
{
    AndroidJavaClass cameraClass = new AndroidJavaClass("android.hardware.Camera");       
    WebCamDevice[] devices = WebCamTexture.devices;

    int camID = 0;
    camera1 = cameraClass.CallStatic<AndroidJavaObject>("open", camID);

    if (camera1 != null)
    {
        AndroidJavaObject cameraParameters = camera1.Call<AndroidJavaObject>("getParameters");
        cameraParameters.Call("setFlashMode", "torch");
        camera1.Call("setParameters", cameraParameters);
        Active = true;
    }
    else
    {
        Debug.LogError("[CameraParametersAndroid] Camera not available");
    }

}

void OnDestroy()
{
    FL_Stop();
}

void FL_Stop()
{

    if (camera1 != null)
    {
        camera1.Call("stopPreview");
        camera1.Call("release");
        Active = false;
    }
    else
    {
        Debug.LogError("[CameraParametersAndroid] Camera not available");
    }

}

void OnGUI()
{
    GUILayout.BeginArea(new Rect(Screen.width * 0.1f, Screen.height * 0.1f, Screen.width * 0.3f, Screen.height * 0.1f));
    if (!Active)
    {
        if (GUILayout.Button("ENABLE FLASHLIGHT"))
            FL_Start();
    }
    else
    {
        if (GUILayout.Button("DISABLE FLASHLIGHT"))
            FL_Stop();
    }
    GUILayout.EndArea();
}

【问题讨论】:

  • 您是否将此脚本附加到某个游戏对象?
  • 是的……主摄像头。
  • 但这适用于我的 htc 设备!
  • 对你来说很有趣,在我的 Galaxsy S5 上它不起作用。我收到一条错误消息,提示我的设备无法连接到相机服务。

标签: c# android unity3d


【解决方案1】:

较新的三星手机对代码非常挑剔。

您需要使用camera1.Call("startPreview"); 如下图;

if (camera1 != null)
    {
     AndroidJavaObject cameraParameters = camera1.Call<AndroidJavaObject>("getParameters");
     cameraParameters.Call("setFlashMode", "torch");
     camera1.Call("setParameters", cameraParameters);
     ///FIX///// 
     camera1.Call("startPreview");
     Active = true;
    }

【讨论】:

  • 非常感谢!我在 StackOverFlow 上看到的最酷的答案之一。此代码适用于所有设备还是仅适用于三星设备?
【解决方案2】:

您可以查看 Camera Capture Kit (https://www.assetstore.unity3d.com/en/#!/content/56673) 的 Android 插件源 - 我知道您说过您不喜欢插件,但是有了这个源,您可以使用该源并让您了解发生了什么调整。关于您的问题,并非所有手机都具有 Torch 功能,因此您应该检查一下吗?也许您应该使用统一本身正在使用的引用?

【讨论】:

    【解决方案3】:
    AndroidJavaObject camera=null;
    AndroidJavaObject cameraParameters=null;
    
    void ToggleAndroidFlashlight()
    {
    
        if (camera == null)
        {
            AndroidJavaClass cameraClass = new AndroidJavaClass("android.hardware.Camera"); 
            camera = cameraClass.CallStatic<AndroidJavaObject>("open", 0); 
            if (camera != null)
            {
                cameraParameters = camera.Call<AndroidJavaObject>("getParameters");
                cameraParameters.Call("setFlashMode","torch"); 
                camera.Call("setParameters",cameraParameters); 
            }       
        }
        else
        {
            cameraParameters = camera.Call<AndroidJavaObject>("getParameters");
            string flashmode = cameraParameters.Call<string>("getFlashMode");
            if(flashmode!="torch")
                cameraParameters.Call("setFlashMode","torch"); 
            else
                cameraParameters.Call("setFlashMode","off"); 
    
            camera.Call("setParameters",cameraParameters); 
        }
    }
    
    void ReleaseAndroidJavaObjects()
    {
        if (camera != null)
        {
            camera.Call("release");
            camera = null;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 2020-06-04
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      相关资源
      最近更新 更多