Cordova 3.4中requestFileSystem失败并出现“Class not found”错误

4

希望有人能解决这个问题,我一整天都在与这个问题作斗争。

我正在尝试浏览文件系统中的文件夹以选择文件,但似乎无法连接到文件系统。

每当我调用“window.requestFileSystem”时,错误回调返回“未找到类”的错误。进入Cordova的“requestFileSystem”函数时,我注意到“Class not found”是在exec()调用期间返回的(我无法跟踪它)。

有没有人解决过这个问题或知道如何解决?我知道它在几个论坛上都有提到,但那里提出的解决方法对我不起作用。

就我所看到的,所有插件都在那里。使用Cordova CLI安装后,它们会出现在插件文件夹中。我确实想知道文件插件是否被加载,不确定我该如何验证它。

  • org.apache.cordova.console
  • org.apache.cordova.device
  • org.apache.cordova.file
  • org.apache.cordova.file-transfer

www/index.html

<body onload="onLoad();">
    <script type="text/javascript">
        // Init when we're good and ready.
        function onLoad(){document.addEventListener('deviceready', init, true);}

        // Init :)
        function init(){
            // window.requestFileSystem is recognized, so far so good.
            window.requestFileSystem(1, 0, function(fileSystem){
                alert('success');
            }, function(e){
                // 'e' is an object, {code: 'Class not found'}
                alert('Error accessing local file system');
            });
        }
    </script>
    <div class="app">
        <h1>Apache Cordova</h1>
        ...
    </div>

    <script type="text/javascript" src="cordova.js"></script>
</body>

config.xml

<?xml version='1.0' encoding='utf-8'?>
<widget id="com.fwd.cwptakeonsheetsv1" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    <name>CWPTakeOnSheetsV1</name>
    <description>
        A sample Apache Cordova application that responds to the deviceready event.
    </description>
    <author email="dev@cordova.apache.org" href="http://cordova.io">
        Apache Cordova Team
    </author>
    <content src="index.html" />
    <access origin="*" />



    <feature name="App">
        <param name="android-package" value="org.apache.cordova.App" />
    </feature>
    <feature name="Device">
        <param name="android-package" value="org.apache.cordova.device.Device" />
    </feature>
    <feature name="File">
        <param name="android-package" value="org.apache.cordova.file" />
        <param name="android-package" value="org.apache.cordova.file.FileUtils" />
        <param name="onload" value="true" />
        <param name="android-package" value="org.apache.cordova.FileUtils" />
    </feature>
    <feature name="FileTransfer">
        <param name="android-package" value="org.apache.cordova.filetransfer.FileTransfer" />
    </feature>
</widget>

Cordova的requestFileSystem.js
/**
 * Request a file system in which to store application data.
 * @param type  local file system type
 * @param size  indicates how much storage space, in bytes, the application expects to need
 * @param successCallback  invoked with a FileSystem object
 * @param errorCallback  invoked if error occurs retrieving file system
 */
var requestFileSystem = function(type, size, successCallback, errorCallback) {
    argscheck.checkArgs('nnFF', 'requestFileSystem', arguments);
    var fail = function(code) {
        errorCallback && errorCallback(new FileError(code));
    };

    if (type < 0) {
        fail(FileError.SYNTAX_ERR);
    } else {
        // if successful, return a FileSystem object
        var success = function(file_system) {
            if (file_system) {
                if (successCallback) {
                    // grab the name and root from the file system object
                    var result = new FileSystem(file_system.name, file_system.root);
                    successCallback(result);
                }
            }
            else {
                // no FileSystem object returned
                fail(FileError.NOT_FOUND_ERR);
            }
        };
        // The error happens in exec()
        exec(success, fail, "File", "requestFileSystem", [type, size]);
    }
};

1
你尝试过使用CLI卸载并重新安装插件吗?我只在开发自己的插件时遇到类似的消息,当时忘记在config.xml中添加<feature>。 - QuickFix
我尝试卸载并重新安装了'org.apache.cordova.file'和'org.apache.cordova.file-transfer'(重新安装成功)。但是这并没有什么区别。当我警告'FileSystem','DirectoryEntry','File'或'FileTransfer'时,它会显示正确的函数,因此我认为模块已加载。 - Nick
你在问题中放了哪个config.xml文件? <feature>行不应该出现在根config.xml中,而应该由cli platforms/android/res/xml/config.xml在安装插件时自动添加。也许你在平台的config.xml中重复了这些行? - QuickFix
啊哈,有道理。我确实把它们放在了根配置文件 config.xml 中。 - Nick
3个回答

2
我认为我找到了问题所在(至少在我的情况下)。我一直苦恼着这个问题一遍又一遍地出现:
只需打开plugins/android.json文件,并将任何条目移到“res/xml/config.xml”标题下的“config.xml”中即可解决。
我认为这是某些插件(在我的情况下,是Immersify)没有切换到新的config.xml位置的问题。修复此问题后,“缺失”的所有插件都会神奇地出现在我的platforms / android / res / xml / config.xml文件中,而“未找到类”错误也会消失。

1
你是不是指的是plugins/android.json?而且很奇怪的是,当我把“res/xml/config.xml”下的所有内容移动到“config.xml”下时,它居然能够正常工作。 - jackocnr

1

您是否检查了在插件文件夹中生成的android.json文件? 我曾经遇到过类似的问题,因为一些“尚未更新到3.4版本”的插件(例如sqlite)在此文件中生成了错误的方向(该文件在构建时使用)。这导致我从我的实际config.xml中删除了其他一些插件。


0

我最终解决了我的问题。以下是我采取的步骤使其正常工作:

  1. 将所有JavaScript移动到我的index.html的头部(包括对.js文件的引用)。

  2. config.xml中删除了所有功能标签。我的/platforms/android/AndroidManifest.xml仍然包含:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
  3. 从我的代码中删除了所有alerts()和自定义调试函数。我不知道延迟是否会导致问题,但它似乎有影响。

我还注意到,如果window.requestFileSystemundefined,那很可能是由于JavaScript错误导致其未加载。

这里有一个很好的例子here - 感谢Ram发布这个例子。

感谢@QuickFix的回复!


今天尝试了,只能明天做 :| - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接