Не удается подключить плагин cordova.file для работы в гибридном приложении
У меня проблема с чтением файла из файловой системы с помощью cordova.file
плагин. Я использую следующий пример кода:
function onInitFs(fileSystem) {
console.log("filesystem loaded!");
fileSystem.root.getFile(filePath, {}, function (fileEntry) {
console.log("DirectoryEntry.getFile succeeded!");
fileEntry.file(function (file) {
console.log("FileEntry.file succeeded!");
var reader = new FileReader();
reader.onloadend = function (e) {
//file contents are in this.result
};
reader.readAsText(file);
}, console.log);
}, console.log);
}
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onInitFs, console.log);
И вот сообщение об ошибке, которое я вижу в окне вывода:
D/PluginManager( 2597): init()
E/cutils ( 915): Failed to mkdirat(/storage/sdcard/Android): Read-only file system
W/ContextImpl( 2597): Failed to ensure directory: /storage/sdcard/Android/data/io.cordova.<myappname>/files
W/System.err( 2597): java.lang.NullPointerException
W/System.err( 2597): at org.apache.cordova.file.FileUtils.getAvailableFileSystems(FileUtils.java:132)
W/System.err( 2597): at org.apache.cordova.file.FileUtils.initialize(FileUtils.java:192)
W/System.err( 2597): at org.apache.cordova.PluginEntry.createPlugin(PluginEntry.java:96)
W/System.err( 2597): at org.apache.cordova.PluginManager.startupPlugins(PluginManager.java:195)
W/System.err( 2597): at org.apache.cordova.PluginManager.init(PluginManager.java:106)
W/System.err( 2597): at org.apache.cordova.CordovaWebView.loadUrlIntoView(CordovaWebView.java:457)
W/System.err( 2597): at org.apache.cordova.CordovaWebView.loadUrlIntoView(CordovaWebView.java:444)
W/System.err( 2597): at org.apache.cordova.CordovaWebView.loadUrlIntoView(CordovaWebView.java:541)
W/System.err( 2597): at org.apache.cordova.CordovaWebView.loadUrl(CordovaWebView.java:435)
W/System.err( 2597): at org.apache.cordova.CordovaActivity.loadUrl(CordovaActivity.java:391)
W/System.err( 2597): at io.cordova.<myappname>.onCreate(ApprovalsHybrid.java:33)
W/System.err( 2597): at android.app.Activity.performCreate(Activity.java:5231)
W/System.err( 2597): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
W/System.err( 2597): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
W/System.err( 2597): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
W/System.err( 2597): at android.app.ActivityThread.access$800(ActivityThread.java:135)
W/System.err( 2597): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
W/System.err( 2597): at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err( 2597): at android.os.Looper.loop(Looper.java:136)
W/System.err( 2597): at android.app.ActivityThread.main(ActivityThread.java:5017)
W/System.err( 2597): at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err( 2597): at java.lang.reflect.Method.invoke(Method.java:515)
W/System.err( 2597): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
W/System.err( 2597): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
W/System.err( 2597): at dalvik.system.NativeStart.main(Native Method)
I/System.out( 2597): Error adding plugin org.apache.cordova.file.FileUtils.
W/Vold ( 915): Returning OperationFailed - no handler for errno 30
Я использую плагин Multi-Device Hybrid Apps для VS и эмулятора Android.
ОБНОВЛЕНИЕ 1: мой config.xml
:
<?xml version="1.0" encoding="utf-8"?>
<widget xmlns:cdv="http://cordova.apache.org/ns/1.0" xmlns:vs="http://schemas.microsoft.com/appx/2014/htmlapps" id="io.cordova.<myappname>" version="1.0.0.0" xmlns="http://www.w3.org/ns/widgets">
<name><myappname></name>
<description>
A blank project that uses Apache Cordova to help you build an app that targets multiple mobile platforms: Android, iOS, Windows, and Windows Phone.
</description>
<author href="http://cordova.io" email="dev@cordova.apache.org">
Apache Cordova Team
</author>
<content src="index.html" />
<access origin="*" />
<preference name="SplashScreen" value="screen" />
<vs:features>
<vs:feature>org.apache.cordova.globalization@0.2.8</vs:feature>
<vs:feature>org.apache.cordova.file@1.2.0</vs:feature>
</vs:features>
<vs:platformSpecificValues />
</widget>
ОБНОВЛЕНИЕ2: хорошо, я понял, что есть некоторые проблемы с cordova.file
плагин v1.2.0. Когда я переключаюсь cordova.file
Плагин версии от v1.2.0 до v1.1.0, я дошел до точки, где успех обратного вызова requestFileSystem
вызывается. Но getFile
не удается с FileNotFoundException
, Причиной тому может быть неверный относительный путь.
ОБНОВЛЕНИЕ3: исправлено некорректное использование readAsText
1 ответ
Вы передаете fileEntry
Возражать readAsText
вместо file
объект, который не будет работать. Вы должны сделать это вместо этого.
Создайте объект файла, вызвав
fileEntry.file
Пройти
file
возражать против функции, которая затем вызываетreadAsText
с переданным объектом файла. Это будет правильно читать в файле.
Вот API файла Cordova для вашей справки. Вы можете увидеть, как это делается в примере с FileReader.
Когда чтение успешно, окно вывода покажет I/chromium
сообщение с содержимым файла, которое он только что прочитал.