2010-04-23 9 views
8

Man, I am ancora non è possibile salvare un'immagine quando invio un intent che chiede di scattare una foto. Ecco quello che sto facendo:Problemi di salvataggio di una foto in un file

  1. Fare un URI che rappresenta il percorso

    android.content.Context c = getApplicationContext(); 
    
    String fname = c.getFilesDir().getAbsolutePath()+"/parked.jpg"; 
    
    java.io.File file = new java.io.File(fname); 
    
    Uri fileUri = Uri.fromFile(file); 
    
  2. Creare l'Intent (! Non dimenticare il nome pkg) e avviare l'attività

    private static int TAKE_PICTURE = 22; 
    
    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    
    intent.putExtra("com.droidstogo.boom1." + MediaStore.EXTRA_OUTPUT, fileUri); 
    startActivityForResult(intent, TAKE_PICTURE); 
    
  3. L'attività della fotocamera inizia e io posso scattare una foto e approvarla. Il mio onActivityResult() viene quindi chiamato. Ma il mio file non viene scritto. L'URI è: file: ///data/data/com.droidstogo.boom1/files/parked.jpg

  4. posso creare delle miniature OK (non mettendo l'extra nel Intent), e può scrivere che file OK, e in seguito rileggerlo).

Qualcuno può vedere quale semplice errore sto facendo? Nulla di ovvio appare nel logcat: la fotocamera sta chiaramente scattando la foto. Grazie,

Peter


Devo dire che ho le autorizzazioni appropriate impostate nel file AndroidManifest.xml:

<uses-permission android:name="android.permission.READ_OWNER_DATA" /> 
    <uses-permission android:name="android.permission.WRITE_OWNER_DATA" /> 

    <uses-permission android:name="android.permission.CAMERA" /> 

    <uses-feature android:name="android.hardware.camera" /> 
    <uses-library android:name="com.google.android.maps" /> 



</application> 

Tutte le idee? Qualche idea su cosa provare, per avere maggiori informazioni sul problema?

+0

puoi inserire del codice per una migliore comprensione del problema – the100rabh

+0

Forse questa [domanda] (http://stackoverflow.com/questions/649057/how-do-i-save-data-from-camera-to- disk-using-mediastore-on-android) può aiutare. – kgiannakakis

risposta

1

È perché hai aggiunto un punto in più:

intent.putExtra("com.droidstogo.boom1." 

Invece di:.

intent.putExtra("com.droidstogo.boom1" 
1

Il tuo problema potrebbe essere con la directory si sta cercando di memorizzare il file in A salva i file sulla scheda SD non hai bisogno di permessi speciali, ma il modo in cui ottieni il riferimento alla cartella è diverso da come lo hai fatto. Dipende anche dal fatto che si desideri salvare l'immagine in un modo che può essere recuperato dal MediaStore (ad esempio cose come la galleria o l'applicazione di album o qualsiasi altra app che si basa su quelli per trovare le immagini) o meno. Supponendo che si desidera essere elencati nel MediaStore, ecco il codice per farlo:

ContentValues newImage = new ContentValues(2); 
newImage.put(Media.DISPLAY_NAME, "whatever name you want shown"); 
newImage.put(Media.MIME_TYPE, "image/png"); 

Uri uri = contentResolver.insert(Media.EXTERNAL_CONTENT_URI, newImage); 

try { 
    Bitmap bitmap = //get your bitmap from the Camera, however that's done 
    OutputStream out = contentResolver.openOutputStream(uri); 
    boolean success = bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); 
    out.close(); 
    if (success){ 
     Log.d("Image Writer", "Image written successfully.");     
    } else { 
     Log.d("Image Writer", "Image write failed, but without an explanation."); 
    } 

} catch (Exception e){ 
    Log.d("Image Writer", "Problem with the image. Stacktrace: ", e); 
} 

Sul mio emulatore v1.5 in esecuzione, che è salva con successo una bitmap sulla scheda SD nella cartella/Camera DCIM con la sua il nome del file è l'ora corrente. (Il tempo è salvato in millisecondi dal 1 gennaio 1970, conosciuto anche come il "epoca" per qualche motivo.)

+0

Solo per fare il pasticcio ... per salvare i file nella SDCard devi avere i permessi. Penso che questo sia stato cambiato in api livello 4. –

+0

@fiXedd: Solo per il pignolo in cambio: P Risulta che hai ragione che hanno introdotto il requisito di avere il permesso write_external_storage per scrivere sulla scheda SD. Sulla v1.5, ha funzionato bene senza, ma su v2.1 ha richiesto l'autorizzazione. Tuttavia, per scrivere su Media Store, su entrambe le versioni 2.1 e 1.5 non è stato richiesto alcun permesso. –

7
  1. Come Steve H ha detto non si può semplicemente utilizzare file: /// dati/data/com.droidstogo.boom1/files/parked.jpg per quello. È la directory privata dell'applicazione e la videocamera non può scrivere lì. Ad esempio, puoi utilizzare alcuni file della scheda SD: è disponibile per tutti.

  2. Come ha detto stealthcopter, l'intento extra è solo MediaStore.EXTRA_OUTPUT senza il nome del pacchetto.

  3. Non è un problema solo FYI. Immagino che nessuna delle autorizzazioni specificate sia effettivamente necessaria per questa operazione.

Ecco il mio codice di esempio:

final int REQUEST_FROM_CAMERA=1; 

private File getTempFile() 
{ 
    //it will return /sdcard/image.tmp 
    return new File(Environment.getExternalStorageDirectory(), "image.tmp"); 
} 

private void getPhotoClick() 
{ 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(getTempFile())); 
    startActivityForResult(intent, REQUEST_FROM_CAMERA); 
} 


protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_FROM_CAMERA && resultCode == RESULT_OK) { 
    InputStream is=null; 

    File file=getTempFile(); 
    try { 
     is=new FileInputStream(file); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

    //On HTC Hero the requested file will not be created. Because HTC Hero has custom camera 
    //app implementation and it works another way. It doesn't write to a file but instead 
    //it writes to media gallery and returns uri in intent. More info can be found here: 
    //http://stackoverflow.com/questions/1910608/android-actionimagecapture-intent 
    //http://code.google.com/p/android/issues/detail?id=1480 
    //So here's the workaround: 
    if(is==null){ 
     try { 
      Uri u = data.getData(); 
      is=getContentResolver().openInputStream(u); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } 

    //Now "is" stream contains the required photo, you can process it 
    DoSomeProcessing(is); 

    //don't forget to remove the temp file when it's not required. 
    } 

} 
0

Come ha detto Steve, si dovrebbe salvare l'immagine sulla scheda SD. La directory in cui stai tentando di salvare è privata e, a meno che tu abbia il tuo dispositivo rootato, non potrai scrivere lì. Prova sostituire questa linea:

String fname = c.getFilesDir().getAbsolutePath()+"/parked.jpg"; 

con questa linea

String fname = Environment.getExternalStorageDirectory().getAbsolutePath() + "somePathYouKnownExists" + +"/parked.jpg"; 

Questo dovrebbe essere sufficiente.

Problemi correlati