2013-08-17 15 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クラスを使用して直接写真を撮ることはちょっと難解です。

私は写真が保存されます動作を設定するための様々な方法(例えば、で、あなただけの基本的なプレビューUIのためにアプリにCameraFragmentを追加し、写真を撮るためにそれにtakePicture()を呼び出すa library to simplify this、に取り組んでいます)。しかし、このライブラリはまだ進行中です。

誰か私にいくつかのコードを教えてもらえますか?

「いくつかのコード」は、さまざまなデバイス固有の奇妙さを扱うなど、完全な実装では数千行になるでしょう。

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