android - 在 Android API 28 中将位图保存到外部存储导致 0 B 文件
问题描述
我正在尝试将位图保存到外部存储。我使用了在android-save image into gallery中找到的代码。但是,生成的文件大小为 0 B,但包含缩略图。我的代码是:
private fun saveBitmap(bitmap: Bitmap, name: String) {
val contentValues = contentValuesOf(
MediaStore.MediaColumns.TITLE to name,
MediaStore.MediaColumns.DISPLAY_NAME to name,
MediaStore.MediaColumns.MIME_TYPE to "images/jpeg",
MediaStore.MediaColumns.DATE_ADDED to System.currentTimeMillis()
)
val resolver = contentResolver
val uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
val outputStream = resolver.openOutputStream(uri!!)!!
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, outputStream)
outputStream.flush()
outputStream.close()
}
解决方案
与其保存为 JPEG,不如尝试另存为 PNG
try (FileOutputStream out = new FileOutputStream(filename)) {
bmp.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
// PNG is a lossless format, the compression factor (100) is ignored
} catch (IOException e) {
e.printStackTrace();
}
请在此处找到已回答的类似问题
另外,正如评论中提到的,请检查,您是否获得了读/写访问权限?如果没有,请参考下面的代码。
if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
Log.v(TAG,"Permission is granted");
//File write logic here
return true;
}
推荐阅读
- .net - System.Text.JSON.DeserializeAsync JSON Objects 如图所示,我的代码没有正确发生
- mysql - 仅选择一条重复记录的 SQL 查询,基于该记录中的最高日期值
- caching - 在同一个 gitlab CI 管道中重用 conda 环境?
- c++ - 多个转换运算符导致赋值运算符歧义
- jquery - 为什么 jQuery each() 循环在每次迭代中获取所有迭代的所有元素?
- go - Golang:杜松子酒:获取基本网址
- leaflet - 如何在 Leaflet 中为磁贴请求添加自定义授权标头
- asp.net-mvc - 为 asp.net 身份生成的身份验证 cookie 设置 SameSite cookie 属性(低于 NET 4.7.2)
- python - GurobiError:名称太长(名称长度上限为 255 个字符)
- python - 为什么打开此文件时 Python tkinter 会崩溃?