2016-03-27 9 views
6

Sto creando una semplice app per scattare una foto. questo è il mio codiceBitmapFactory: impossibile decodificare il flusso: java.io.FileNotFoundException anche quando il file IS è effettivamente lì

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

    } 


} 

come potete vedere ho aggiunto eLog.d(TAG, mImageUri.toString()); alla fine e nel logcat (così come il FileNotFoundException) vedo questo direcory:

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) 

indovinare se questa directory esiste? avviso di spogliatoio, it does. E non è come l'immagine viene creata dopo il BitmapFactory.decodeFile. Io davvero non capisco cosa sto sbagliando. Tutto funziona bene, tranne quando in realtà deve visualizzare la foto, quindi non lo mostra. solo vuoto Come WTF m8 sto solo cercando di fare il mio lavoro senza bisogno di impazzire, lo sai.

+0

sei sicuro di disporre delle autorizzazioni per leggere/scrivere nella memoria esterna? – F43nd1r

+0

ho i permessi – Leo300

risposta

7

Sostituire mImageUri.toString() con mImageUri.getPath().

decodeFile prevede un percorso, non una stringa uri.

+0

questa è una soluzione elegante. Grazie :) – Leo300

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

Rimuovere file:// perché il decodeFile() si aspetta un percorso del file system.

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

ok funziona. Ho usato 'string.replace (" file: // "," ")' c'è una soluzione più elegante? – Leo300

Problemi correlati