2013-08-17 24 views
5

Voglio che la mia app sia in grado di catturare foto senza utilizzare un'altra applicazione. Il codice che ho usato:Come catturare una foto dalla fotocamera senza intenzione

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    File photo = null; 
    try 
    { 
     photo = this.createTemporaryFile("picture", ".jpg"); 
     photo.delete(); 
    } 
    catch(Exception e) 
    { 
     Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show(); 

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

Ma questo codice utilizza l'app fotocamera principale del telefono. Qualcuno può darmi un po 'di codice?

risposta

4

Scattare una foto direttamente utilizzando la classe Camera è follemente complicata per essere corretta.

Sto lavorando su a library to simplify this, in cui si aggiunge solo un CameraFragment per la vostra applicazione per l'interfaccia utente di anteprima di base, e chiamare takePicture() su di esso per scattare una foto, con i vari modi per configurare il comportamento (per esempio, in cui le immagini vengono salvate). Tuttavia, questa libreria è ancora in corso.

Qualcuno può darmi qualche codice?

"Un po 'di codice" sarà lungo migliaia di righe (per un'implementazione completa, compresa la gestione di varie strane specifiche del dispositivo).

Siete invitati a leggere the Android developer documentation on the subject.

+0

Ho un app che utilizza il mediarecorder di registrare video e non è così grande. Non c'è qualcosa di simile per le immagini? Quello che voglio è ottenere un'immagine e sovrapporla con un'altra bitmap per creare un file. Consulta la mia domanda completa al riguardo: http: //stackoverflow.com/questions/18289544/taking-screenshot-programmatically-doesnt-capture -the-contents-of-surfaceview – mremremre1

+0

Cosa succede se apro la fotocamera con camera = Camera.open(); e utilizzare Camera.takePicture() come si vede nella documentazione? – mremremre1

+0

@ mremremre1: "Ho un'app che usa il mediarecorder per registrare video e non è così grande", quindi sospetto che non stai gestendo tutti i dispositivi. Ottenere le anteprime corrette da solo, per il ritratto/paesaggio più il lato posteriore/FFC, richiede molto. "Cosa succede se apro la videocamera con camera = Camera.open() e utilizzo Camera.takePicture() come visto nella documentazione?" - Questo è certamente il punto di partenza. – CommonsWare

1

una volta che hai il set di anteprima della fotocamera, è necessario eseguire le seguenti operazioni ...

protected static final int MEDIA_TYPE_IMAGE = 0; 

public void capture(View v) 
{ 
    PictureCallback pictureCB = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera cam) { 
      File picFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); 
      if (picFile == null) { 
      Log.e(TAG, "Couldn't create media file; check storage permissions?"); 
      return; 
      } 

      try { 
      FileOutputStream fos = new FileOutputStream(picFile); 
      fos.write(data); 
      fos.close(); 
      } catch (FileNotFoundException e) { 
      Log.e(TAG, "File not found: " + e.getMessage()); 
      e.getStackTrace(); 
      } catch (IOException e) { 
      Log.e(TAG, "I/O error writing file: " + e.getMessage()); 
      e.getStackTrace(); 
      } 
     } 
     }; 
     camera.takePicture(null, null, pictureCB); 
} 

E la funzione getOutputMediaFile:

private File getOutputMediaFile(int type) 
{ 
     File dir = new File(Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_PICTURES), getPackageName()); 
     if (!dir.exists()) 
     { 
     if (!dir.mkdirs()) 
     { 
      Log.e(TAG, "Failed to create storage directory."); 
      return null; 
     } 
     } 
     String timeStamp = new SimpleDateFormat("yyyMMdd_HHmmss", Locale.UK).format(new Date()); 
     if (type == MEDIA_TYPE_IMAGE) 
     { 
     return new File(dir.getPath() + File.separator + "IMG_"+ timeStamp + ".jpg"); 
     } 
     else 
     { 
     return null; 
     } 
} 

e si è fatto !!!

giudicano here