跳至主要內容

unity中调用安卓camera函数

init-qyUnityunityC#大约 1 分钟

Unity 本身提供了WebcamDevice, WebcamTexture这样的接口来支持对物理相机的访问,但是这些接口支持获取的参数太少了,因此需要我们在Unity中调用原生的函数获取相应的参数。

环境

因为AndroidUnity版本变更很快,这里贴一下目前的环境:

  • Unity 2021.3.19f1
  • Android 12.0 API31 emulator

用法

以下代码是使用安卓CameraCharacteristics类获取可用focal_lengthsensor_info_physical_size的例子。

var player = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
var activity = player.GetStatic<AndroidJavaObject>("currentActivity");
var cameraManager = activity.Call<AndroidJavaObject>("getSystemService", "camera");
if (cameraManager != null)
{
    var CameraCharacteristics = cameraManager.Call<AndroidJavaObject>("getCameraCharacteristics", "0"); // device id

    AndroidJavaObject key_focal_lens = CameraCharacteristics.GetStatic<AndroidJavaObject>("LENS_INFO_AVAILABLE_FOCAL_LENGTHS");
    AndroidJavaObject key_sensor_size = CameraCharacteristics.GetStatic<AndroidJavaObject>("SENSOR_INFO_PHYSICAL_SIZE");
    float[] focal_lens = CameraCharacteristics.Call<float[]>("get", key_focal_lens);
    AndroidJavaObject sensor_size = CameraCharacteristics.Call<AndroidJavaObject>("get", key_sensor_size);
    float sensor_width = sensor_size.Call<float>("getWidth");
}

其中,如果是调用一个类中的方法,就使用Call,第一个参数为方法名,第二个参数可选,是传递的参数。
如果传参过程中需要用到它本来的类,比如上述代码中的Key,需要用AndroidJavaObject包装,只有一些基本类型(int, float[])可以直接传递。
如果是调用一个类中的成员(fields),则使用GetStatic,比如java中的CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS就可以用GetStatic获取。

参考