【问题标题】:Can't save bitmap: ENOENT (No such file or directory)无法保存位图:ENOENT(没有这样的文件或目录)
【发布时间】:2017-02-01 10:19:51
【问题描述】:

我尝试保存位图,但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" />

到清单。

【问题讨论】:

  • 您的设备是否运行在 Android MM 或更高版本?
  • 我的目标是 API 15 及更高版本。
  • 好的,但是运行您的应用程序的设备的 android 操作系统版本是什么?如果它是 >= marshmallow 那么你必须在运行时请求许可。
  • f3.mkdirs();。检查返回值,因为它可能无法创建目录。在这种情况下,显示一个 toast 告诉用户这一点。并返回。不要继续编写代码,因为尝试在不存在的目录中创建文件毫无意义。

标签: android file bitmap io


【解决方案1】:

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

       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();
    }
}

【讨论】:

    【解决方案2】:

    您可以应用以下代码 -

    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;
                }
       }
    }
    

    【讨论】:

    • 我试过这个,但它没有改变任何东西。我更新了我的问题。
    • 我已经编辑了我的答案。当用户按下“允许”或“拒绝”按钮时,您接受的答案没有说明该怎么做。您需要在 OnRequestPermissionResult() 方法上处理此问题。希望这会有所帮助
    【解决方案3】:

    我想你和我有同样的问题。在 android 版本 23 或更高版本中,您需要在代码中要求用户提供额外的存储权限。详细说明在下面的链接中。

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

    【讨论】:

    • 谢谢,这就是问题所在。这个错误消息没有让我知道这是丢失的......
    • 链接不再有效。
    【解决方案4】:

    您可以使用这一行将图像保存在图片文件夹中并将位图传递到以下行:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-03
      • 2014-01-12
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2013-07-28
      • 2019-02-03
      • 1970-01-01
      相关资源
      最近更新 更多