我有一个cordova应用程序是在用于android的cordova 4.3.0上开发的,我正在尝试构建ios版本。我的OS X系统上的cordova是6.0.0,我遇到了删除和重新安装4.3.0的问题,所以我试图将我的设计转移到6.0.0。在这样做时,我发现我现有的插件与6.0.0不兼容,所以我删除了它们并重新安装:
cordova-plugin-console 1.0.2 "Console"
cordova-plugin-device 1.1.1 "Device"
cordova-plugin-file 4.1.0 "File"
cordova-plugin-file-transfer 1.5.0 "File Transfer"
cordova-plugin-media 2.1.0 "Media"
此外,我被提示安装android 6.0(API 23),因为在上述更改后现有安装不再兼容。
现在我正试图让Android版本再次运行。在列出的数量太多的问题中,我的app目录(/ storage / sdcard0 / MyDir)上读取的目录返回0个文件,同时'adb shell'报告它包含9个文件(由cordova 4.3.0 build记录) )。应用程序(下面的代码)仍然能够录制音频文件(使用m_directory.getFile),并且文件出现在该目录中(根据'adb shell'),但是m_directory.readEntries找不到它们,只有那些文件在那次会议期间录制了。
如果我将目录名更改为“MyDir2”,则永远不会创建新目录(即使create = true),但媒体对象确实会创建文件/storage/sdcard0/tmprecording.3gp,然后在删除时删除它录音完成。换句话说,它可以从4.3.0将文件写入现有目录,但无法创建新目录,对于现有目录和新目录,readEntries将不包含任何未在其中创建的文件会话。
更新2015-02-07 : 我发现这个宝石埋藏在cordova docs中。转到https://cordova.apache.org/docs/en/6.0.0/cordova/plugins/pluginapis.html,单击FileSystem,其中显示“(现已解散的)目录和系统扩展”。我认为这意味着cordova已经离开了至少部分插件/ cordova-plugin-file;它仍然引用w3.org上的文档,但没有明确指出哪些部分不再起作用。它仍然允许安装插件,它仍然允许使用所有功能,但至少其中一些功能被破坏而没有警告消息,这肯定是file_system.root.getDirectory的情况。其他部分(例如,DirectoryEntry)显然已被保留。
改变在我的房子(app)下打破了基础,所以我再次开始
var dir_path = cordova.file.externalDataDirectory;
m_directory = window.resolveLocalFileSystemURL(dir_path,
on_resolve_directory_ok, on_resolve_directory_error);
应该提供目录条目“将特定于应用程序的数据文件放在外部存储”。我正在录制的音频文件出现在该目录中,但只有在应用程序运行时它们才会保留。关闭它并重新启动它会删除所有文件。它就像使用临时内存而不是持久性内存,但我不知道如何解决这个问题。
更新2015-02-08 : 看来运行“cordova run android --target nnnnnnnnnnnn”(我的手机的目标号码被遮挡)会清除目录的内容 /storage/sdcard0/Android/data/com.MyDomain.MyApp/files(与cordova.file.externalDataDirectory相同)。我认为这些文件是持久性的,但是在重新加载期间cordova所做的事情将它们删除了。如果我退出应用程序然后重新启动它(不使用“cordova run”),则文件仍然存在。如果我退出应用程序然后使用“cordova run”,文件就会消失。
“cordova run”擦除的另一件事是window.localStorage项目,这是一个真正的痛苦,因为我每次调试我的应用程序时都必须手动输入它们。 https://www.w3.org/TR/webstorage/非常清楚,不应该发生这种情况:用户代理应该出于安全原因或用户请求时,从本地存储区域过期数据。用户代理应始终避免在可访问该数据的脚本正在运行时删除数据。
我修改过的问题是:如何使用“cordova run android”而不删除cordova.file.externalDataDirectory中的所有文件以及window.localStorage中的所有设置?
旧代码(使用window.requestFileSystem(LocalFileSystem.PERSISTENT,...))。
var m_directory = null;
function on_device_ready()
{
create_directory_entry();
}
function create_directory_entry()
{
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0,
on_file_system_ok, on_file_system_error);
}
function on_file_system_ok(file_system)
{
console.log("on_file_system_ok: file_system.name " + file_system.name);
var attribs = {create: true, exclusive: false};
file_system.root.getDirectory("MyDir", attribs, on_dir_ok,
on_dir_error);
}
function on_dir_ok(dir_entry)
{
console.log("on_dir_ok: dir_entry.fullPath " + dir_entry.fullPath);
m_directory = dir_entry;
list_files(dir_entry);
}
function list_files(dir_entry)
{
var dir_reader = dir_entry.createReader();
dir_reader.readEntries(create_file_list, on_dir_read_error);
}
function create_file_list(entries)
{
console.log("create_file_list: entries.length=" + entries.length);
}
答案 0 :(得分:2)
可能与问题CB-10157有关 应用程序在安装之前卸载,清除localStorage和数据库
应用程序在安装之前总是被卸载。 这意味着localStorage和与应用程序关联的任何数据库都已清除。 这是开发依赖于在安装之间存储一些数据的应用程序的主要问题。
https://issues.apache.org/jira/browse/CB-10157
对https://issues.apache.org/jira/browse/CB-10585
的评论已修复cordova-android 5.2.0-dev
我找不到5.2.0何时发布的任何信息
cordova platform update android@5.2.0
,也不
cordova platform update android@5.2.0-dev
目前有效,所以我猜它是等待游戏或安装旧版本