ICEmobile
  1. ICEmobile
  2. MOBI-1140

BridgeIt camcorder not working on Android devices with removable storage

    Details

    • Type: New Feature New Feature
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: BridgeIt 1.0.5
    • Fix Version/s: BridgeIt 1.0.7
    • Component/s: BridgeIt
    • Labels:
      None
    • Environment:
      Android 4.4, extra SD card

      Description

      The camcorder command is not working on my Motorolla Android device. The camera and microphone commands work, but not the camcorder. Here is a suspicious stack trace:

      /jpg;base64,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
      05-29 13:47:29.640: E/ICEutil(3460): Error Opening file /storage/emulated/0/mobi.bridgeit/video.mp4
      05-29 13:47:29.640: E/ICEutil(3460): java.io.FileNotFoundException: /storage/emulated/0/mobi.bridgeit/video.mp4: open failed: ENOENT (No such file or directory)
      05-29 13:47:29.640: E/ICEutil(3460): at libcore.io.IoBridge.open(IoBridge.java:409)
      05-29 13:47:29.640: E/ICEutil(3460): at java.io.FileInputStream.<init>(FileInputStream.java:78)
      05-29 13:47:29.640: E/ICEutil(3460): at java.io.FileInputStream.<init>(FileInputStream.java:105)
      05-29 13:47:29.640: E/ICEutil(3460): at org.icemobile.client.android.util.d.submitForm(Unknown Source)
      05-29 13:47:29.640: E/ICEutil(3460): at org.icemobile.client.android.sxcore.SxCore.onActivityResult(Unknown Source)
      05-29 13:47:29.640: E/ICEutil(3460): at android.app.Activity.dispatchActivityResult(Activity.java:5446)
      05-29 13:47:29.640: E/ICEutil(3460): at android.app.ActivityThread.deliverResults(ActivityThread.java:3428)
      05-29 13:47:29.640: E/ICEutil(3460): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3475)
      05-29 13:47:29.640: E/ICEutil(3460): at android.app.ActivityThread.access$1300(ActivityThread.java:139)
      05-29 13:47:29.640: E/ICEutil(3460): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1258)
      05-29 13:47:29.640: E/ICEutil(3460): at android.os.Handler.dispatchMessage(Handler.java:102)
      05-29 13:47:29.640: E/ICEutil(3460): at android.os.Looper.loop(Looper.java:136)
      05-29 13:47:29.640: E/ICEutil(3460): at android.app.ActivityThread.main(ActivityThread.java:5086)
      05-29 13:47:29.640: E/ICEutil(3460): at java.lang.reflect.Method.invokeNative(Native Method)
      05-29 13:47:29.640: E/ICEutil(3460): at java.lang.reflect.Method.invoke(Method.java:515)
      05-29 13:47:29.640: E/ICEutil(3460): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
      05-29 13:47:29.640: E/ICEutil(3460): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
      05-29 13:47:29.640: E/ICEutil(3460): at dalvik.system.NativeStart.main(Native Method)
      05-29 13:47:29.640: E/ICEutil(3460): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
      05-29 13:47:29.640: E/ICEutil(3460): at libcore.io.Posix.open(Native Method)
      05-29 13:47:29.640: E/ICEutil(3460): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
      05-29 13:47:29.640: E/ICEutil(3460): at libcore.io.IoBridge.open(IoBridge.java:393)
      05-29 13:47:29.640: E/ICEutil(3460): ... 17 more
      05-29 13:47:29.651: D/SxCore(3460): onActivityResult completed TAKE_VIDEO_CODE

      Apparently the video is successfully recorded, the thumbnail is successfully created, but BridgeIt cannot locate the video file for the file submission to upload. It doesn't check that the file has or has not been located, but continues to try to upload, resulting in a server exception, which is then passed back to the client:

      05-29 13:47:46.160: I/chromium(2108): <head><title>504+Gateway+Time-out</title></head>
      05-29 13:47:46.160: I/chromium(2108): <body+bgcolor="white">
      05-29 13:47:46.160: I/chromium(2108): <center><h1>504+Gateway+Time-out</h1></center>
      05-29 13:47:46.160: I/chromium(2108): <hr><center>nginx/1.4.6+(Ubuntu)</center>
      05-29 13:47:46.160: I/chromium(2108): </body>
      05-29 13:47:46.160: I/chromium(2108): </html>
      05-29 13:47:46.160: I/chromium(2108): ", source: http://192.168.0.101:4000/camcorder.html (120)
      05-29 13:47:46.160: I/chromium(2108): [INFO:CONSOLE(651)] "BridgeIt Device function callback 'function onAfterVideoCapture(event) {
      05-29 13:47:46.160: I/chromium(2108): console.log('handleVideo preview: ' + event.preview);
      05-29 13:47:46.160: I/chromium(2108): if (event.preview) {
      05-29 13:47:46.160: I/chromium(2108): document.getElementById("videoThumbnail").setAttribute("src", event.preview);
      05-29 13:47:46.160: I/chromium(2108): document.getElementById("currentVideoDesc").innerHTML = "Last video taken at " + new Date();
      05-29 13:47:46.160: I/chromium(2108): }
      05-29 13:47:46.160: I/chromium(2108): console.log('handleVideo response: ' + event.response);
      05-29 13:47:46.160: I/chromium(2108): if (event.response) {
      05-29 13:47:46.160: I/chromium(2108): var cleanResponse = event.response.replace(/\+/g,'');
      05-29 13:47:46.160: I/chromium(2108): var jsonResp = JSON.parse(cleanResponse);
      05-29 13:47:46.160: I/chromium(2108): var row = document.createElement('div');
      05-29 13:47:46.160: I/chromium(2108): row.setAttribute('class','row');
      05-29 13:47:46.160: I/chromium(2108): var elem = document.getElementById('videos');
      05-29 13:47:46.160: I/chromium(2108): elem.insertBefore(row,elem.firstChild);
      05-29 13:47:46.160: I/chromium(2108): row.innerHTML = "<a class='btn ui-btn ui-shadow ui-btn-corner-all ui-btn-up-c' onclick=\"loadVideo(this,'" +
      05-29 13:47:46.160: I/chromium(2108): (jsonResp.uri || jsonResp.location ) + "');\">Load Video</a>";
      05-29 13:47:46.160: I/chromium(2108): }
      05-29 13:47:46.160: I/chromium(2108): }' failed, make sure that the callback function is in global scope.", source: http://192.168.0.101:4000/bridgeit.js (651)
      05-29 13:47:46.170: I/chromium(2108): [INFO:CONSOLE(652)] "SyntaxError: Unexpected token <
      05-29 13:47:46.170: I/chromium(2108): at Object.parse (native)
      05-29 13:47:46.170: I/chromium(2108): at onAfterVideoCapture (http://192.168.0.101:4000/camcorder.html:123:33)
      05-29 13:47:46.170: I/chromium(2108): at http://192.168.0.101:4000/bridgeit.js:648:7", source: http://192.168.0.101:4000/bridgeit.js (652)
      05-29 13:47:46.193: I/SFPerfTracer(262): triggers: (rate: 1:64) (0 sw vsyncs) (0 skipped) (36:1867135 vsyncs) (38:2649953)
      05-29 13:47:46.211: I/ActivityManager(994): START u0 {act=android.intent.action.MAIN flg=0x10000000 pkg=com.android.chrome

      I'm not seeing any issue with the camcorder on other Android devices, so far, so my hunch is that this might be due to this device having a removable SD Card where and the way we locate the video file (differently than we locate the photos or audio recordings) in VideoHandler.java.

        Activity

        Hide
        Patrick Corless added a comment -

        Is a card mounted in the external SD?

        Show
        Patrick Corless added a comment - Is a card mounted in the external SD?
        Hide
        Philip Breau added a comment -

        Yes, and if I unmount the SD Card it works ok.

        Show
        Philip Breau added a comment - Yes, and if I unmount the SD Card it works ok.
        Hide
        Patrick Corless added a comment -

        Thanks for the info. Should have test device running 4.1+ tomorrow that has a card reader. There were some permission changes in 4.1 which I'm hoping will be reproducible with the hardware. .

        Show
        Patrick Corless added a comment - Thanks for the info. Should have test device running 4.1+ tomorrow that has a card reader. There were some permission changes in 4.1 which I'm hoping will be reproducible with the hardware. .
        Hide
        Patrick Corless added a comment -

        The issue was reproducible with an Samsung s4 mini running 4.4.2. When a sd card is present there camcorder application will automatically switch over to using the card vs. internal storage. This is configurable, you can switch back to the internal storage but the default is external storage.

        When we initiate our VideoHandler a temp file is written to the mobi.bridgeit namespace on the internal storage and is later used for the upload. This is where the trouble starts as the camcorder code will write a new file to the external storage that can't be moved back to the internal storage (nor should it). On our test device the last uploaded camcorder file is re-uploaded if present but on a new install an file not found exception would occur.

        A few code tweaks have been made to insure the proper file location is stored and used for the file upload stream. The app permission READ_EXTERNAL_STORAGE has also been added as external storage permission is respected in android 4.1 and higher.

        Show
        Patrick Corless added a comment - The issue was reproducible with an Samsung s4 mini running 4.4.2. When a sd card is present there camcorder application will automatically switch over to using the card vs. internal storage. This is configurable, you can switch back to the internal storage but the default is external storage. When we initiate our VideoHandler a temp file is written to the mobi.bridgeit namespace on the internal storage and is later used for the upload. This is where the trouble starts as the camcorder code will write a new file to the external storage that can't be moved back to the internal storage (nor should it). On our test device the last uploaded camcorder file is re-uploaded if present but on a new install an file not found exception would occur. A few code tweaks have been made to insure the proper file location is stored and used for the file upload stream. The app permission READ_EXTERNAL_STORAGE has also been added as external storage permission is respected in android 4.1 and higher.
        Hide
        Patrick Corless added a comment -

        Marking as fixed.

        Show
        Patrick Corless added a comment - Marking as fixed.

          People

          • Assignee:
            Patrick Corless
            Reporter:
            Philip Breau
          • Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: