Как сделать фото с камеры без намерения

Я хочу, чтобы мое приложение могло делать фотографии без использования другого приложения. Код, который я использовал:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File photo = null;
    try
    {
        photo = this.createTemporaryFile("picture", ".jpg");
        photo.delete();
    }
    catch(Exception e)
    {
        Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();

    }
    mImageUri = Uri.fromFile(photo);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);
    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

Но этот код использует основное приложение камеры телефона. Может ли кто-нибудь дать мне код?


person mremremre1    schedule 17.08.2013    source источник


Ответы (3)


Сделать снимок напрямую с помощью класса Camera безумно сложно.

Я работаю над библиотекой, чтобы упростить это, где вы просто добавляете CameraFragment в свое приложение для базовый пользовательский интерфейс предварительного просмотра и вызовите takePicture(), чтобы сделать снимок, с различными способами настройки поведения (например, где сохраняются изображения). Тем не менее, эта библиотека все еще находится в стадии разработки.

Может ли кто-нибудь дать мне код?

«Некоторый код» будет состоять из тысяч строк (для полной реализации, включая работу с различными странностями, специфичными для устройства).

Вы можете прочитать документацию для разработчиков Android по этому вопросу.

person CommonsWare    schedule 17.08.2013
comment
У меня есть приложение, которое использует медиарекордер для записи видео, и оно не такое уж большое. Нет ли чего-то подобного для фотосъемки? Я хочу получить изображение и наложить его на другое растровое изображение, чтобы создать файл. Пожалуйста, ознакомьтесь с моим полным вопросом по этому поводу: stackoverflow.com/questions/18289544/ - person mremremre1; 17.08.2013
comment
Что если я открою камеру с помощью camera = Camera.open(); и использовать Camera.takePicture(), как показано в документации? - person mremremre1; 17.08.2013
comment
@ mremremre1: у меня есть приложение, которое использует медиарекордер для записи видео, и оно не такое уж большое, тогда я подозреваю, что вы не работаете со всеми устройствами. Для корректного предварительного просмотра в одиночку, для портретной/пейзажной плюс задней/FFC, требуется много времени. Что если я открою камеру с помощью camera = Camera.open(); и использовать Camera.takePicture(), как показано в документации? -- это, безусловно, отправная точка. - person CommonsWare; 17.08.2013
comment
Спасибо попробую. Вы видели другой вопрос? Потому что, если есть способ сделать снимок экрана непосредственно из SurfaceView, мне не придется использовать API-интерфейс камеры. - person mremremre1; 17.08.2013
comment
@mremremre1: Насколько я знаю, вы не можете сделать скриншот SurfaceView. - person CommonsWare; 17.08.2013
comment
Проклятие. Затем я попробую сделать фото и наложить на него скриншот макета xml. - person mremremre1; 17.08.2013
comment
@mremremre1: Если ваше приложение предназначено только для уровня API 14+, вы можете увидеть, позволяет ли TextureView делать снимки экрана (developer.android.com/reference/android/view/TextureView.html), хотя я подозреваю, что это тоже не сработает. - person CommonsWare; 17.08.2013
comment
@CommonsWare есть ли какая-нибудь библиотека для захвата изображения в фоновом режиме без предварительного просмотра .. ?? - person android learner; 06.05.2015

после того, как у вас установлен предварительный просмотр камеры, вам нужно сделать следующее...

protected static final int MEDIA_TYPE_IMAGE = 0; 

public void capture(View v)
{   
    PictureCallback pictureCB = new PictureCallback() {
        public void onPictureTaken(byte[] data, Camera cam) {
          File picFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
          if (picFile == null) {
            Log.e(TAG, "Couldn't create media file; check storage permissions?");
            return;
          }

          try {
            FileOutputStream fos = new FileOutputStream(picFile);
            fos.write(data);
            fos.close();
          } catch (FileNotFoundException e) {
            Log.e(TAG, "File not found: " + e.getMessage());
            e.getStackTrace();
          } catch (IOException e) {
            Log.e(TAG, "I/O error writing file: " + e.getMessage());
            e.getStackTrace();
          }
        }
      };
      camera.takePicture(null, null, pictureCB);
}

И функция getOutputMediaFile:

private File getOutputMediaFile(int type) 
{
      File dir = new File(Environment.getExternalStoragePublicDirectory(
                    Environment.DIRECTORY_PICTURES), getPackageName());
      if (!dir.exists()) 
      {
        if (!dir.mkdirs()) 
        {
          Log.e(TAG, "Failed to create storage directory.");
          return null;
        }
      }
      String timeStamp = new SimpleDateFormat("yyyMMdd_HHmmss", Locale.UK).format(new Date());
      if (type == MEDIA_TYPE_IMAGE) 
      {
        return new File(dir.getPath() + File.separator + "IMG_"+ timeStamp + ".jpg");
      } 
      else 
      {
        return null;
      }
}

И готово!!!

нашел это здесь

person Pontios    schedule 08.07.2014
comment
Слава Богу за это :D - person Pontios; 20.03.2019

Камера устарела в API 21, новым способом является использование android.hardware .камера2.

Чтобы перечислить, запросить и открыть доступные камеры, получите CameraManager. пример.

Подводя итог:

  1. Получите экземпляр диспетчера камер, вызвав Context.getSystemService(String)
  2. Получите string[] идентификаторов камер устройства, позвонив по номеру CameraManager.GetCameraIdList().
  3. Вызовите CameraManager.OpenCamera(...) с нужным идентификатором камеры из предыдущего шага.

Как только камера будет открыта, будет вызван обратный вызов, предоставленный в OpenCamera(...).

person Moffen    schedule 12.11.2018