2017-02-01 12 views
0

Я пытаюсь сохранить растровое изображение, но строка outStream = new FileOutputStream(file); всегда выдает ошибку java.io.FileNotFoundException: /storage/emulated/0/inpaint/card.png: open failed: ENOENT (No such file or directory).Не удается сохранить растровое изображение: ENOENT (нет такого файла или каталога)

//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" />

в манифесте.

+0

Работает ли ваше устройство в Android MM или выше? – tahsinRupam

+0

Я нацелен на API 15 и выше. – Jonas

+1

Хорошо, но какова версия Android для Android, в которой работает приложение? Если это> = зефир, тогда вы должны спросить разрешения на время выполнения. – tahsinRupam

ответ

1

Вы можете применить следующий код -

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

Я пробовал это, но ничего не изменил. Я обновляю свой вопрос. – Jonas

+1

Я отредактировал свой ответ. Ваш принятый ответ не сказал, что делать, когда пользователь нажимает кнопку «Разрешить» или «Отклонить». Вам нужно обработать это методом OnRequestPermissionResult(). Надеюсь, это поможет – tahsinRupam

1

Я думаю, у вас есть такая же проблема со мной. В android версии 23 или выше вы должны спросить пользователей о дополнительных разрешениях на хранение в кодах. Подробности объясняются в ссылке ниже.

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

+0

Спасибо, в этом была проблема. Это сообщение об ошибке не дало мне понять, что этого не было ... – Jonas

2

Если устройство содержит алтей, то дать время разрешения запуска:

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

     } 
    } 

Pass растровое ниже в методе:

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

Вы можете сохранить изображение в папке с фотографиями с помощью этого одну линию и передать растровое изображение ниже строки:

MediaStore.Images.Media.insertImage (getApplicationContext(). GetContentResolver(), растровое изображение, «Обнаруженное изображение», «»);