Anna
Anna

Reputation: 11

Save .txt file on meta quest 3 from Unity

I'm developing an App (APK) for Unity for research pourpose and I need to save a .txt file (what they have written while they used the App). I think I'm stucking with Android Permissions.

The code to save the file is

using System;
using System.IO;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class LoggerQuest : MonoBehaviour
{
    public GameObject textObject1;
    private DateTime startTime;
    private DateTime sceneStartTime;


    // Start is called before the first frame update
    void Start()
    {
        string fname = System.DateTime.Now.ToString("HH-mm-ss") + ".txt";
        string path = $"/mnt/sdcard/This Headset/Oculus/{fname}";

        startTime = DateTime.Now;
        sceneStartTime = DateTime.Now;
        SceneManager.sceneLoaded += OnSceneLoaded;

        if (textObject1 != null)
        {
            Text text1 = textObject1.GetComponent<Text>();
            if (text1 != null)
                text1.RegisterDirtyVerticesCallback(() => SaveText(text1));
        }

        void OnSceneLoaded(Scene scene, LoadSceneMode mode)
        {
            DateTime sceneEndTime = DateTime.Now;
            TimeSpan sceneElapsedTime = sceneEndTime - sceneStartTime;


            using (StreamWriter writer = new StreamWriter(path, true))
            {
                writer.WriteLine("Scene Name: " + scene.name);
                writer.WriteLine("Scene Start Time: " + sceneStartTime.ToString("HH:mm:ss"));
                writer.WriteLine("Scene End Time: " + sceneEndTime.ToString("HH:mm:ss"));
                writer.WriteLine("Scene Elapsed Time: " + sceneElapsedTime.ToString());
                writer.WriteLine("-------------------------------------");
            }

            // Update the start time for the new scene
            sceneStartTime = DateTime.Now;
        }

        void OnApplicationQuit()
        {
            DateTime endTime = DateTime.Now;
            Debug.Log("Scene ended at: " + endTime.ToString("HH:mm:ss"));

            TimeSpan elapsedTime = endTime - startTime;
            TimeSpan sceneElapsedTime = endTime - sceneStartTime;

            using (StreamWriter writer = new StreamWriter(path, true))
            {
                writer.WriteLine("Start Time: " + startTime.ToString("HH:mm:ss"));
                writer.WriteLine("End Time: " + endTime.ToString("HH:mm:ss"));
                writer.WriteLine("Elapsed Time: " + elapsedTime.ToString());
                writer.WriteLine("Scene Elapsed Time: " + sceneElapsedTime.ToString());
                writer.WriteLine("-------------------------------------");
            }
        }

        void SaveText(Text textComponent)
        {
            DateTime inputTime = DateTime.Now;
            using (StreamWriter writer = new StreamWriter(path, true))
            {
                writer.WriteLine("Text Object: " + textComponent.name);
                writer.WriteLine("Text: " + textComponent.text);
                writer.WriteLine("Text Change Time: " + inputTime.ToString("HH:mm:ss"));
                writer.WriteLine("-------------------------------------");
            }
        }

        void LogInteraction(GameObject interactedObject)
        {
            DateTime interactionTime = DateTime.Now;
            using (StreamWriter writer = new StreamWriter(path, true))
            {
                writer.WriteLine("Interaction with: " + interactedObject.name);
                writer.WriteLine("Interaction Time: " + interactionTime.ToString("HH:mm:ss"));
                writer.WriteLine("-------------------------------------");
            }
        }
    }

}

and when I debug I have many times these errors:

07-19 16:42:37.876 19528 19601 E DeviceConfig: getProperties failed: Permission denial: reading from settings requires:android.permission.READ_DEVICE_CONFIG
07-19 16:42:40.018   744   744 E DeviceConfig: getProperties failed: 
07-19 16:42:40.019   759  1048 E hw-IPCThreadState: Process seems to be sending too many oneway calls.

In my AndroidManifest I have

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

Hope you can help me!

Upvotes: 1

Views: 343

Answers (1)

Guilherme Muniz
Guilherme Muniz

Reputation: 1275

Maybe too late, but If you don't need to save to this specific path, you can try "Application.dataPath" that will give you the default storage folder which does not requires any extra permission as far as I know.

This is also nice that it works with other platforms as well.

Upvotes: 0

Related Questions