Intento della fotocamera Android


Risposte:


178
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());
            }
        }
    }
}

5
Funziona benissimo, anche se potrebbe essere necessario: private static int TAKE_PICTURE = 1;
Chris Rae

11
NON FUNZIONA SUI TELEFONI GALAXY S :(
UMAR-MOBITSOLUTIONS

1
Perché l'hard coded "android.media.action.IMAGE_CAPTURE". Potrebbe non funzionare su alcuni telefoni. Esiste uno standard per questo? Forse qualcosa intorno a Intent.ACTION_GET_CONTENT?
AlikElzin-kilaka

7
@kilaka, MediaStore.ACTION_IMAGE_CAPTURE
Rob

2
Potrebbe essere necessario utilizzare FileProviderin Android> M. Vedi qui
Nicolai Weitkemper

22

Prova quanto segue che ho trovato qui

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();
    // ...
  }
}

2
Grazie ma la foto scattata non viene salvata su un dispositivo, quindi ricevo FileNotFoundException in Uri uri = Uri.parse (data.toURI ()); bitmap = android.provider.MediaStore.Images.Media .getBitmap (contentResolver, uri);
Alexander Oleynikov

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

Sto dicendo che l'immagine non viene archiviata automaticamente sul dispositivo, ma ritorna come bitmap in onActivityResult (). Tuttavia ho trovato una soluzione che menzionerò in una risposta.
Alexander Oleynikov

Questa è la risposta migliore. La risposta in alto salva un duplicato non necessario dell'immagine. Questo appare nell'app della galleria dell'utente come due immagini invece di una, che la maggior parte delle persone considererebbe un bug.
Thomas Dignan

7

Mi ci sono volute alcune ore per farlo funzionare. Il codice è quasi un copia-incolla da developer.android.com , con una piccola differenza.

Richiedi questa autorizzazione su AndroidManifest.xml:

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

Sul tuo Activity, inizia definendo questo:

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

Quindi spara questo Intentin 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);
    }
}

Aggiungi il seguente metodo di supporto:

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

Quindi ricevi 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 lo ha fatto funzionare è il MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath)) , che è diverso dal codice di developer.android.com . Il codice originale mi ha dato un file FileNotFoundException.


Stessa cosa per me. Mi hai risparmiato un paio d'ore suppongo. Qualche idea sul perché il codice Android Dev stia dando un'eccezione IO?
Coo

0

Prova quanto segue ho trovato qui un link

Se la tua app è destinata a M e versioni successive e dichiara di utilizzare l'autorizzazione CAMERA che non è stata concessa, il tentativo di utilizzare questa azione genererà un'eccezione 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);
        }
    });
}

In questa libreria non c'è modo di impostare il percorso di output per la foto e ci sono anche alcuni bug come mi sembrava
Vlad

0

Ho trovato un modo abbastanza semplice per farlo. Utilizzare un pulsante per aprirlo utilizzando un on clicklistener per avviare la funzione openc(), in questo modo:

String fileloc;
private void openc()
{
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File f = null;
    try 
    {
        f = File.createTempFile("temppic",".jpg",getApplicationContext().getCacheDir());
        if (takePictureIntent.resolveActivity(getPackageManager()) != null)
        {               
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,FileProvider.getUriForFile(profile.this, BuildConfig.APPLICATION_ID+".provider",f));
            fileloc = Uri.fromFile(f)+"";
            Log.d("texts", "openc: "+fileloc);
            startActivityForResult(takePictureIntent, 3);
        }
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 3 && resultCode == RESULT_OK) {
        Log.d("texts", "onActivityResult: "+fileloc);
        // fileloc is the uri of the file so do whatever with it
    }
}

Puoi fare quello che vuoi con la uristringa di posizione. Ad esempio, lo invio a un ritagliatore di immagini per ritagliare l'immagine.


-3

prova questo codice

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

6
Questo post viene automaticamente contrassegnato come di bassa qualità perché è solo codice. Ti dispiacerebbe ampliarlo aggiungendo del testo per spiegare come risolve il problema?
gung - Ripristina Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.