将图像保存到存储中时发生不可预料的行为

问题描述

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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...