返回
Android 11 调用系统图片裁剪后,无法保存图片?一招解决!
Android
2023-09-30 03:48:58
在 Android 11 中解决系统图片裁剪无法保存问题
前言
对于移动应用开发人员来说,处理图像是一项常见的任务。然而,在 Android 11 及更高版本中,调用系统图片裁剪时可能会遇到一个令人头疼的问题:裁剪后的图片无法保存。
原因:存储权限
Android 11 引入了更严格的存储权限控制。这意味着应用在访问外部存储(例如 SD 卡)时需要获得用户的明确权限。如果您未正确请求存储权限,则应用将无法将裁剪后的图片保存到外部存储中。
解决方案:请求存储权限
为了解决此问题,您需要在处理系统图片裁剪之前请求 READ_EXTERNAL_STORAGE
和 WRITE_EXTERNAL_STORAGE
权限。以下是如何操作:
1. 在清单文件中声明权限
<manifest ... >
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>
2. 在运行时动态请求权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_STORAGE_PERMISSION);
}
3. 在onRequestPermissionsResult方法中处理权限请求结果
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_CODE_STORAGE_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
// 存储权限已获得,可以进行图片裁剪
startImageCrop();
} else {
// 存储权限未获得,无法进行图片裁剪
Toast.makeText(this, "存储权限被拒绝,无法裁剪图片", Toast.LENGTH_SHORT).show();
}
}
}
4. 在裁剪之前检查存储权限
private void startImageCrop() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_STORAGE_PERMISSION);
return;
}
// 存储权限已获得,可以进行图片裁剪
...
}
结论
通过遵循这些步骤,您可以在 Android 11 及更高版本设备上调用系统图片裁剪并成功保存裁剪后的图片。告别令人抓狂的图片保存失败问题,让您的应用在更高的 Android 版本中也能无缝运行!
常见问题解答
1. 为什么我在请求存储权限时收到“拒绝”响应?
- 用户可能出于隐私或安全原因拒绝了权限请求。您应该向用户解释请求权限的原因并重新请求权限。
2. 我已经在清单文件中声明了权限,但我仍然无法访问存储?
- 您还需要在运行时动态请求权限。Android 6.0 及更高版本要求应用在访问敏感权限(包括存储权限)之前获得用户的明确许可。
3. 如何检查应用是否具有存储权限?
- 使用
ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE)
和ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
方法检查权限状态。
4. 为什么即使我具有存储权限,裁剪的图片仍然无法保存?
- 请确保您的应用具有写入特定文件或目录的权限。您可能需要使用
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
方法获取公共图片目录的路径。
5. 裁剪后的图片保存到哪里?
- 系统图片裁剪通常会将裁剪后的图片保存在应用程序特定的外部存储目录中。您可以使用
getFilesDir()
方法获取应用程序的外部存储目录的路径。