2010-04-28 22 views
81

Ho bisogno di spingere un intento all'applicazione della fotocamera di default per farlo scattare una foto, salvarlo e restituire un URI. C'è un modo per fare questo?intenzione fotocamera Android

+0

consultare sul link qui sotto http://stackoverflow.com/questions/13977245/android-open-camera-from-button/40041381#40041381 –

risposta

161
private static final int TAKE_PICTURE = 1;  
private Uri imageUri; 

public void takePhoto(View view) { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    File photo = new File(Environment.getExternalStorageDirectory(), "Pic.jpg"); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, 
      Uri.fromFile(photo)); 
    imageUri = Uri.fromFile(photo); 
    startActivityForResult(intent, TAKE_PICTURE); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    switch (requestCode) { 
    case TAKE_PICTURE: 
     if (resultCode == Activity.RESULT_OK) { 
      Uri selectedImage = imageUri; 
      getContentResolver().notifyChange(selectedImage, null); 
      ImageView imageView = (ImageView) findViewById(R.id.ImageView); 
      ContentResolver cr = getContentResolver(); 
      Bitmap bitmap; 
      try { 
       bitmap = android.provider.MediaStore.Images.Media 
       .getBitmap(cr, selectedImage); 

       imageView.setImageBitmap(bitmap); 
       Toast.makeText(this, selectedImage.toString(), 
         Toast.LENGTH_LONG).show(); 
      } catch (Exception e) { 
       Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT) 
         .show(); 
       Log.e("Camera", e.toString()); 
      } 
     } 
    } 
} 
+0

Esiste la possibilità di aprire una fotocamera frontale del dispositivo dall'intenzione ?? – Dimon

+4

Funziona alla grande, anche se potrebbe essere necessario: int statico privato TAKE_PICTURE = 1; –

+0

@Aleksander O. - ottimo codice, grazie!Ho pubblicato un'implementazione completa e completamente funzionale di questo sito all'indirizzo http://stackoverflow.com/a/13446838/1166727 –

18

provare il seguente ho trovato here

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

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == Activity.RESULT_OK && requestCode == 0) { 
    String result = data.toURI(); 
    // ... 
    } 
} 
+1

Grazie, ma preso foto non è il risparmio di un dispositivo in modo da ottenere FileNotFoundException in Uri uri = Uri.parse (data.toURI()); bitmap = android.provider.MediaStore.Images.Media .getBitmap (contentResolver, uri); –

+0

Stai dicendo che la foto che fai non viene memorizzata sul telefono/dispositivo a tua scelta o qualcosa sta succedendo e anche se gli dici di memorizzare l'immagine sul tuo telefono/dispositivo, si comporta come se non stesse salvando? – Ryan

+0

Sto dicendo che l'immagine non viene memorizzata sul dispositivo automaticamente ma restituisce come bitmap in onActivityResult(). Tuttavia ho trovato una soluzione che menzionerò in una risposta. –

0

provare questo codice

Intent photo= new Intent("android.media.action.IMAGE_CAPTURE"); 
        startActivityForResult(photo, CAMERA_PIC_REQUEST); 
+4

Questo post viene contrassegnato automaticamente come di bassa qualità perché è solo un codice. Ti dispiacerebbe espanderlo aggiungendo del testo per spiegare come risolve il problema? – gung

6

Ci ho messo qualche ora per ottenere questo lavoro. Il codice è quasi un copia-incolla da developer.android.com, con una piccola differenza.

Richiedi questo autorizzazione sul AndroidManifest.xml:

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

Sul Activity, inizia definendo questo:

static final int REQUEST_IMAGE_CAPTURE = 1; 
private Bitmap mImageBitmap; 
private String mCurrentPhotoPath; 
private ImageView mImageView; 

poi il fuoco questa Intent in un onClick:

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
if (cameraIntent.resolveActivity(getPackageManager()) != null) { 
    // Create the File where the photo should go 
    File photoFile = null; 
    try { 
     photoFile = createImageFile(); 
    } catch (IOException ex) { 
     // Error occurred while creating the File 
     Log.i(TAG, "IOException"); 
    } 
    // Continue only if the File was successfully created 
    if (photoFile != null) { 
     cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 
     startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE); 
    } 
} 

Add il seguente mi supporta ThOD:

private File createImageFile() throws IOException { 
    // Create an image file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "JPEG_" + timeStamp + "_"; 
    File storageDir = Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES); 
    File image = File.createTempFile(
      imageFileName, // prefix 
      ".jpg",   // suffix 
      storageDir  // directory 
    ); 

    // Save a file: path for use with ACTION_VIEW intents 
    mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
    return image; 
} 

Verrà visualizzato il risultato:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 
     try { 
      mImageBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath)); 
      mImageView.setImageBitmap(mImageBitmap); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Ciò che ha reso il lavoro è la MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath)), che è diverso dal codice da developer.android.com. Il codice originale mi ha dato un FileNotFoundException.

+0

Lo stesso per me. Mi hai salvato per qualche ora, suppongo. Qualche idea sul perché il codice Dev del Android sta dando un'eccezione IO? – Coo

0

provare il seguente ho trovato Ecco a link

Se i vostri obiettivi app me oltre e dichiara come con il permesso macchina fotografica che non è concessa, quindi il tentativo di utilizzare questa azione si tradurrà in una SecurityException.

EasyImage.openCamera(Activity activity, int type);

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    EasyImage.handleActivityResult(requestCode, resultCode, data, this, new DefaultCallback() { 
     @Override 
     public void onImagePickerError(Exception e, EasyImage.ImageSource source, int type) { 
      //Some error handling 
     } 

     @Override 
     public void onImagesPicked(List<File> imagesFiles, EasyImage.ImageSource source, int type) { 
      //Handle the images 
      onPhotosReturned(imagesFiles); 
     } 
    }); 
}