在Android API 28中,将位图保存到外部存储器会产生0 B文件的原因可能是因为没有正确处理文件读写权限。为了保护用户数据和隐私,Android系统引入了运行时权限机制。在API 23及以上版本中,应用需要在运行时请求并获取外部存储器写入权限才能进行文件操作。
要解决这个问题,可以按照以下步骤进行:
checkSelfPermission()
方法来检查权限状态。如果没有权限,需要动态请求权限。requestPermissions()
方法请求外部存储器写入权限。在回调方法onRequestPermissionsResult()
中,可以检查用户是否授予了该权限。onRequestPermissionsResult()
方法中,检查用户授予的权限是否包含外部存储器写入权限。如果权限被授予,可以继续保存位图;否则,需要给出相应的提示信息或使用其他方法来处理。Environment.getExternalStorageDirectory()
方法获取外部存储器的目录,然后创建文件和文件输出流,并将位图写入文件流中。以下是示例代码:
// 检查权限
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();
}
}
请注意,上述代码只是一个示例,并未考虑到所有可能的情况。在实际开发中,应该根据具体需求进行适当的错误处理和异常捕获,以确保保存位图的操作能够正确执行。
腾讯云相关产品和产品介绍链接地址:由于要求不能提及具体的云计算品牌商,因此不能直接给出腾讯云的链接地址。但腾讯云提供了丰富的云计算服务和解决方案,可以通过搜索引擎或腾讯云官方网站查找相关文档和产品信息。
领取专属 10元无门槛券
手把手带您无忧上云