简体   繁体   中英

The IEnumerator with voice command function

I have a project where I use only voice command to perform some different function and one of them is to take a photo using Hololens. So I use the StartCoroutine(photoshoot()); function to call the IEnumerator photoshoot() . The IEnumerator photoshoot() call the TakePhotosnap(); .

It takes the photo perfectly but I have issue after taking the photo it doesn't go back to IEnumerator .

It stops the code and can't perform any other function.


As you can see in my code ( I put some numbers to help me explain the function )

I call StartCoroutine(photoshoot()); line 11 and in IEnumerator photoshoot() called the TakePhotosnap(); line 12 and it performs taking photo till line 13 Debug.Log("we finish taking photo successfully "); and then stop. It should go to line 14 in IEnumerator photoshoot() .

Here is some of my code

private void Takephoto()

{

// this function is to call to take a photo and save it in a special folder

Debug.Log("Take Photo function call is started");

11 StartCoroutine(photoshoot());

Debug.Log("Take Photo for Hololens");

}

IEnumerator photoshoot()

{

Debug.Log(" The taking photo coroutine is started ");

yield return new WaitForEndOfFrame();

Debug.Log("Take Photo");

12 TakePhotosnap();

14 Debug.Log("Finish taking Hi again ");

yield return new WaitForEndOfFrame();

GameObject.Find("Cube").transform.localPosition = new Vector3(Random.Range(-1, 1), 0, Random.Range(1, 3));

GameObject.Find("Cube").SetActive(true);

}

--------------------------------------------

private void TakePhotosnap()

{

Debug.Log("TakePhoto Call StartPhotoModeAsync () method to start the photo mode");

Debug.Log("snap pic taken");

PhotoCapture.CreateAsync(false, OnPhotoCaptureCreated);

}

void OnPhotoCaptureCreated(PhotoCapture captureObject)

{

//Store objects, configure shooting parameters and start shooting mode.

Debug.Log("Start taking photo calling function");

photoCaptureObject = captureObject;

Debug.Log("set camera parameters");

Resolution cameraResolution = PhotoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();

CameraParameters c = new CameraParameters();

/// c= CameraParameters

c.hologramOpacity = 1.0f;

c.cameraResolutionWidth = cameraResolution.width;

c.cameraResolutionHeight = cameraResolution.height;

c.pixelFormat = CapturePixelFormat.BGRA32;

Debug.Log("camera parameters finish");

captureObject.StartPhotoModeAsync(c, OnPhotoModeStarted);

}

private void OnPhotoModeStarted(PhotoCapture.PhotoCaptureResult result)

{

if (result.success)

{

//string filename = string.Format(@"CapturedImage{0}_n.jpg", Time.time);

string filename = string.Format(@"alc.jpg", Time.time);

Debug.Log("FileName: =" + filename);

string filePath = System.IO.Path.Combine(Application.persistentDataPath, filename);

Debug.Log("filePath: =" + filePath);

/////

string targetPath = @"C: \Users\ABC\Pictures\Camera Roll";

string destFile = System.IO.Path.Combine(targetPath, filename);

Debug.Log("destFile: =" + destFile);

if (!System.IO.File.Exists(filePath))

{

//System.IO.File.Create(filePath);

System.IO.File.Create(filePath).Dispose();

}

// https://blog.csdn.net/Lee_gc/java/article/details/79919042

Debug.Log("filePath filePath: =" + filePath);

string filePath2 = System.IO.Path.Combine(Application.dataPath, filename);

Debug.Log("filePath2: =" + filePath2);

Debug.Log("finish to set photo file path and name");

//photoCaptureObject.TakePhotoAsync(filePath, PhotoCaptureFileOutputFormat.JPG, OnCapturedPhotoToDisk);

Debug.LogError("Saved That Image Somewhere" + "FileName: =" + filename + " FilePath: = " + filePath + " FilePath2: = " + filePath2);

Debug.Log("finish to copy photo to new directory");

Debug.Log("finish photo");

photoCaptureObject.TakePhotoAsync(filePath, PhotoCaptureFileOutputFormat.JPG, OnCapturedPhotoToDisk);

13 Debug.Log("we finish taking photo successfuly ");

}

else

{

Debug.LogError("Unable to start photo mode!");

}

}

// clean up

void OnStoppedPhotoMode(PhotoCapture.PhotoCaptureResult result)

{

Debug.Log("result=" + result);

photoCaptureObject.Dispose();

photoCaptureObject = null;

}

void OnCapturedPhotoToDisk(PhotoCapture.PhotoCaptureResult result)

{

if (result.success)

{

Debug.Log("Saved Photo to disk!");

photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoMode);

}

else

{

Debug.Log("Failed to save Photo to disk");

}

}

}

What is wrong with my code? Is there any other way to solve it?

In fact, code 14 runs earlier than you think. In TakePhotosnap function, when the asynchronous method PhotoCapture.CreateAsync() is run to, this method will return control to the calling method, and then "Finish taking Hi again" will be output Immediately. In addition, also because of the asynchronous, code 13 will be output before any result returned from TakePhotoAsync method, so it does not mark the photo was taken successfully.

Therefore, we recommend that you add breakpoints to your code to determine whether code 14 is executed, and try to move the log statement to callback. For example:

photoCaptureObject.TakePhotoAsync(filePath, PhotoCaptureFileOutputFormat.JPG, OnCapturedPhotoToDisk);

Debug.Log("we finish taking photo successfuly ");

=>

photoCaptureObject.TakePhotoAsync(filePath, PhotoCaptureFileOutputFormat.JPG, OnCapturedPhotoToDisk);


void OnCapturedPhotoToDisk(PhotoCapture.PhotoCaptureResult result)

{
    if (result.success)

    {

        Debug.Log("we finish taking photo successfuly ");

    }
}

Besides, this doc is worth reading through for you: Asynchronous programming with async and await

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM