首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Android API 28中将位图保存到外部存储器会产生0 B文件

在Android API 28中,将位图保存到外部存储器会产生0 B文件的原因可能是因为没有正确处理文件读写权限。为了保护用户数据和隐私,Android系统引入了运行时权限机制。在API 23及以上版本中,应用需要在运行时请求并获取外部存储器写入权限才能进行文件操作。

要解决这个问题,可以按照以下步骤进行:

  1. 检查权限:在保存位图之前,应该先检查应用是否已获得写入外部存储器的权限。可以使用checkSelfPermission()方法来检查权限状态。如果没有权限,需要动态请求权限。
  2. 请求权限:使用requestPermissions()方法请求外部存储器写入权限。在回调方法onRequestPermissionsResult()中,可以检查用户是否授予了该权限。
  3. 处理权限回调:在onRequestPermissionsResult()方法中,检查用户授予的权限是否包含外部存储器写入权限。如果权限被授予,可以继续保存位图;否则,需要给出相应的提示信息或使用其他方法来处理。
  4. 保存位图:一旦获得了外部存储器写入权限,就可以使用标准的Java文件操作方法来保存位图。可以使用Environment.getExternalStorageDirectory()方法获取外部存储器的目录,然后创建文件和文件输出流,并将位图写入文件流中。

以下是示例代码:

代码语言:txt
复制
// 检查权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
    // 请求权限
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
            PERMISSION_REQUEST_CODE);
} else {
    // 已有权限,保存位图
    saveBitmapToExternalStorage(bitmap);
}

// 处理权限回调
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    if (requestCode == PERMISSION_REQUEST_CODE) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 用户授予了写入权限,保存位图
            saveBitmapToExternalStorage(bitmap);
        } else {
            // 用户拒绝了权限请求,给出提示或其他处理
            Toast.makeText(this, "需要授予写入外部存储器权限才能保存位图", Toast.LENGTH_SHORT).show();
        }
    }
}

// 保存位图到外部存储器
private void saveBitmapToExternalStorage(Bitmap bitmap) {
    // 获取外部存储器目录
    File directory = Environment.getExternalStorageDirectory();
    // 创建文件
    File file = new File(directory, "image.jpg");
    
    try {
        // 创建文件输出流
        FileOutputStream outputStream = new FileOutputStream(file);
        // 将位图写入文件流
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
        outputStream.flush();
        outputStream.close();
        Toast.makeText(this, "位图保存成功", Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        e.printStackTrace();
        Toast.makeText(this, "位图保存失败", Toast.LENGTH_SHORT).show();
    }
}

请注意,上述代码只是一个示例,并未考虑到所有可能的情况。在实际开发中,应该根据具体需求进行适当的错误处理和异常捕获,以确保保存位图的操作能够正确执行。

腾讯云相关产品和产品介绍链接地址:由于要求不能提及具体的云计算品牌商,因此不能直接给出腾讯云的链接地址。但腾讯云提供了丰富的云计算服务和解决方案,可以通过搜索引擎或腾讯云官方网站查找相关文档和产品信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

安卓应用安全指南 4.6.3 处理文件 高级话题

因此,与其他应用共享文件时,只允许只读权限。 以下是通过内容供应器的文件共享的实现示例,及其示例代码。 要点: 1) 源应用是内部应用,因此可以保存敏感信息。...正如文件创建中所说明的,从安全设计的角度来看,目录基本上也应该设置为私有的。 当信息共享取决于访问权限设置时,可能产生意想不到的副作用,所以应采取其他方法用于信息共享。...4.6.3.4 Android 4.4(API 级别 19)及更高版本中,外部存储访问的规范更改 自 Android 4.4(API Level 19)以来,外部存储访问的规范已更改为以下内容。...(4)应用无法写入次要外部存储器上的特定目录以外的目录中的文件该规范中,根据 Android OS 的版本确定是否需要权限请求。...授予访问外部存储的权限时,应用可以访问预期目标以外的目录。 使用存储器访问框架来要求用户选择可访问的目录,导致繁琐的过程,用户必须在每次访问时配置一个选择器。

68320

开启新视界!百款应用广色域适配评测报告

