无法保存位图:ENOENT (没有这样的文件或目录)



我尝试保存位图,但该行outStream = new FileOutputStream(file);总是抛出错误java.io.FileNotFoundException: /storage/emulated/0/inpaint/card.png: open failed: ENOENT (No such file or directory)

    //Save bitmap
    InputStream inputStream = null;
    try {
        inputStream = getContentResolver().openInputStream(uri);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    Bitmap bmp = BitmapFactory.decodeStream(inputStream);
    File f3=new File(Environment.getExternalStorageDirectory()+"/inpaint/");
    if(!f3.exists())
        f3.mkdirs();
    OutputStream outStream = null;
    File file = new File(Environment.getExternalStorageDirectory() + "/inpaint/"+"card"+".png");
    try {
        outStream = new FileOutputStream(file);
        bmp.compress(Bitmap.CompressFormat.PNG, 90, outStream);
        outStream.close();
        Toast.makeText(getApplicationContext(), "Saved", Toast.LENGTH_LONG).show();
    } catch (Exception e) {
        e.printStackTrace();
    }

我还添加了

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

到清单。

如果您的设备包含棉花糖,请授予权限 运行时间 :

       private static final int PERMISSION_REQUEST_CODE = 1;
      if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_DENIED) {
            Log.d("permission", "permission denied to WRITE_EXTERNAL_STORAGE - requesting it");
            String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
            requestPermissions(permissions, PERMISSION_REQUEST_CODE);
        }
    } 

在下面的方法中传递位图:

          public void CaptureImage(Bitmap bitmap) {
    try {
        File imageFile;
        File dir;

        dir = new File(Environment.getExternalStorageDirectory(), "FolderName");
        boolean success = true;
        if (!dir.exists()) {
            success = dir.mkdirs();
        }
        if (success) {
            java.util.Date date = new java.util.Date();
            imageFile = new File(dir.getAbsolutePath()
                    + File.separator
                    + new java.sql.Timestamp(date.getTime()).toString()
                    + "Image.jpg");
            imageFile.createNewFile();
        } else {
            return;
        }
        ByteArrayOutputStream ostream = new ByteArrayOutputStream();
        // save image into gallery
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, ostream);
        FileOutputStream fout = new FileOutputStream(imageFile);
        fout.write(ostream.toByteArray());
        fout.close();
        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.DATE_TAKEN,
                System.currentTimeMillis());
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
        values.put(MediaStore.MediaColumns.DATA,
                imageFile.getAbsolutePath());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

您可以应用以下代码 -

final int MyVersion = Build.VERSION.SDK_INT;
if (MyVersion > Build.VERSION_CODES.LOLLIPOP_MR1) {
                                if (!checkIfAlreadyhavePermission()) {
                                   ActivityCompat.requestPermissions(YourActivity.this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
                                } else {
                                    your_method();
                                }
                                } else {
                                    your_method();
                            }
private void your_code(){
      //Your entire code will go here
}
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 1: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    your_method();
                } else {
                    Toast.makeText(getApplicationContext(), "Please provide access to external storage", Toast.LENGTH_LONG).show();
                }
                break;
            }
   }
}

我想你和我有同样的问题。在 android 版本 23 或更高版本中,您需要在代码中向用户请求额外的存储权限。详情请见以下链接。

http://www.androidhowtocode.com/2017/01/javaiofilenotfoundexception.html

您可以使用

以下一行将图像保存在图片文件夹中,并将位图传递到下面:

MediaStore.Images.Media.insertImage(getApplicationContext().getContentResolver(), bitmap, "Detect Image", ");

最新更新