关于 Android 8.0 的录像 quota exceeded 异常

在Android 8.0中,当内置存储接近满载时,录像会出现quota exceeded异常,导致mp4文件头部数据错误。虽然/sdcard/分区显示仍有可用空间,但由于quota限制,应用程序无法正常录制。这一问题可能影响录音、拍照等操作,且用户可能困惑于为何有空间却无法使用。目前尚不清楚Android P是否已解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是个之前从没碰到过的问题, 记录一下这无语的跟踪过程 ...

两周前的某一天, 忽然一封邮件转过来, 测试那边描述手机录像在内置卡录满状态下会出问题, 录出的文件播不了;  按说, 磁盘录满根本不是个大事, Camera APK 会统计内置卡或者外置卡的剩余可用空间, 减掉个保留值设下来, 然后 MPEG4Writer 还会按这个值配个 95% 的折扣 mMaxFileSizeLimitBytes, 录像过程中会时刻比对录像的临时文件 .mp4.tmp 和这个 mMaxFileSizeLimitBytes, 随时终止录像并上报 MAX_FILESIZE_REACHED 的通知,  所以只要录像时不会有其他进程后台写文件的状况, 是肯定不会出现录像文件写失败的;  这套处理逻辑早已成熟, 直可追溯到上上届常委时期;  而且现在 google 还为了磁盘录满, 增加了 splitting 的处理, 无懈可击 ... // MAGIC1. DO NOT TOUCH.  BY 冗戈微言  http://blog.youkuaiyun.com/leonxu_sjtu/
说了那么多背景,那测试反映的到底是什么情况? 

自己试了下, 将内置卡塞到接近塞满,  此时开始录像, 录出的文件确实播不了, 体现在这 mp4 文件的 moov header 在偏移量第 0x1000 后,  全部是零数据,  仿佛写不进去:


看到 0x1000 这么整整齐齐, 很可能是文件系统的锅啊, 于是在 MPEG4Writer 代码里调用 write 的地方加了 log :// MAGIC2. DO NOT TOUCH.  BY 冗戈微言 http://blog.youkuaiyun.com/leonxu_sjtu/

size_t MPEG4Writer::write(
        const void *ptr, size_t size, size_t nmemb) {
...
    } else {
        ALOGW("mWriteMoovBoxToMemory false - write size=%lld, nmemb=%lld", (long long)size,(long long)nmemb);
        ssize_t rt;
        rt = ::write(mFd, ptr, size * nmemb);
        ALOGW("mWriteMoovBoxToMemory write rt = %lld, errno = %d-%s", (long long)rt, errno, strerror(errno));
        mOffset += bytes;
    }
    return bytes;
}


对应的 log :
01-11 06:18
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值