涉及购物比价、实用工具、社交通讯等16个类别,从测试结果来看,问题比较大的拍摄美化、购物比价和社交通讯分类中,用户对这几类应用的图片真实度和质感要求较高,尤其购物类应用,图片色差影响销量、评价等,...如果没有做到这一点,可能导致色彩失真,或者色彩配置文件某个环节不被接受。...API中通过android.graphics.BitmapFactory可以实现解码图片文件(全解码),这其中包括了通过文件、流、数字创建解码器。...3.1.3 ImageDecoder 从 Android P (API 等级 28) 开始,Android引入了现代化图片解码工具 ImageDecoder。...^g); R=sR*1; G=sG*1; B=sB*1; out=[R,G,B]; end 按照如上方式可以简单实现针对P3sRGB的色域转换。

1.3K30
  • 【STM32H7】第6章 ThreadX GUIX上手之STM32H7 DMA2D加速

    默认DMA2D的API都是采用阻塞式,这种方式使用RTOS的时候比较方便,用户可以将GUI任务的优先级设置的仅比空闲任务高即可,这样有高优先级任务要执行,可以及时切换到高优先级任务里,GUI任务等待DMA2D...6.3 制作C文件格式的位图 由于DMA2D刷新图片要用到,所以本小节为大家介绍下位图的制作。 6.3.1 什么是位图 位图(bitmap),又称为点阵图,是使用像素阵列来表示图像。...点击OK按钮后会在桌面出现一个新文件,即lufy.c,保存在桌面是因为第2步中选择的路径是桌面。...0x2A787653, 0x597F8266, 0x606F6F4D, 0x5F7D7D54, 0x37747B50, 0x0B455035, 0x00745F3F, 0x00615856, 0x00655751...第2行是位图的行偏移,行偏移的意思就是一行结束下一行开始的距离,单位像素个数。由于整个位图都要绘制,所有行偏移就是0。 第3行,根据设置的起始坐标,计算起始坐标LCD显存中的具体位置。

    60720

    【STM32F429】第6章 ThreadX GUIX上手之STM32F429 DMA2D加速

    默认DMA2D的API都是采用阻塞式,这种方式使用RTOS的时候比较方便,用户可以将GUI任务的优先级设置的仅比空闲任务高即可,这样有高优先级任务要执行,可以及时切换到高优先级任务里,GUI任务等待DMA2D...6.3 制作C文件格式的位图 由于DMA2D刷新图片要用到,所以本小节为大家介绍下位图的制作。 6.3.1 什么是位图 位图(bitmap),又称为点阵图,是使用像素阵列来表示图像。...点击OK按钮后会在桌面出现一个新文件,即lufy.c,保存在桌面是因为第2步中选择的路径是桌面。...0x2A787653, 0x597F8266, 0x606F6F4D, 0x5F7D7D54, 0x37747B50, 0x0B455035, 0x00745F3F, 0x00615856, 0x00655751...第2行是位图的行偏移,行偏移的意思就是一行结束下一行开始的距离,单位像素个数。由于整个位图都要绘制,所有行偏移就是0。 第3行,根据设置的起始坐标,计算起始坐标LCD显存中的具体位置。

    72210

    内存都没了,还能运行程序?

    运行多个程序 但是,即便没有存储器抽象,同时运行多个程序也是有可能的。操作系统只需要把当前内存中所有内容保存到磁盘文件中,然后再把程序读入内存即可。只要某一时间只有一个程序,那么就不会产生冲突。...毕竟,上图 b 中的 JMP 28 可以被重定向(被修改),而类似 MOV REGISTER1,28 会把数字 28 移到 REGISTER 中则不会重定向。...如果程序提供的地址要超过变址寄存器的范围,那么产生错误并中止访问。...图 a 表示一段有 5 个进程和 3 个空闲区的内存,刻度为内存分配单元,阴影区表示空闲(在位图中用 0 表示);图 b 表示对应的位图;图 c 表示用链表表示同样的信息 分配单元的大小是一个重要的设计因素...在位图中找出制定长度的连续 0 串是一个很耗时的操作,这是位图的缺点。

    1.1K10

    内存:一个能让程序跑起来的东西

    运行多个程序 但是,即便没有存储器抽象,同时运行多个程序也是有可能的。操作系统只需要把当前内存中所有内容保存到磁盘文件中,然后再把程序读入内存即可。只要某一时间只有一个程序,那么就不会产生冲突。...毕竟,上图 b 中的 JMP 28 可以被重定向(被修改),而类似 MOV REGISTER1,28 会把数字 28 移到 REGISTER 中则不会重定向。...如果程序提供的地址要超过变址寄存器的范围,那么产生错误并中止访问。...一块内存区域和其对应的位图如下 11.jpg 图 a 表示一段有 5 个进程和 3 个空闲区的内存,刻度为内存分配单元,阴影区表示空闲(在位图中用 0 表示);图 b 表示对应的位图;图 c 表示用链表表示同样的信息...在位图中找出制定长度的连续 0 串是一个很耗时的操作,这是位图的缺点。

    98740

    【STM32H7教程】第56章 STM32H7的DMA2D应用之刷色块,位图和Alpha混合

    默认DMA2D的API都是采用阻塞式,这种方式使用RTOS的时候比较方便,用户可以将GUI任务的优先级设置的仅比空闲任务高即可,这样有高优先级任务要执行,可以及时切换到高优先级任务里,GUI任务等待DMA2D...点击OK按钮后会在桌面出现一个新文件,即lufy.c,保存在桌面是因为第2步中选择的路径是桌面。...0x2A787653, 0x597F8266, 0x606F6F4D, 0x5F7D7D54, 0x37747B50, 0x0B455035, 0x00745F3F, 0x00615856, 0x00655751...第27行,设置输出存储器首地址。   第28行,设置前景层行偏移。   第29行,设置背景层行偏移。   第29行,设置输出区行偏移。  ...第2行是位图的行偏移,行偏移的意思就是一行结束下一行开始的距离,单位像素个数。由于整个位图都要绘制,所有行偏移就是0。   第3行,根据设置的起始坐标,计算起始坐标LCD显存中的具体位置。

    1.3K10

    【科技】Google推出首个Android P开发者预览版

    第一次预览的目标是让开发人员尽早使用该版本,以便他们可以探索应用程序的新功能和API,测试兼容性并提供反馈,然后2018年5月8日5月10日之间分享更多的详细信息。...随后的开发人员预览版中将发布更多新功能和功能,并最终将通过Android Beta程序进行注册。...用于位图和可绘制的ImageDecoder: ImageDecoder(不支持BitmapFactory)允许你从字节缓存、文件或URI中创建位图或绘图。...因此,应用程序可以使用RTT API来测量到附近WiFi接入点(AP)的距离。了解三个或更多的AP的距离,可以计算设备的位置,准确度为12米。...ART现在使用的是对DEX文件进行设备重写的配置文件信息,一系列流行的应用程序中可减少11%。 优化的Kotlin:改进了几种编译器优化,特别是那些针对循环的编译器优化,以获得更好的性能。

    1.3K60

    softreference 回收_method verification

    一、softReference的作用 SoftReference的主要特点就是在当内存不够的时候,GC回收SoftReference所引用的对象。...所以,memory sensitive的项目中将某些数据设置成SoftReference可以避免内存的溢出。...一个android应用如果设计通过网络获取图片,为了让系统更快的运行和更节省流量我们可以将已经下载下来的图片缓存起来,当第二次浏览该图片时就可以从缓存中拿。...缓存的方式有:一是放在系统内存中这样效率最高,二是把文件写到外部存储器上。但是就目前而言android系统的内存是非常的有限的不可能像PC机那样配置那么高的内存,而且外部存储器的容量也是有限的。...这个类通常用于在某处保存对象引用,而又不干扰该对象被GC回收,通常用于Debug、内存监视工具等程序中。因为这类程序一般要求即要观察对象,又不能影响该对象正常的GC过程。

    36430

    【第3版emWin教程】第17章 emWin6.x的2D图形库之绘制流位图(QSPI Flash内存映射方案)

    ,比如SD卡, QSPI Flash和SPI Flash等,有没有文件系统均可,而位图需要存储内部Flash,而且比较占用空间。...,优势有两点: 与位图不同,流位图可以存储到任何外部存储器,这样就可以存储很多图标和背景图片。...4、 2D绘图的所有API函数emWin手册中都有讲解,下图是中文版手册里面API函数的位置 下图是英文版手册里面API函数的位置: 5、 流位图绘制非常的实用,望初学者务必掌握。...17.4.1 将流位图文件转换为C数组格式文件 为了方便将bin文件添加到MDK工程中,我们这里使用小软件B2C.exe将其转换为C格式文件(此软件已经放到本章配套例子V7-511_emWin6...仔细看一下这些函数,会发现这些函数主要分为两大类,一类是以Ex结尾的函数,这种函数显示流位图是边从外部存储器加载数据边显示,显示速度相对较慢,另一类是不以Ex结尾的函数,这种函数直接从指定的地址读取数据进行显示

    77010

    【第3版emWin教程】第18章 emWin6.x的2D图形库之绘制流位图(SPI Flash方案)

    ,比如SD卡, QSPI Flash和SPI Flash等,有没有文件系统均可,而位图需要存储内部Flash,而且比较占用空间。...,优势有两点: 与位图不同,流位图可以存储到任何外部存储器,这样就可以存储很多图标和背景图片。...4、 2D绘图的所有API函数emWin手册中都有讲解,下图是中文版手册里面API函数的位置 下图是英文版手册里面API函数的位置: 5、 流位图绘制非常的实用,望初学者务必掌握。...18.4.1 将流位图文件转换为C数组格式文件 为了方便将bin文件添加到MDK工程中,我们这里使用小软件B2C.exe将其转换为C格式文件(此软件已经放到本章配套例子V7-513_emWin6..., 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 省略未写 } 18.4.2 设置流位图文件外部

    85530

    Bitmap图片压缩,大图加载防止OOM

    [在这里插入图片描述] 前言 Android官网中处理位图 和 [高效加载大型位图 ](https://developer.android.com/topic/performance/graphics/...R、G、B分别代表红、绿和蓝色三种颜色通道,取值均为0,255。 RGB 8位色: 表示使用8位(bit)表示颜色,一共能表示2^8 = 128种颜色。...先看一些基础知识(后面有答案) Android官网-提供备用位图 这篇文章链接中的有讲到: 要在像素密度不同的设备上提供良好的图形质量,您应该以相应的分辨率应用中提供每个位图的多个版本(针对每个密度级别提供一个版本...否则,Android 系统必须缩放位图,使其每个屏幕上占据相同的可见空间,从而导致缩放失真,如模糊。...因为 PNG 格式是无损的,它无法再进行质量压缩,quality这个参数就没有作用了,会被忽略,所以最后图片保存成的文件大小不会有变化; CompressFormat.WEBP ,这个格式是 google

    2.7K00

    广色域照片闪亮登场 Android: 开发者需知两三事

    Android 一直努力实现对广色域图像的端端支持,例如,呈现数据更多、色域更宽的画面。这意味着,用户最终能够捕捉到实景的丰富色彩,在手机上观赏并与朋友分享广色域图片。...如果没有做到这一点,可能导致色彩失真,或者色彩配置文件某个环节不被接受。 必要: 色彩校正 通过色彩校正测试为最低要求。...P (API 等级 28) 开始,我们引入了现代化图片解码工具 ImageDecoder。...以下示例代码中,我们使用 ImageDecoder#decodeBitmap API 将图片转换为 sRGB 位图。...所有旧版本 API 应该显式将位图解码为 sRGB 色彩空间。 Android 8.0 (API 等级 26) 引入色彩管理之前,所有内容都被设定为 sRGB 色域。

    1.5K30

    Bitmap图片压缩,大图加载防止OOM

    R、G、B分别代表红、绿和蓝色三种颜色通道,取值均为[0,255]。 RGB 8位色: 表示使用8位(bit)表示颜色,一共能表示2^8 = 128种颜色。...先看一些基础知识(后面有答案) Android官网-提供备用位图 这篇文章链接中的有讲到: 要在像素密度不同的设备上提供良好的图形质量,您应该以相应的分辨率应用中提供每个位图的多个版本(针对每个密度级别提供一个版本...否则,Android 系统必须缩放位图,使其每个屏幕上占据相同的可见空间,从而导致缩放失真,如模糊。 ?...因为 PNG 格式是无损的,它无法再进行质量压缩,quality这个参数就没有作用了,会被忽略,所以最后图片保存成的文件大小不会有变化; CompressFormat.WEBP ,这个格式是 google...不同的采样算法会产生不同效果,除了 Android 中这两种常用的采样算法之外,还有比较常见如:双立方/双三次采样(Bicubic Resampling) 和 Lanczos Resampling 等。

    1.9K20

    android学习笔记----关于图形的基本处理讲解

    17之后使用,获取的像素宽高包含虚拟键所占空间,API 17之前通过反射获取 // 获取显示的实际大小,而不减去任何窗口装饰或应用任何兼容性缩放因子。...// api如下: /*如果设置为true,解码器将返回null(无位图),但仍将设置out ...字段,允许调用者查询位图而无需为其像素分配内存。...参数 bitmap Bitmap:要绘制的位图 这个值绝不能是null. matrix Matrix:用于绘制位图时转换位图的矩阵。 这个值绝不能是null. paint Paint:可能为空。...// api如下: /*如果设置为true,解码器将返回null(无位图),但仍将设置out ...字段,允许调用者查询位图而无需为其像素分配内存。...-640dpi文件夹下,而屏幕420dpi,让这个图适应屏幕而进行自动缩放显示。

    62620

    【第3版emWin教程】第16章 emWin6.x的2D图形库之绘制流位图(SD卡方案)

    ,使用流位图是最佳选择,优势有两点: 与位图不同,流位图可以存储到任何外部存储器,这样就可以存储很多图标和背景图片。...2、 本章节所需的流位图文件pic.dta和pic1.dta已经存储本章节配套例子的Doc文件夹下,使用此例子前,请务必将这两个流位图文件存储SD卡根目录中,并将SD卡插到开发板上面。...3、 2D绘图的所有API函数emWin手册中都有讲解,下图是中文版手册里面API函数的位置 下图是英文版手册里面API函数的位置: 4、 流位图绘制非常的实用,望初学者务必掌握。...仔细看一下这些函数,会发现这些函数主要分为两大类,一类是以Ex结尾的函数,这种函数显示流位图是边从外部存储器加载数据边显示,显示速度相对较慢,另一类是不以Ex结尾的函数,这种函数直接从指定的地址读取数据进行显示...SD卡的根目录下,然后通过emWin的动态内存管理函数申请动态内存并将流位图文件加载进来, 这里我们用的是外部SDRAM做emWin的动态内存(已经GUIConf.c文件进行设置),方法如下:

    71920

    Android 11 快来了,IO 性能下降了 SDCardFS Vs FUSE

    早期,许多应用程序开发人员会将“ sdcard”视为其应用程序数据的转储场,而对存储文件的位置没有统一的认识。许多应用程序简单地使用应用程序名称创建一个文件夹并将其文件存储文件夹中。...实际上,从API级别19开始,不再需要READ_EXTERNAL_STORAGE来访问位于外部存储器上的文件-只要FUSE守护程序创建的数据文件夹与应用程序的软件包名称匹配即可。...type sdcardfs /data/media on /storage/emulated/0/Android/obb type sdcardfs FUSE 问题 Android中,“ sdcard...现实世界中,这种性能下降影响存储在外部存储中的所有文件。...用以下方法测试了此双重缓存问题: 创建一个已知大小的文件(用于测试,大小为10MB) 将其复制/ sdcard 删除页面缓存 快照页面缓存的使用 读取测试文件 拍摄页面缓存使用情况的另一个快照 测试之前

    3.9K10

    Android 内存优化】图片文件压缩 ( Android 原生 API 提供的图片压缩功能能 | 图片质量压缩 | 图片尺寸压缩 )

    文章目录 一、 图片压缩 二、 图片文件压缩类型 三、 Android 原生 API 提供的质量压缩 四、 Android 原生 API 提供的尺寸压缩 一、 图片压缩 ---- 图片压缩 : ① 文件压缩...保存图片 : 保存图片设备的 SD 卡 , 为了 节省磁盘资源 , 将图片文件进行压缩 ; ③ 内存压缩 : 与文件压缩相对应的是内存压缩 , 内存中如何使用更少的内存显示出想要显示的图片 ; 之后的博客中会详细介绍...100 ; 0 压缩到极限最小 , 100 压缩时最高质量 , PNG 图片是无损图片格式 , 其质量不能被降低 , 忽略该参数 ; OutputStream stream 参数 : 写出被压缩图片的输出流..., 可以是文件输出流 , 也可以是网络流 ; ③ 返回值 : 如果压缩成功, 并写出到指令的输出流, 返回 true ; /** * 写出该位图压缩后的版本输出流中 * 如果该方法返回...原生 API 提供的尺寸压缩 ---- 图片尺寸压缩函数原型 : 下面的函数原型中给出了详细注释 ; ① 函数作用 : 创建一个新的 Bitmap 对象 , 缩放一张已存在的位图 ; 如果指定的宽高与当前源位图的宽高一致

    4.3K20
    领券