Android 10.0以上创建文件失败,找不到文件目录

项目场景:

如果你的app下的build.gradle设置了compileSdkVersion 30,且targetSdkVersion 30。你测试手机刚好是Android 11的。如果文件根目录还是Environment.getExternalStorageDirectory()就会创建失败。

log错误提示:

E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/Starwberry/img/local_sendpic_temp.jpg: open failed: ENOENT (No such file or directory)

不用去看是否是读写权限问题,Android 11根本没有这目录了


解决方案:

方式一:把compileSdkVersion和targetSdkVersion降到29以下(我没测,理论上可以)

方式二:加版本判断获取根目录

public static String getSDPath(Context context) {
    File sdDir = null;
    boolean sdCardExist = Environment.getExternalStorageState().equals(
            Environment.MEDIA_MOUNTED);// 判断sd卡是否存在
    if (sdCardExist) {
        if (Build.VERSION.SDK_INT>=29){
            //Android10之后
            sdDir = context.getExternalFilesDir(null);
        }else {
            sdDir = Environment.getExternalStorageDirectory();// 获取SD卡根目录
        }
    } else {
        sdDir = Environment.getRootDirectory();// 获取跟目录
    }
    return sdDir.toString();
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
从pdfium 10.0版本开始,pdfium库不再支持打印功能,因此如果需要在c++中使用pdfium库将pdf文件发送到打印机打印,你需要选择pdfium 9.0版本或更早的版本。 以下是一个使用pdfium 9.0版本实现pdf打印的示例代码: ```c++ #include <windows.h> #include "fpdfview.h" #include "fpdf_print.h" int main() { // 加载PDF文件 FPDF_DOCUMENT doc = FPDF_LoadDocument("test.pdf", nullptr); if (!doc) { printf("Failed to load PDF file!\n"); return -1; } // 获取打印机信息 PRINTER_INFO_2 printerInfo; ZeroMemory(&printerInfo, sizeof(printerInfo)); printerInfo.pPrinterName = L"Printer Name"; DWORD dwNeeded = 0; if (!GetPrinter(nullptr, 2, (LPBYTE)&printerInfo, 0, &dwNeeded)) { printf("Failed to get printer information!\n"); FPDF_CloseDocument(doc); return -1; } // 创建打印作业 HDC printerDC = CreateDC(nullptr, printerInfo.pDriverName, printerInfo.pPrinterName, nullptr); if (!printerDC) { printf("Failed to create printer DC!\n"); FPDF_CloseDocument(doc); return -1; } DOCINFO docInfo; ZeroMemory(&docInfo, sizeof(docInfo)); docInfo.cbSize = sizeof(docInfo); docInfo.lpszDocName = L"PDF Print Job"; StartDoc(printerDC, &docInfo); StartPage(printerDC); // 设置打印机属性 int pageCount = FPDF_GetPageCount(doc); DEVMODE devMode; ZeroMemory(&devMode, sizeof(devMode)); devMode.dmSize = sizeof(devMode); devMode.dmFields = DM_COPIES | DM_ORIENTATION | DM_PAPERSIZE; devMode.dmCopies = 1; devMode.dmOrientation = DMORIENT_PORTRAIT; devMode.dmPaperSize = DMPAPER_A4; ResetDC(printerDC, &devMode); // 逐页打印 for (int i = 0; i < pageCount; i++) { FPDF_PAGE page = FPDF_LoadPage(doc, i); if (!page) { printf("Failed to load page %d!\n", i+1); break; } int pageWidth = FPDF_GetPageWidth(page); int pageHeight = FPDF_GetPageHeight(page); RECT rect; rect.left = 0; rect.top = 0; rect.right = pageWidth; rect.bottom = pageHeight; FPDF_PrintPage(printerDC, page, &rect, 0, 0); FPDF_ClosePage(page); } // 结束打印作业 EndPage(printerDC); EndDoc(printerDC); DeleteDC(printerDC); // 释放资源 FPDF_CloseDocument(doc); return 0; } ``` 以上示例代码使用pdfium 9.0版本加载pdf文件,并通过Windows GDI API将pdf文件发送到打印机打印。在逐页打印时,使用FPDF_PrintPage函数打印当前页,并传入RECT结构体,设置打印页面大小和位置。在打印之前,使用Windows GDI API设置打印机的打印属性,包括打印份数、方向和纸张大小等。在打印完成后,使用Windows GDI API结束打印作业。 请注意,以上示例代码仅供参考,实际使用时还需要根据自己的需求进行修改和调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值