Какая лучшая практика для этого?Я бы предположил, что установка места установки на авто идеальна, чтобы пользователи могли перемещать приложение между внутренним / внешним хранилищем.Прямо сейчас моя система сохранения работает нормально, когда в настройках 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()); }
}
}