2016-03-27 65 views
6

我正在創建一個簡單的應用程序來拍照。這是我的代碼BitmapFactory:無法解碼流:java.io.FileNotFoundException即使當文件實際上存在

Button b1; 
ImageView iv; 
String TAG = "MAIN ACTIVITY"; 

File photo; 
private Uri mImageUri; 


private File createTemporaryFile(String part, String ext) throws Exception { 


    File externalStorageDirectory = Environment.getExternalStorageDirectory(); 
    File tempDir = new File(externalStorageDirectory + "/cameratest/"); 
    if (!tempDir.exists()) { 
     tempDir.mkdir(); 

    } 
    return File.createTempFile(part, ext, tempDir); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    b1 = (Button) findViewById(R.id.button); 
    iv = (ImageView) findViewById(R.id.imageView); 

    b1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 

      try { 
       // place where to store camera taken picture 
       photo = createTemporaryFile("picture", ".jpg"); 
       photo.delete(); 
      } catch (Exception e) { 
       Log.v(TAG, "Can't create file to take picture!"); 
       Toast.makeText(getApplicationContext(), "Please check SD card! Image shot is impossible!", 
         Toast.LENGTH_SHORT).show(); 

      } 

      mImageUri = Uri.fromFile(photo); 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); 

      startActivityForResult(intent, 0); 
     } 
    }); 
} 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // TODO Auto-generated method stub 
    super.onActivityResult(requestCode, resultCode, data); 


    if (requestCode == 0 && resultCode == RESULT_OK) { 



     Log.d(TAG, mImageUri.toString()); 
     Bitmap bitmap = BitmapFactory.decodeFile(mImageUri.toString()); 
     iv.setImageBitmap(bitmap); 

    } 


} 

,你可以看到我在年底的logcat的加入eLog.d(TAG, mImageUri.toString());(還有FileNotFoundException)我看到這豬病:

03-27 00:43:30.498 30526-30526/myapplication.example.falcoleo.cameratest1 D/MAIN ACTIVITY: file:///storage/emulated/0/cameratest/picture459838058.jpg 
03-27 00:43:30.499 30526-30526/myapplication.example.falcoleo.cameratest1 E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: file:/storage/emulated/0/cameratest/picture459838058.jpg: open failed: ENOENT (No such file or directory) 

想,如果這個目錄存在? spo alert警報it does。它不像是在BitmapFactory.decodeFile之後創建的圖像。我真的不明白我做錯了什麼。一切工作正常,除非它實際上必須顯示照片,那麼它只是不顯示它。只是空白。就像WTF m8一樣,我只是想做我的工作,不需要發瘋,你知道的。

+0

你確定你有權限在外部存儲器中讀/寫嗎? – F43nd1r

+0

我有權限 – Leo300

回答

7

mImageUri.toString()替換爲mImageUri.getPath()

decodeFile需要一個路徑,而不是一個uri字符串。

+0

這是一個優雅的解決方案。謝謝 :) – Leo300

4
file:///storage/emulated/0/cameratest/picture459838058.jpg 

刪除file://因爲decodeFile()需要文件系統路徑。

/storage/emulated/0/cameratest/picture459838058.jpg 
+1

確定它有效。我用'string.replace(「file://」,「」)'是否有更優雅的解決方案? – Leo300

相關問題