最简单的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卡的时候要自己创建目录路径和文件!