如何解决将图像保存到存储中时发生不可预料的行为
TLDR: 尽管我已经为其编写了代码,但为什么我的应用程序仍不要求运行时权限?
我正在将图像保存到存储中,通过单击按钮来执行以下操作:
// Function triggered when save button is pressed
private void saveImage(){
// Asking Runtime permissions for API level 23 and higher
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED){
finallySave();
} else {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},STORAGE_WRITE_REQUEST_CODE);
}
} else {
// Do not ask permissions in the runtime for API level 22 and lower
finallySave();
}
}
@Override
public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode,permissions,grantResults);
if (requestCode == STORAGE_WRITE_REQUEST_CODE) {
if (grantResults.size == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
finallySave()
} else {
Toast.makeText(this,"Permission denied",Toast.LENGTH_SHORT).show()
}
}
}
private void finallySave(){
try {
File outFile = new File(imagesDir,"Abc " + System.currentTimeMillis() + ".png");
FileOutputStream outputStream = new FileOutputStream(outFile);
bitmaps[0].compress(Bitmap.CompressFormat.PNG,100,outputStream);
outputStream.flush();
outputStream.close();
scanFile(outFile,"image/png");
} catch (Exception unused) {
}
}
问题是,有时无法保存图像,并显示以下错误:
java.io.FileNotFoundException: /storage/emulated/0/Abc/Abc 1601370822977.png (Permission denied)
我发现,当应用程序不要求运行时具有“存储写”权限时,将引发此错误。这正是我面临的问题的根源。尽管我已经为它编写了代码,但在某些情况下,我的应用程序并不要求运行时权限。复制此错误也非常困难,因为很多次保存操作都成功完成了。
我确信我保存图像的代码可以正常工作,因为有时它可以工作(这在我的应用程序要求运行时权限时发生),有时却没有。
P.S:重新安装我的应用程序后(卸载后),我遇到了这个问题。
编辑:imagesDir是我要分配的全局变量,如下所示:
imagesDir = getImageDir(); // in onCreate
private File getImageDir() {
File directory = new File(
Environment.getExternalStorageDirectory() + "/Abc");
if (!directory.exists()) {
if (!directory.mkdirs()) {
Toast.makeText(this,"Could not create directory",Toast.LENGTH_SHORT).show();
return null;
}
}
scanFile(directory,"*/*");
return directory;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。