2013-08-17 2 views
5

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

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

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

ответ

4

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

Я работаю над a library to simplify this, где вы просто добавить CameraFragment в приложение для базового просмотра UI, и называют takePicture() на ней, чтобы сделать снимок, с различными способами, чтобы настроить поведение (например, если снимки спасаются). Однако эта библиотека все еще работает.

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

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

Вы можете прочитать the Android developer documentation on the subject.

+0

У меня есть приложение, которое использует mediarecorder для записи видео и его не так велика. Разве что-то похожее на съемку? Я хочу получить изображение и наложить его на другое растровое изображение, чтобы создать файл. Пожалуйста, проверьте мой полный вопрос по этому вопросу: http: //stackoverflow.com/questions/18289544/taking-screenshot-programmatically-doesnt-capture -the-contents of-surfaceview – mremremre1

+0

Что делать, если я открываю камеру с камерой = Camera.open(); и используйте Camera.takePicture(), как видно из документации? – mremremre1

+0

@ mremremre1: «У меня есть приложение, которое использует медиарекордер для записи видео и его не так уж и много» - тогда я подозреваю, что вы не обрабатываете все устройства. Получение предварительного просмотра в одиночку, для портрета/пейзажа плюс обратная сторона/FFC, занимает много. «Что делать, если я открываю камеру с помощью камеры = Camera.open() и использую Camera.takePicture(), как видно из документации?» - это, безусловно, отправная точка. – CommonsWare

1

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

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

И вы сделали !!!

нашел here

Смежные вопросы