You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cordova.apache.org by "Joe Bowser (JIRA)" <ji...@apache.org> on 2015/06/17 21:37:19 UTC

[jira] [Resolved] (CB-9068) FileWriter.write() failure on Lollipop when no ext_sdcard present

     [ https://issues.apache.org/jira/browse/CB-9068?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Joe Bowser resolved CB-9068.
----------------------------
    Resolution: Fixed

Well, that's stupid.  Missing filesystems are represented as null, so even though the file is written, when it checks to see whether it's public, it hits an exception because the sdcard is missing.  

> FileWriter.write() failure on Lollipop when no ext_sdcard present
> -----------------------------------------------------------------
>
>                 Key: CB-9068
>                 URL: https://issues.apache.org/jira/browse/CB-9068
>             Project: Apache Cordova
>          Issue Type: Bug
>          Components: Android, Plugin File
>    Affects Versions: 5.0.0
>         Environment: Android Emulator (4.4.2, 5.0.1 and 5.1.1)
> Xperia Sola (with 4.4.4)
> Xperia Z3 Compact (5.0.2)
> ----
> Cordova 5.0.0 / 5.1.1
> cordova-android 4.0.0 / 4.0.2
>            Reporter: Tanase Butcaru
>            Assignee: Joe Bowser
>            Priority: Critical
>              Labels: file, fileWriter, writer
>
> FileWriter write method fails on android lollipop versions when no external sdcard is present.
> Simple test case:
> {code:javascript}
> function fwriteTest(){
> 		console.log("START FILE WRITE!!");
> 		console.log("CDV dataDirectory: " + cordova.file.dataDirectory);
> 		window.resolveLocalFileSystemURL(cordova.file.dataDirectory, resolveLocalFSUrlWin, resolveLocalFSUrlErr);
> 	}
> 	function resolveLocalFSUrlErr(err){ console.log("resolve FS ERR: -- " + JSON.stringify(err)); }
> 	function resolveLocalFSUrlWin(dirEntry){
> 		console.log("resolve FS WIN!!");
> 		dirEntry.getFile('fileWriter.txt', { create: true, exclusive: false }, getFileWin, getFileErr);
> 	}
> 	function getFileErr(err){ console.log("get file ERR: -- " + JSON.stringify(err)); }
> 	function getFileWin(fileEntry){
> 		console.log("get file WIN!!");
> 		fileEntry.createWriter(
> 			function(writer){
> 				writer.onwrite = function(evt){
> 					console.log("Write to file WIN!!");
> 					alert("ALL GOOD!!");
> 				};
> 				writer.onerror = function(err){
> 					console.log("Write to file FAIL: -- " + JSON.stringify(err));
> 				}
> 				writer.write("sample text goes hereee");
> 			},
> 			function(err){
> 				 console.log("create writer ERR: -- " + JSON.stringify(err)); 
> 			}
> 		);
> 	}
>        //run test!
>       fwriteTest();
> {code}
> AndroidManifest.xml contains the following permission, so it's all good here:
> {code:xml}<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />{code}
> I have two android devices, different android versions (4.4.4 and 5.0.2) and I have 3 android emulators with android 4.4.2, 5.0.1 and 5.1.1.
> I tested all environments with and without ext_sdcard (for emulators do not enter "Size" for Sd card option) and here are my results:
> {noformat}
> Android 4.4.4 with & without extSD (XPERIA Sola)
> ==================================
> LEVEL |         TAG      |       TEXT
> =======================================
> I     | chromium         | [INFO:CONSOLE(228)] "START FILE WRITE!!", source: <...>
> --------------------------------
> I     | chromium         | [INFO:CONSOLE(229)] "CDV dataDirectory: file:///data/data/cdv.filewriter.issue/files/", source: <...>
> --------------------------------
> W     | AssetFilesystem  | Asset manifest not found. Recursive copies and directory listing will be slow.
> --------------------------------
> I     | chromium         | [INFO:CONSOLE(236)] "resolve FS WIN!!", source: <...>
> --------------------------------
> I     | chromium         | [INFO:CONSOLE(243)] "get file WIN!!", source: <...>
> --------------------------------
> D     | TEST             | cdvfile://localhost/files/fileWriter.txt: 23
> --------------------------------
> I     | chromium         | [INFO:CONSOLE(248)] "Write to file WIN!!", source: <...>
> ANDROID 4.4.2 without sdcard / with sdcard (EMULATOR)
> ==========================================
> < same output as XPERIA Sola >
> ANDROID 5.0.2 without extSD (XPERIA Z3 Compact)
> ===========================
> LEVEL |         TAG      |       TEXT
> =======================================
> I     | chromium         | [INFO:CONSOLE(228)] "START FILE WRITE!!", source: <...>
> ---------------------------------------
> I     | chromium         | [INFO:CONSOLE(229)] "CDV dataDirectory: file:///data/data/cdv.filewriter.issue/files/", source: <...>
> ---------------------------------------
> W     | AssetFilesystem  | Asset manifest not found. Recursive copies and directory listing will be slow.
> ---------------------------------------
> I     | chromium         | [INFO:CONSOLE(236)] "resolve FS WIN!!", source: <...>
> ---------------------------------------
> I     | chromium         | [INFO:CONSOLE(243)] "get file WIN!!", source: <...>
> ---------------------------------------
> W     | ContextImpl      | Failed to ensure directory: /storage/sdcard1/Android/media/cdv.filewriter.issue
> ---------------------------------------
> I     | chromium         | [INFO:CONSOLE(253)] "Write to file FAIL: -- {"type":"error","bubbles":false,"cancelBubble":false,"cancelable":false,"lengthComputable":false,"loaded":0,"total":0,"target":{"fileName":"","length":23,"localURL":"cdvfile://localhost/files/fileWriter.txt","position":0,"readyState":2,"result":null,"error":{"code":6},"onwritestart":null,"onprogress":null,"onwriteend":null,"onabort":null}}", source: <...>
> ANDROID 5.0.2 with extSD
> ========================
> < same output as 4.4.4 >
> ANDROID 5.0.1 & 5.1.1  without sdcard (EMULATOR)
> =====================================
> < same output as XPERIA Z3 Compact >
> ANDROID 5.0.1 & 5.1.1  with sdcard (EMULATOR)
> ==================================
> < same output as XPERIA Sola >
> {noformat}
> All results are from LogCat console from android-sdk/tools/monitor tool.
> I use Crosswalk 12-stable version as my default webview, but I have tested all this with System-webview too and the problem persists.
> As you can see from printed error on write fail - there is a error 6 code and from what I've read [here|https://github.com/apache/cordova-plugin-file#list-of-error-codes-and-meanings] it's a _NO_MODIFICATION_ALLOWED_ERR_ error. 
> You can also replace _cordova.file.dataDirectory_ with any other path (i have tried _cacheDirectory_ and _tempDirectory_) or with a _FileSystem_ path like _LocalFileSystem.PERSISTENT_ (in this case you'll have to modify the _dirEntry.getFile_ into _dirEntry.root.getFile_ and the _resolveLocalFileSystemUrl_ with _requestFileSystem_ method and its arguments) - issue will persist!
> Am I missing some configurations/permissions or it's really a bug?
> h2. UPDATE #1
> After some more debugging time I found a possible problem.
> - on lollipop each time I try to write something to dataDirectory (or any other path), the system first checks for "/storage/sdcard1/Android/media/app.unique.id" (this is on external sdcard) - if it doesn't exist, then it will be created, otherwise nothing happens here.
> - in case the external sdcard is not present, then the FileWriter.write() will trigger the error event, *although the file will be (created and) saved on the specified path!*
> So, the issue after all is the error event that's been called and this, for me and probably others that depend on the success event, it changes the app behaviour.
> I have upgraded my Xperia Sola to unofficial lollipop and same thing happens. The Xperia Z3 Compact has the stock version on it (no root, nothing that could interfere with the system).
> Might this be a plugin issue or is lollipop related?
> h2. UPDATE #2
> I don't know if it's related, but here we go!
> _storage_ directory structure:
> - sdcard0 (internal memory)
> - sdcard1 (external sdcard) - empty if no external sdcard present.
> - emulated/0 (internal memory on Z3Compact / Nexus 4; same content as sdcard0 - symlink). From what I've searched this is for multi-user purpose & app backward compatibility.
> From cordova-plugin-file docs:
> bq. Note: If external storage can't be mounted, the _cordova.file.external*_ properties are null.
> With or without external sdcard, all the cordova.external.* paths link to sdcard0 (or emualted/0) and this happens on both kitkat and lollipop. Is it normal? I always thought that the cordova.external.* refers to directories within removable sdcard (sdcard1) and if not present then fallbacks to sdcard0...
> _Tested on real devices._
> h2. UPDATE #3
> Tested within Phonegap Developer App - everything works!



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@cordova.apache.org
For additional commands, e-mail: issues-help@cordova.apache.org