我有一个本地要保存的地址path,以及一个Bitmap数据,现在要把Bitmap保存成图片存放在path中,权限一直不被通过,提示如下信息:
W/System.err: java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/IMG_20230225_071514.jpg (Permission denied)
请问该如何解决?
该回答引用ChatGPT
如果有疑问可以回复我
如果您的应用程序需要读写外部存储器,您需要在AndroidManifest.xml文件中请求相应的权限。
在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
另外,从Android 11开始,访问共享存储(shared storage)上的文件需要申请特殊权限。要在应用程序中访问共享存储,请在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
您可以使用以下代码检查是否已授予这些权限:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
// Permission is not granted
}
如果权限没有被授予,您可以使用以下代码请求这些权限:
ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE);
在您的情况下,如果权限已经被授予,但仍然出现"Permission denied"错误,请确保您已经在运行时请求了这些权限。如果权限请求被拒绝,则应该向用户解释为什么应用程序需要这些权限,并尝试再次请求这些权限。
这个错误提示表明你的应用程序没有足够的权限来在指定的路径中创建文件。Android系统需要应用程序明确请求访问外部存储权限,才能够在外部存储上执行读写操作。
在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
然后在运行时请求外部存储访问权限,可以使用以下代码:
private static final int REQUEST_WRITE_EXTERNAL_STORAGE = 1;
// 检查是否已经授予权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
// 如果权限没有被授予,就向用户请求授权
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_EXTERNAL_STORAGE);
} else {
// 如果权限已经被授予,就执行读写操作
saveBitmapToFile(bitmap, path);
}
// 处理权限请求结果
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_WRITE_EXTERNAL_STORAGE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 用户已授权,执行读写操作
saveBitmapToFile(bitmap, path);
} else {
// 用户拒绝了授权请求,提示用户
Toast.makeText(this, "需要授予存储权限才能保存图片", Toast.LENGTH_SHORT).show();
}
}
}
// 将Bitmap保存到指定的路径
private void saveBitmapToFile(Bitmap bitmap, String path) {
File file = new File(path);
try {
FileOutputStream outputStream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
这样就可以请求授予存储权限,并且保存Bitmap到指定路径中。