Назначение камеры Android

Мне нужно отправить намерение в приложение камеры по умолчанию, чтобы оно сделало снимок, сохранило его и вернуло URI. Есть какой-либо способ сделать это?


person Alexander Oleynikov    schedule 28.04.2010    source источник
comment
См. ссылку ниже stackoverflow.com/questions /13977245/   -  person Karthik Sridharan    schedule 14.10.2016


Ответы (6)


Попробуйте следующее, что я нашел здесь

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();
    // ...
  }
}
person Ryan    schedule 28.04.2010
comment
Спасибо, но сделанное изображение не сохраняется на устройстве, поэтому я получаю FileNotFoundException в Uri uri = Uri.parse(data.toURI()); растровое изображение = android.provider.MediaStore.Images.Media .getBitmap (contentResolver, uri); - person Alexander Oleynikov; 28.04.2010
comment
Вы говорите, что изображение, которое вы делаете, не сохраняется на телефоне/устройстве по вашему выбору, или что-то происходит, и даже если вы говорите ему сохранить изображение на вашем телефоне/устройстве, оно действует так, как будто оно не сохраняется? - person Ryan; 28.04.2010
comment
Я говорю, что изображение не сохраняется на устройстве автоматически, а возвращается в виде растрового изображения в onActivityResult(). Однако я нашел решение, о котором упомяну в ответе. - person Alexander Oleynikov; 29.04.2010
comment
Это лучший ответ. Верхний ответ сохраняет ненужную копию изображения. Это отображается в приложении галереи пользователя как два изображения вместо одного, что большинство людей сочло бы ошибкой. - person Thomas Dignan; 15.05.2013

Мне потребовалось несколько часов, чтобы заставить это работать. Код почти скопирован с сайта developer.android.com с незначительная разница.

Запросите это разрешение на AndroidManifest.xml:

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

На вашем Activity начните с определения этого:

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

Затем запустите этот Intent в 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);
    }
}

Добавьте следующий метод поддержки:

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

Затем получите результат:

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

Что заставило его работать, так это MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath)), который отличается от кода с developer.android.com< /а>. Исходный код дал мне FileNotFoundException.

person Albert Vila Calvo    schedule 10.08.2015
comment
Мне то же самое. Полагаю, вы сэкономили мне несколько часов. Любая идея, почему код Android Dev дает исключение ввода-вывода? - person Coo; 09.08.2016

Я нашел довольно простой способ сделать это. Используйте кнопку, чтобы открыть его, используя прослушиватель on click, чтобы запустить функцию openc(), например:

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

Вы можете делать все, что хотите, со строкой местоположения uri. Например, я отправляю его в обрезчик изображений, чтобы обрезать изображение.

person Aishik kirtaniya    schedule 31.05.2018

Попробуйте следующее, что я нашел Вот ссылка

Если ваше приложение нацелено на M и выше и объявляет, что использует разрешение CAMERA, которое не предоставлено, то попытка использовать это действие приведет к исключению 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);
        }
    });
}
person mohit rathore    schedule 11.01.2018
comment
В этой библиотеке нет возможности задать выходной путь для фото и также есть некоторые баги, как мне показалось - person Vlad; 11.02.2019

попробуйте этот код

Intent photo= new Intent("android.media.action.IMAGE_CAPTURE");
                    startActivityForResult(photo, CAMERA_PIC_REQUEST);
person anupam sharma    schedule 12.06.2014
comment
Этот пост автоматически помечен как низкокачественный, потому что это всего лишь код. Не могли бы вы расширить его, добавив текст, объясняющий, как он решает проблему? - person gung - Reinstate Monica; 12.06.2014

person    schedule
comment
Есть ли возможность открыть переднюю камеру устройства от намерения?? - person Dimon; 06.09.2012
comment
Это прекрасно работает, хотя вам может понадобиться: private static int TAKE_PICTURE = 1; - person Chris Rae; 16.11.2012
comment
@Александр О. - отличный код, спасибо! я разместил полную полнофункциональную реализацию этого на stackoverflow.com/a/13446838/1166727 - person tony gil; 19.11.2012
comment
НЕ РАБОТАЕТ НА ТЕЛЕФОНАХ GALAXY S :( - person UMAR-MOBITSOLUTIONS; 20.12.2012
comment
Почему жестко закодировано «android.media.action.IMAGE_CAPTURE». Это может не работать на некоторых телефонах. Есть ли стандарт для этого? Возможно, что-то вокруг Intent.ACTION_GET_CONTENT? - person AlikElzin-kilaka; 13.02.2013
comment
@kilaka, MediaStore.ACTION_IMAGE_CAPTURE - person Rob; 13.02.2013
comment
Решающее значение для успешного функционирования этого кода имеет статический код запроса int TAKE_PICTURE. Было бы полезно, если бы вы рассказали читателям, какую ценность это имеет. - person Andrew S; 27.05.2013
comment
работает на HTC one. Хотя мне пришлось удалить константу TAKE_PICTURE в случае и поставить вместо нее константу 1. Android жаловался на отсутствие здесь константы. - person newshorts; 22.07.2013
comment
Существует ошибка с устройствами Samsung, они не отображают изображения, сделанные из вашего приложения, хотя они будут сохранены в галерее. - person San; 17.12.2013
comment
Не работает на Xperia UL. imageUri и selectedImage будут нулевыми, и произойдет исключение нулевого указателя. - person Ataru; 30.04.2015
comment
Я обнаружил, что было отставание во времени. И я решил эту проблему, установив задержку, используя Handler.postDelayed(), чтобы переменная imageUril не могла быть нулевой в onActivityResult(). - person Ataru; 30.04.2015
comment
используйте это: Intent cameraIntent = new Intent (android.provider.MediaStore.ACTION_IMAGE_CAPTURE); - person Reza Bigdeli; 15.09.2015
comment
Возможно, вам придется использовать FileProvider в Android › M. См. здесь - person Nicolai Weitkemper; 03.08.2019