Android Kamera Absicht


Antworten:


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
Dies funktioniert hervorragend, obwohl Sie möglicherweise Folgendes benötigen: private static int TAKE_PICTURE = 1;
Chris Rae

11
NICHT AN GALAXYS TELEFONEN ARBEITEN :(
UMAR-MOBITSOLUTIONS

1
Warum die fest codierte 'android.media.action.IMAGE_CAPTURE'. Bei einigen Telefonen funktioniert dies möglicherweise nicht. Gibt es dafür einen Standard? Vielleicht etwas um Intent.ACTION_GET_CONTENT?
AlikElzin-Kilaka

7
@ Kilaka, MediaStore.ACTION_IMAGE_CAPTURE
Rob

2
Möglicherweise müssen Sie FileProviderin Android> M verwenden. Siehe hier
Nicolai Weitkemper

22

Versuchen Sie Folgendes, das ich hier gefunden habe

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
Vielen Dank, aber das aufgenommene Bild wird nicht auf einem Gerät gespeichert, daher erhalte ich FileNotFoundException in Uri uri = Uri.parse (data.toURI ()); bitmap = android.provider.MediaStore.Images.Media .getBitmap (contentResolver, uri);
Alexander Oleynikov

Wollen Sie damit sagen, dass das von Ihnen aufgenommene Bild nicht nach Ihrer Wahl auf dem Telefon / Gerät gespeichert wird oder etwas passiert, und obwohl Sie es anweisen, das Bild auf Ihrem Telefon / Gerät zu speichern, verhält es sich so, als würde es nicht gespeichert?
Ryan

Ich sage, dass das Bild nicht automatisch auf dem Gerät gespeichert wird, sondern als Bitmap in onActivityResult () zurückgegeben wird. Ich habe jedoch eine Lösung gefunden, die ich in einer Antwort erwähnen werde.
Alexander Oleynikov

Dies ist die bessere Antwort. Die oberste Antwort speichert ein unnötiges Duplikat des Bildes. Dies wird in der Galerie-App des Benutzers als zwei Bilder anstelle von einem angezeigt, was die meisten Leute als Fehler betrachten würden.
Thomas Dignan

7

Ich habe einige Stunden gebraucht, um das zum Laufen zu bringen. Der Code ist fast ein Copy-Paste von developer.android.com , mit einem kleinen Unterschied.

Fordern Sie diese Erlaubnis an AndroidManifest.xml:

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

Auf dem ActivityStarten dies durch die Definition:

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

Dann feuere dies Intentin einem 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);
    }
}

Fügen Sie die folgende Unterstützungsmethode hinzu:

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

Dann erhalten Sie das Ergebnis:

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

Was es zum Laufen gebracht hat, ist das MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath)), was sich vom Code von developer.android.com unterscheidet . Der ursprüngliche Code gab mir eine FileNotFoundException.


Auch für mich. Du hast mir wohl ein paar Stunden gespart. Irgendeine Idee, warum der Android Dev-Code eine E / A-Ausnahme gibt?
Coo

0

Versuchen Sie Folgendes, das ich gefunden habe. Hier ist ein Link

Wenn Ihre App auf M und höher abzielt und die Verwendung der nicht erteilten CAMERA-Berechtigung deklariert, führt der Versuch, diese Aktion zu verwenden, zu einer 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 dieser Bibliothek gibt es keine Möglichkeit, den Ausgabepfad für Fotos
Vlad

0

Ich habe einen ziemlich einfachen Weg gefunden, dies zu tun. Verwenden Sie eine Schaltfläche, um sie mit einem on clickListener zu öffnen und die Funktion openc()wie folgt zu starten :

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

Mit der uriStandortzeichenfolge können Sie tun, was Sie wollen . Zum Beispiel sende ich es an einen Bildausschnitt, um das Bild zuzuschneiden.


Worauf bezieht profilesich?
Miyalys

-3

Versuchen Sie diesen Code

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

6
Dieser Beitrag wird automatisch als minderwertig gekennzeichnet, da es sich nur um Code handelt. Würde es Ihnen etwas ausmachen, es durch Hinzufügen von Text zu erweitern, um zu erklären, wie es das Problem löst?
Gung - Reinstate Monica
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.