菜鳥ノート2——Android Camera呼び出し


最も簡単な7段階のcamera Take Picture Googleはコードを提供しています.詳細は以下の通りです.http://code.google.com/p/openmobster/wiki/CameraTutorial
今日は主にその中の第6ステップを確認しました.Buttonを触発して写真撮影を実現しました.
ok、紹介を開始します
1.「写真を撮る」という動作はどのmethodで行われますか?答えは――android.hardware.amera類の方法です.
     public final void TaePicture(Camera.ShutterCallback shutter、Camera.Picture Callback raw、Camera.Picture Callback postview、Camera.Picture Callback jpeg)
     私たちはこのTaePicture方法をclass IsiCamera 1 Activity extens Activityのに置きます.
     クラスprvate class Cameraa SurfaceView SurfaceVieds SurfaceView implements SurfaceHolder.Callbackに含まれています.
     このようにIsiCamera 1 Activity類ではタタリPictureが必要です.camera.TaePictureを呼び出すだけでいいです.ここでcameraはprvate class Camera SurfaceViewの一つのobjectです.
2.camera.take Picture()と書いたら写真を撮ることができますか?答えは似ていますが、あまり良くないです.なぜですか?take Pictureはいつでもできないからです.例えば、写真を撮り終わったばかりです.
    例えば、プログラムを開けたばかりのCamera camera.openがまだ実行されていないとき.だから判断します.
    具体的に採用した戦略はもう一つの手順を包むことです.
   
public boolean capture(Camera.PictureCallback jpegHandler) {
		if (camera != null) {
			camera.takePicture(null,null,jpegHandler);
			return true;
		} else {
			return false;
		}
	}
    そこで写真を撮るときは、この強化タイプのcapture方法を呼ぼう.
3.capture方法で伝わるパラメータは何ですか?答えは――一つのインターフェース!おかしいでしょう.でも下の文字を見たらinterfaceがパラメータを作るのは本当に強いと思います.
   一つの方法のパラメータがinterfaceタイプの場合、一つのクラスがinterfaceを実現すれば、このクラスのobjectのhandleをinterfaceパラメータに渡すことができる.このように、インターフェースパラメータは、class implementによって実現されるインターフェース内の方法をフィードバックすることができる.
   ちょっと分かりにくいですか?
   ということは、このような設定により、capture()メソッドが呼び出された時に、
   interface Camera.Picture Callbackの方法を使って、つまりabstract void onPicture Takeの方法を使うことができます.
   これはまさに私達が欲しいのです.onPictureTake()メソッドのコードは写真の保存機能を実現します.
   コードを見てください
    これはclass IsiCamera 1 Activityでcaptureメソッドを呼び出すコードです.new Camera.Picture Callbackを伝えました.
 cameraView.capture(new Camera.PictureCallback() {
                    public void onPictureTaken(byte[] data, Camera camera) {//Camera.PictureCallback interface
                        Log.v("Still", "Image data received from camera");  //   abstract void onPictureTake()  
                        FileOutputStream fos;
                        try {
                            // Fully qualified path name. In this case, we
                            // use the Files subdir
                            String pathForAppFiles = getFilesDir().getAbsolutePath();
                            pathForAppFiles = pathForAppFiles + "/" + STILL_IMAGE_FILE;
                            Log.d("Still image filename:", pathForAppFiles);

                            fos = openFileOutput(STILL_IMAGE_FILE, MODE_WORLD_READABLE);
                            fos.write(data);
                            fos.close();

                        } catch (Exception e) {
                            Log.e("Still", "Error writing file", e);
                        }
                    }
                });
 4.写真の保存
   実は上記のプログラムはオプンFIleOutput(STILLAGEFuFILE)、STILLです.IMAGEF_FILEというパスの父の経路は何ですか?分かりません.sdcardで探してみましたが、見つけられませんでした.メモリに保存したと思いますが、メモリの無駄ですね.
   ヒムのブログを転載してください.
原文の住所: http://blog.csdn.net/xiaominghimi/archive/2011/01/02/6113019.aspx
 
私たちのデータをOutputStream/InputStreamを通してSDカードにどうやって取り込むかを紹介します.
 
   実は私達のデータをSDカードに入れて、コードを二箇所修正する必要があります.
 
注意:必ずSDカードが必要です.どうやってSDカードを作るかについては前の文章でもう二つの方法を話しました.できない子供靴は見に行ってもいいです.
第一:SDカードがあるかどうかを確認する. 
 
第二:読み込んだ箇所を修正する(備考1)
         fis=this.openFileInput(「save.hisi」);ここにはパスがありません.パスはデフォルトのdata-data-come.hisi-filesの下です. 
      私たちのSDカードのパスを置き換えればいいです.
          File path=new File('/sdcard/hisi/save.hisi)//ここにFileディレクトリのパスを新規作成します.
          fis=new FileInputStream(path)着信経路
 
3番目 : 書き込みの箇所を変更する(備考2)
        fos=this.openFileOutput(「save.hisi」、MODE uPRIVATE)ここもデフォルトパスです.変更が必要です.
       注意:ここで修正したら、finallyでの判定も適切に修正します.
 
システムパスであれば、このファイルがない場合、アンディはデフォルトで作成します.しかし、私たちはSDカードを入れる時、自分でディレクトリパスとファイルを作成します.