Android kamera amacı


Yanıtlar:


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
Bu harika çalışıyor, ancak ihtiyacınız olabilir: private static int TAKE_PICTURE = 1;
Chris Rae

11
GALAXY S TELEFONLARINDA ÇALIŞMIYOR :(
UMAR-MOBITSOLUTIONS

1
Neden sabit kodlanmış 'android.media.action.IMAGE_CAPTURE'. Bazı telefonlarda çalışmayabilir. Bunun için bir standart var mı? Belki de Intent.ACTION_GET_CONTENT ile ilgili bir şey?
AlikElzin-kilaka

7
@kilaka, MediaStore.ACTION_IMAGE_CAPTURE
Rob

2
Sen kullanmanız gerekebilir FileProviderAndroid'de> M. See burada
Nicolai Weitkemper

22

Burada bulduğum aşağıdakileri deneyin

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
Teşekkürler, ancak çekilen resim cihaza kaydedilmiyor, bu yüzden Uri'de FileNotFoundException alıyorum uri = Uri.parse (data.toURI ()); bitmap = android.provider.MediaStore.Images.Media .getBitmap (contentResolver, uri);
Alexander Oleynikov

Çektiğiniz fotoğrafın tercihinize göre telefonda / cihazda saklanmadığını mı yoksa bir şey olduğunu mu söylüyorsunuz ve görüntüyü telefonunuzda / cihazınızda saklamasını söylemenize rağmen kaydetmiyormuş gibi davranıyor mu?
Ryan

Bu resmin cihazda otomatik olarak depolanmadığını ancak onActivityResult () 'da bitmap olarak döndüğünü söylüyorum. Ancak cevapta bahsedeceğim bir çözüm buldum.
Alexander Oleynikov

Bu daha iyi cevap. En iyi cevap, görüntünün gereksiz bir kopyasını kaydeder. Bu, kullanıcının galeri uygulamasında bir yerine iki resim olarak görünür ve çoğu insan bunu hata olarak değerlendirir.
Thomas Dignan

7

Bunu çalıştırmam birkaç saatimi aldı. Kod , küçük bir farkla, developer.android.com adresinden neredeyse bir kopyala-yapıştır .

Bu izni şuradan isteyin AndroidManifest.xml:

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

Sizin üzerinde Activity, şunu tanımlayarak başlayın:

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

Sonra bunu Intentbir 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);
    }
}

Aşağıdaki destek yöntemini ekleyin:

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

Ardından sonucu alın:

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

Çalışmasını MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath))sağlayan şey, developer.android.com'daki koddan farklıdır . Orijinal kod bana bir FileNotFoundException.


Benim için aynı. Sanırım beni birkaç saat kurtardın. Android Dev kodunun neden bir GÇ istisnası verdiğine dair bir fikriniz var mı?
Coo

0

Aşağıdakileri deneyin buldum İşte bağlantı

Uygulamanız M ve üstünü hedeflerse ve verilmeyen KAMERA iznini kullandığını bildirirse, bu eylemi kullanmaya çalışmak bir Güvenlik İstisnası ile sonuçlanır.

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

Bu kütüphanede fotoğraf için çıktı yolu belirlemenin bir yolu yok ve bana göründüğü gibi bazı hatalar da var
Vlad

0

Bunu yapmanın oldukça basit bir yolunu buldum. on clickİşlevi başlatmak için bir dinleyici kullanarak açmak için bir düğme kullanın openc(), örneğin:

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

uriKonum dizesi ile istediğinizi yapabilirsiniz . Örneğin, resmi kırpmak için bir resim kırpıcıya gönderiyorum.


-3

bu kodu dene

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

6
Bu gönderi, yalnızca kod olduğu için otomatik olarak düşük kaliteli olarak işaretleniyor. Sorunu nasıl çözdüğünü açıklamak için biraz metin ekleyerek genişletebilir misiniz?
gung - Monica'yı eski haline
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.