首页 > 解决方案 > 将图像保存到存储中时出现不可预测的行为

问题描述

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)

我发现当应用程序没有在运行时询问“存储写入”权限时会引发此错误。这是我面临的问题的根源。尽管我已经为它编写了代码,但在某些情况下,我的应用程序并没有要求运行时权限。复制这个错误也很困难,因为很多次保存操作都成功执行。

我确信我用于保存图像的代码可以正常工作,因为有时它可以正常工作(当我的应用程序要求运行时权限时会发生这种情况),有时则不能。

PS:当我重新安装我的应用程序(卸载后)时遇到了这个问题。

编辑: 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;
}

标签: androidstorageruntime-permissions

解决方案


推荐阅读