Unity Android Saving - лучшие практики и код для внутреннего и внешнего хранилища - PullRequest
0 голосов
/ 19 сентября 2018

Какая лучшая практика для этого?Я бы предположил, что установка места установки на авто идеальна, чтобы пользователи могли перемещать приложение между внутренним / внешним хранилищем.Прямо сейчас моя система сохранения работает нормально, когда в настройках Unity Player принудительно вводит местоположение записи для внутреннего (независимо от расположения приложения).Разве это плохо, поскольку пользователи могут заполнить свое внутреннее хранилище и получить отказ в доступе на запись?Кажется плохим, поэтому я пытаюсь включить оба.

То, что я сейчас пытаюсь сделать, это использовать код API для извлечения как внутреннего, так и внешнего пути .Поэтому я могу проверить оба места для сохранения.Это возможно и надежно?Если да, то должен ли внешний доступ для записи быть частью манифеста, чтобы получить путь к внешнему хранилищу и выполнить запись в него?Имейте в виду, что мне НЕ потребуется доступ к каким-либо данным за пределами папки моего приложения.

Я нашел в Интернете некоторый код из этих источников и попытался соединить его вместе.Но это не удалось, и я не уверен, как отлаживать вещи на устройстве Android.https://answers.unity.com/questions/283823/how-can-you-save-both-internally-and-externally.html

Имейте в виду, я не уверен, что я делаю с этими вызовами Android API в Unity.Я пытаюсь установить 3 разных строки, используя другой код, несмотря на избыточность.Результатом явно была ошибка, потому что ничего не получалось, когда я собирался на устройствоВероятно, следовало включить все это в блок try.Или, может быть, мне не следует пытаться использовать этот код без включения внешнего разрешения на запись в манифест (в настройках проигрывателя).

private string androidFilesDir;
private string androidExternalFilesDir;
private string androidInternalPath;

void Awake ()
{
    StartCoroutine(AppLaunch());
}

private IEnumerator AppLaunch()
{
    yield return new WaitForSeconds(0.1f); // let scene build out

#if UNITY_ANDROID && !UNITY_EDITOR
    using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
    {
        using (AndroidJavaObject currentActivity = jc.GetStatic<AndroidJavaObject>("currentActivity"))
        {
            androidFilesDir = currentActivity.Call<AndroidJavaObject>("getFilesDir").Call<string>("getCanonicalPath");
            androidExternalFilesDir = currentActivity.Call<AndroidJavaObject>("getExternalFilesDir").Call<string>("getCanonicalPath");
        }
        // internal path
     try {
              IntPtr obj_context = AndroidJNI.FindClass("android/content/ContextWrapper");
              IntPtr method_getFilesDir = AndroidJNIHelper.GetMethodID(obj_context, "getFilesDir", "()Ljava/io/File;");

              using (AndroidJavaClass cls_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
                 using (AndroidJavaObject obj_Activity = cls_UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) {
                    IntPtr file = AndroidJNI.CallObjectMethod(obj_Activity.GetRawObject(), method_getFilesDir, new jvalue[0]);
                    IntPtr obj_file = AndroidJNI.FindClass("java/io/File");
                    IntPtr method_getAbsolutePath = AndroidJNIHelper.GetMethodID(obj_file, "getAbsolutePath", "()Ljava/lang/String;");   

                    androidInternalPath = AndroidJNI.CallStringMethod(file, method_getAbsolutePath, new jvalue[0]);                    

                 }
              }
           }
           catch(Exception e) {
              Debug.Log(e.ToString());
           }
    }
#endif




// test write-----------
    if (!string.IsNullOrEmpty(androidFilesDir))
    {
        try
        {
            string path1 = (androidFilesDir + "/jamesTestFilesDir.txt").Replace("//", "/");
            File.WriteAllText(path1, "written to: " + path1);
        }
        catch (Exception error) { Debug.Log("failed to write to androidFilesDir. " + DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString()); }
    }
    if (!string.IsNullOrEmpty(androidExternalFilesDir))
    {
        try
        {
            string path2 = (androidExternalFilesDir + "/jamesTestExtFilesDir.txt").Replace("//", "/");
            File.WriteAllText(path2, "written to: " + path2);
        }
        catch (Exception error) { Debug.Log("failed to write to androidExternalFilesDir. " + DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString()); }
    }
    if (!string.IsNullOrEmpty(androidInternalPath))
    {
        try
        {
            string path3 = (androidInternalPath + "/jamesTestInternalPath.txt").Replace("//", "/");
            File.WriteAllText(path3, "written to: " + path3);
        }
        catch (Exception error) { Debug.Log("failed to write to androidInternalPath. " + DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString()); }
    }
}
...