2017-02-01 37 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操作系統版本是什麼?如果它是> =棉花糖,那麼你必須在運行時詢問權限。 – 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

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

     } 
    } 

通行證位以下方法:

  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(),bitmap,「Detected Image」,「」);

相關問題