Unity3D:调用安卓摄像头拍照

该代码示例是关于在Unity3D中创建一个拍照功能,使用WebCamTexture来捕获图像。然而,当应用在安卓平台上测试时,拍照按钮无法随屏幕旋转调整位置,导致被截入照片。问题可能在于屏幕方向设置和GUI布局更新方面。
摘要由CSDN通过智能技术生成

操作步骤:创建脚步并挂载到Main Camera上

仍未解决的问题:导入到安卓平台测试时,拍照按钮不能随着屏幕旋转而变换位置;

拍照时会把拍照按钮也截进去。

using UnityEngine;
using System.Collections;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime .Serialization.Formatters.Binary;
using System.Threading;
public class TakePhotoes : MonoBehaviour
{
    public string deviceName;
    //接收返回的图片数据
    WebCamTexture tex;

    void OnGUI()
    {
        if(GUI.Button(new Rect(Screen.width/2-Screen.width/10, Screen.height-100, Screen.width/5, 100),"捕获照片"))
        {
            //捕获照片
            tex.Pause();
            StartCoroutine(getTexture());
            //重新开始
            tex.Play();
        }
        if(tex != null)
        {
            // 捕获截图大小
            GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height-100), tex); 
        }
    }

    void Start()
    {
        //调用摄像头
        StartCoroutine(StartCamera());
    }

    public IEnumerator StartCamera()
    {
        yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
        Screen.orientation = ScreenOrientation.LandscapeLeft;
        if (Application.HasUserAuthorization(UserAuthorization.WebCam))
        {
            WebCamDevice[] devices = WebCamTexture.devices;
            deviceName= devices[0].name;
            tex=new WebCamTexture(deviceName, Screen.width, Screen.height-100, 60);
            tex.Play();
        }
    }

    public IEnumerator getTexture()
    {
        yield return new WaitForEndOfFrame();
        Texture2D t=new Texture2D(Screen.width, Screen.height-100);
        t.ReadPixels(new Rect(0, 100, Screen.width, Screen.height-100), 0, 0, false);
        t.Apply();
        byte[] byt=t.EncodeToPNG();
        string path = Application.persistentDataPath;

        #if UNITY_ANDROID
            path = "/sdcard/DCIM/Camera";
        #endif
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }
        string savePath = path + "/" + Time.time + ".jpg";

        File.WriteAllBytes(savePath, byt);
        OnSaveImagesPlartform(savePath);
    }

    private void OnSaveImagesPlartform(string filePath)
    {
        #if UNITY_ANDROID && !UNITY_EDITOR
            string[] paths = new string[1];
            paths[0] = filePath; 
            using (AndroidJavaClass PlayerActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
            {
                AndroidJavaObject playerActivity = PlayerActivity.GetStatic<AndroidJavaObject>("currentActivity");
                using (AndroidJavaObject Conn = new AndroidJavaObject("android.media.MediaScannerConnection", playerActivity, null))
                {
                    Conn.CallStatic("scanFile", playerActivity, paths, null, null);
                }
            }
        #endif
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值