fopen打开文件失败返回null,可以通过errno和strerror获取错误码和错误信息。
我遇到的是错误码1,Operation not permitted。
经过检查是Android11,分区存储,不能直接写到sdcard,后面修改为直接用app目录,就正常了
Context.getExternalFilesDir(null).getAbsolutePath(); //不需要权限/storage/emulated/0/Android/data/[appname]/files/
常见的errno错误码有以下这些:
#define EPERM 1 /* Operation not permitted */
#define ENOENT 2 /* No such file or directory */
#define ESRCH 3 /* No such process */
#define EIO 5 /* I/O error */
#define ENXIO 6 /* No such device or address */
#define E2BIG 7 /* Argument list too long */
#define ENOEXEC 8 /* Exec format error */
#define EBADF 9 /* Bad file number */
#define ECHILD 10 /* No child processes */
#include "File.h"
#include <cerrno>
#include <cstring>
#include "Log.h"
void saveYuvFile(const uint8_t* data, int width, int height, const char* filePath)
{
if (data == nullptr)
return;
FILE* fp = fopen(filePath, "w");
int errNum = 0;
if (fp == nullptr)
{
errNum = errno;
LOGE("[saveYuvFile] open fail errno = %d, reason = %s", errNum, strerror(errNum));
return;
}
size_t dataSize = width * height * 3 / 2;
fwrite(data, sizeof(uint8_t), dataSize, fp);
fclose(fp);
}