android - 将 cordova writeFile 用于 20MB 的 blob 崩溃 (Android)

标签 android cordova blob ngcordova

我正在尝试将 20MB 的 blob 写入 Android 设备上的文件。此代码适用于 4-5MB 左右,但对于更大的文件会崩溃。

tp = cordova.file.dataDirectory;//对于安卓 $cordovaFile.writeFile(tp, "temp-file.gif", blob,true);

有没有办法处理更大的 Blob ?谢谢。我已经在 list 中有 android:largeHeap="true"

logcat 错误:

E/JavaBinder(  809): !!! FAILED BINDER TRANSACTION !!!
I/art     (  809): Background sticky concurrent mark sweep GC freed 62202(4MB) AllocSpace objects, 96(3MB) LOS objects, 20% free, 25MB/31MB, paused 20.488ms total 176.243ms
E/JavaBinder(  809): !!! FAILED BINDER TRANSACTION !!!
W/ActivityManager(  809): Exception thrown during pause
W/ActivityManager(  809): android.os.TransactionTooLargeException
W/ActivityManager(  809):   at android.os.BinderProxy.transactNative(Native Method)
W/ActivityManager(  809):   at android.os.BinderProxy.transact(Binder.java:496)
W/ActivityManager(  809):   at android.app.ApplicationThreadProxy.schedulePauseActivity(ApplicationThreadNative.java:711)
W/ActivityManager(  809):   at com.android.server.am.ActivityStack.startPausingLocked(ActivityStack.java:829)
W/ActivityManager(  809):   at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:2749)
W/ActivityManager(  809):   at com.android.server.am.ActivityStack.finishTopRunningActivityLocked(ActivityStack.java:2606)
W/ActivityManager(  809):   at com.android.server.am.ActivityStackSupervisor.finishTopRunningActivityLocked(ActivityStackSupervisor.java:2544)
W/ActivityManager(  809):   at com.android.server.am.ActivityManagerService.handleAppCrashLocked(ActivityManagerService.java:11721)
W/ActivityManager(  809):   at com.android.server.am.ActivityManagerService.makeAppCrashingLocked(ActivityManagerService.java:11618)
W/ActivityManager(  809):   at com.android.server.am.ActivityManagerService.crashApplication(ActivityManagerService.java:12330)
W/ActivityManager(  809):   at com.android.server.am.ActivityManagerService.handleApplicationCrashInner(ActivityManagerService.java:11819)
W/ActivityManager(  809):   at com.android.server.am.NativeCrashListener$NativeCrashReporter.run(NativeCrashListener.java:86)

最佳答案

实验后的解决方案是将写入分成 block - 这似乎适用于我目前测试过的 20-30MB 文件。

    function writeFile2( path, file, blob, isAppend)
    {
        var csize = 4 * 1024 * 1024; // 4MB
        var d = $q.defer();
        NVRDataModel.debug ("Inside writeFile2 with blob size="+blob.size);

        // nothing more to write, so all good?
        if (!blob.size)
        {
            NVRDataModel.debug ("writeFile2 all done");
            d.resolve(true);
            return $q.resolve(true); 
        }


        if (!isAppend)
           {
               // return the delegated promise, even if it fails
               return $cordovaFile.writeFile(path, file, blob.slice(0,csize), true)
                   .then (function (succ) {
                       return writeFile2(path,file,blob.slice(csize),true);
                   });
           }
           else
           {
               // return the delegated promise, even if it fails
               return $cordovaFile.writeExistingFile(path, file, blob.slice(0,csize))
                   .then (function (succ) {
                       return writeFile2(path,file,blob.slice(csize),true);
                   });   
           }


    }

来源:@Andre Werlang 在这里帮助我:https://stackoverflow.com/a/40935231/1361529

关于android - 将 cordova writeFile 用于 20MB 的 blob 崩溃 (Android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40914978/

相关文章:

android - 如何在android中以两位数格式获取日期选择器月份字段

oracle - 我想在oracle中手动将ASCII流插入到BLOB类型的列中

mysql - MySQL 的 BLOB 列中可以放入的最大数据长度是多少?

android - android的wifi覆盖范围限制

android - 如何仅从 WebViewClient 的新 onReceivedError 中的主页检测错误

android - javax.net.ssl.sslpeerunverifiedexception 没有对等证书

android - 使用 cordova 媒体插件录制音频会生成空文件

javascript - 无法让 jQuery 在 Visual Studio 2015 中的 Blank Cordova 应用程序的 index.js 中工作

ios ui 与 android 和浏览器 ionic 不同

mysql - 使用vb检索数据库mysql中的图像