2009-03-16 12 views
10

Per la mia applicazione, stavo usando la mia classe Camera per riprendere immagini e il mio database ma abbastanza presto non sono riuscito a tenere il passo con le modifiche e ho deciso di usare l'applicazione fotocamera integrata in Android per fare il lavoro , ma non riesco a ottenerlo per salvare il file. Cosa mi manca qui? L'applicazione sembra salvare il file ma è solo 0 byte. Ho cercato il codice sorgente dell'applicazione Camera e sta cercando "output" in Extra per salvare il file. Qualsiasi aiuto sarebbe molto apprezzato.Come si salvano i dati dalla fotocamera al disco utilizzando MediaStore su Android?

Public class CameraTest extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Button cameraButton = (Button) findViewById(R.id.cameraButton); 
     cameraButton.setOnClickListener(new OnClickListener(){ 
      public void onClick(View v){ 
       ContentValues values = new ContentValues(); 
       values.put(Images.Media.TITLE, "title"); 
       values.put(Images.Media.BUCKET_ID, "test"); 
       values.put(Images.Media.DESCRIPTION, "test Image taken"); 
       Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values); 
       Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 
       intent.putExtra("output", uri.getPath()); 
       startActivityForResult(intent,0); 
      } 
     }); 

    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode== 0 && resultCode == Activity.RESULT_OK){ 
      ((ImageView)findViewById(R.id.pictureView)).setImageURI(data.getData()); 
     } 
    } 


} 

risposta

14

Questo ha funzionato con il seguente codice, concesso che ero un po 'stupido con l'ultimo. Continuo a pensare che ci sia un modo migliore per salvare l'immagine originale da qualche parte. Mi invia ancora l'immagine più piccola del 25%.

public class CameraTest extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Button cameraButton = (Button) findViewById(R.id.cameraButton); 
    cameraButton.setOnClickListener(new OnClickListener(){ 
     public void onClick(View v){ 

      Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 

      startActivityForResult(intent,0); 
     } 
    }); 

} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode== 0 && resultCode == Activity.RESULT_OK) { 
     Bitmap x = (Bitmap) data.getExtras().get("data"); 
     ((ImageView)findViewById(R.id.pictureView)).setImageBitmap(x); 
     ContentValues values = new ContentValues(); 
     values.put(Images.Media.TITLE, "title"); 
     values.put(Images.Media.BUCKET_ID, "test"); 
     values.put(Images.Media.DESCRIPTION, "test Image taken"); 
     values.put(Images.Media.MIME_TYPE, "image/jpeg"); 
     Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values); 
     OutputStream outstream; 
     try { 
      outstream = getContentResolver().openOutputStream(uri); 
      x.compress(Bitmap.CompressFormat.JPEG, 70, outstream); 
      outstream.close(); 
     } catch (FileNotFoundException e) { 
      // 
     } catch (IOException e) { 
      // 
     } 
    } 
} 

Inoltre, so che il rilascio di cupcake di Android dovrebbe presto risolvere le piccole dimensioni dell'immagine.

+1

hey ringrazi la u così così così much.it funziona davvero thank u – Geetanjali

+0

: hey Ho usato codice ur ma ho una problem.I hanno utilizzato il rapporto di aspetto e l'opzione delle colture, ma il suo non è prendendo proporzioni .Perché è questo comportamento anomalo? per favore aiutami – Geetanjali

4

Nel tuo primo tentativo, potrebbe accadere che l'app Fotocamera si chiuda in modo anomalo quando legge il tuo extra di "output", dal momento che si aspetta che sia un Uri, mentre tu fornisci una stringa. L'app Fotocamera sembra leggere la bandiera in più dopo aver catturato la foto. Dovresti solo fornire uri, e non uri.getPath(). Quindi, dal momento che conosci già l'URI della foto, non verrà restituito nella chiamata onResult. È necessario ricordare l'URI in una variabile membro.

Nel secondo tentativo verrà restituito un bitmap ridimensionato (50%). È principalmente inteso per le visualizzazioni. Penso che la bitmap a dimensione intera sia troppo grande per il budget di memoria dell'applicazione. Questa potrebbe essere la ragione del downscale.

+0

ha senso. Ricordo di aver riscontrato problemi di tipo di overflow del buffer con immagini più grandi o con più di un'immagine non graduata sullo schermo ... – prasanna

0

Ho avuto lo stesso problema con l'emulatore, L'ho provato su un vero telefono e ha funzionato, forse è perché il telefono virtuale non può davvero prendere Picures.

+0

yep u gli emulatori corretti non funzionano con la fotocamera.Gli emulatori nope –

+0

funzionano con la fotocamera – Trikaldarshi

4

FYI, trovato su documenti: Il chiamante può passare un extra EXTRA_OUTPUT per controllare dove verrà scritta questa immagine. Se EXTRA_OUTPUT non è presente, viene restituita un'immagine di dimensioni ridotte come oggetto Bitmap nel campo extra. Questo è utile per le applicazioni che richiedono solo una piccola immagine. Se è presente EXTRA_OUTPUT, l'immagine a dimensione intera verrà scritta nel valore Uri di EXTRA_OUTPUT.

trova qui: http://developer.android.com/reference/android/provider/MediaStore.html

modo l'applicazione può salvare l'immagine full size per voi, se gli si dice dove.

** Modifica: non è questo il caso dei dispositivi HTC. HTC (non nexus) che usa htc sense ui è derivato da Android 1.5 e presenta un bug che salva sempre l'immagine in bassa risoluzione. puoi preparare l'attività per la fotocamera e utilizzare la funzione di condivisione dalla fotocamera per utilizzare l'immagine a dimensione intera.

6

Il codice riportato di seguito avvierà la telecamera predefinita e farà in modo che la fotocamera salvi l'immagine sull'uria specificata. La chiave è mettere l'extra "MediaStore.EXTRA_OUTPUT" insieme con l'uri desiderato.

File file = new File(Environment.getExternalStorageDirectory().getPath() + "/Images/" + image_name + ".jpg"); 
Uri imageUri = Uri.fromFile(file); 

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 

startActivityForResult(intent, 0); 
+0

c'è un modo per salvare automaticamente il file una volta che l'immagine è stata scattata? o sarebbe meglio per l'utente decidere una volta che hanno acceso la fotocamera e fatto una foto. –