菜鸟笔记2——Android Camera调用

最简单的7步实现camera takePicture谷歌给出了代码,详见:http://code.google.com/p/openmobster/wiki/CameraTutorial

今天主要搞清了其中第6步,触发Button后实现拍照,这一段代码

ok,开始介绍:

1.'拍照'这一动作是由哪个method实现的呢?答案是——android.hardware.Camera类的方法

     public final void takePicture(Camera.ShutterCallback shutter,Camera.PictureCallback raw, Camera.PictureCallback postview, Camera.PictureCallback jpeg)

     我们把这个takePicture方法放在class IsiCamera1Activity extends Activity的

     内含类private class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback里

     这样当IsiCamera1Activity类里需要takePicture,只要调用camera.takePicture()即可,注意这里camera是private class CameraSurfaceView的一个object

2.是不是写一句camera.takePicture()就可以实现拍照呢?答案是差不多,但不够好。为什么呢?因为takePicture()并不是随时可以进行的!比如刚刚照完照,

    比如刚刚打开程序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类型时,如果一个class实现了该interface,
那么,就可以把该类的object的handle传递给该interface参数。这样,interface
参数可以回调class implement实现的interface里的方法。

   有点难懂是吗?

   这么说吧,通过这样的设定,当capture()方法被调用时,你可以:

   使用interface Camera.PictureCallback()里的方法,也就是可以使用abstract void onPictureTake()方法。

   这正是我们想要的,在onPictureTake()方法里的代码将实现照片的存储功能!

   看代码吧:

    这是在class IsiCamera1Activity 里调用capture方法的代码,可以看到我们把new Camera.PictureCallback()传递进去了

 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.照片的存储

   说实话上面那段程序openFIleOutput(STILL_IMAGEF_FILE,...), STILL_IMAGEF_FILE这个路径的父路径是什么我不知道,在sdcard里找了半天也没有找到。猜想是保存到内存里了吧,还真是浪费内存啊。

   转载下himi的blog好了~:

原文地址: http://blog.csdn.net/xiaominghimi/archive/2011/01/02/6113019.aspx

 

下面介绍如何把我们的数据通过 OutputStream/InputStream 存入SD卡中!

 

   其实将我们的数据放入SD卡中,无疑就需要对代码进行两处的修改:

 

注意:一定要有SD卡!对于如何创建SD卡在前一篇文章中已经说了两种方式,不会的童鞋可以去看下;

第一:检查是否装有SD卡;  

 

第二: 修改读入的地方(备注1)

         fis = this.openFileInput("save.himi"); //这里没有路径,路径是默认的 data-data-com.himi-files下 

      替换成我们的SD卡的路径就可以了:

          File path = new File("/sdcard/himi/save.himi");//这里新建一个File目录路径

          fis = new FileInputStream(path);传入路径

 

第三 : 修改写入的地方(备注2)

        fos = this.openFileOutput("save.himi", MODE_PRIVATE);这里也是默认路径,需要对其修改,

       注意:这里修改了,那么在finally中的判定大家也要对应的适当修改;

 

注意:如果是系统路径,当没有此文件的时候,android 会默认创建一个!但是我们放入SD卡的时候要自己创建目录路径和文件!

 

你可能感兴趣的:(android,interface,file,class,image,exception)