今天开始学习Android摄像头的使用,具体功能包括预览,点击按钮拍照,能后保存到指定的位置。因为现在刚开始学习,所以做这些简单的处理,以后会慢慢增加对图像的各种处理。

因为摄像头的运用涉及到拍摄图像和保存操作,这就会涉及到文件的读写操作,看了下JAVA里面关于文件操作的类,相关的表述如下:

按照数据传输的方向,将字节序列从应用程序传递到外设或外存的流称为输出流,将字节序列从外设或外存传递到应用程序的流称为输出流。

在JAVA IO 包中提供了FileInputStream类和FileOutputStream类用于对文件的输入和输出,与RandomAccessFile类不同的是,这两个类对文件的处理方式是对文件中数据流的顺序读写而不是利用文件指针进行随机定位读写。

对于文件输入流FileInputStream,如果文件输入指向的文件不存在,则系统抛出FileNotFoundException.而输出

例如下面的代码中,在拍照完图片后自动进行保存工作

private PictureCallback
jpegCallback = new PictureCallback(){
@Override
public void
onPictureTaken(byte[] data, Camera camera) {
//
TODO Auto-generated method stub
try
{
button_cancel.setVisibility(View.VISIBLE);
button_snap.setVisibility(View.VISIBLE);
button_save.setVisibility(View.VISIBLE);
//在sd卡的根目录下创建一个名为dirname的文件夹
//Environment.getExternalStorageDirectory()为获取sd卡的根目录
File
file = new File(Environment.getExternalStorageDirectory(),
dirname);
Log.i(TAG,"click
button2:" + file.getAbsolutePath());
//如果这个文件夹存在,则跳过,否则创建一个。
if(!file.exists())
{
file.mkdir();
}
//定义文件的名称为当前时间的毫秒
//数+camera.jpg,形如875camera.jpg filename
= String.valueOf(calendar.get(Calendar.MILLISECOND))+
"camera.jpg";
//实例化一个File 对象 File
n = new File(file,
filename); //用文件n的绝对路径初始化一个文件输出流对象bos
FileOutputStream
bos = new
FileOutputStream(n.getAbsolutePath());
//将data数组里面拍摄到的数据写入filename文件中。 bos.write(data);
bos.close();
//将数据写成bmp格式的图片 // bmp
= BitmapFactory.decodeByteArray(data, 0, data.length);
}
catch (Exception e) {
//
TODO: handle exception
e.printStackTrace();
} } };

绝对路径:是从盘符开始的位置,比如c:\\照片\许慧欣.jpg

相对路径:相对路径是指相对于另一个位置的位置,比如在上面的照片文件夹下面还有另一个文件夹,命名为地图,地图文件夹下面有个文件叫做中国地图.jpg。则这个 中国地图.jpg相对于文件许慧欣.jpg的相对地址为 地图\中国地图.jpg。

相对路径对要给出一个相对的位置,一般可以当做是当前路径开始的路径,比如当前路径为 c:\\照片,则许慧欣.jpg的相对路径就为 许慧欣.jpg,而不用将c:\\照片列出。

所有的程序代码都贴到这上面来,方便以后查看:

TestCameraActivity.java文件如下:
public class TestCameraActivity extends Activity implements
SurfaceHolder.Callback
{
private AutoFocusCallback mAutoFocusCallback =
new AutoFocusCallback();
private static final String TAG
="TestCameraActivity";
private Camera mCamera;
private SurfaceView mSurfaceView;
private SurfaceHolder mHolder;
private Bitmap bmp;
private String dirname="wanping";
private String filename;
private Calendar calendar;
private int flag=3;
private int cnt = 1;
private Button button_save,
button_cancel,button_snap;
@Override
public void
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); requestWindowFeature(Window.FEATURE_NO_TITLE); this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.camera);
mSurfaceView = (SurfaceView)findViewById(R.id.mySurfaceView);
mHolder = mSurfaceView.getHolder();
mHolder.addCallback(TestCameraActivity.this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
calendar = Calendar.getInstance();
button_snap = (Button)findViewById(R.id.btn1);
button_cancel = (Button)findViewById(R.id.btn2);
button_save = (Button)findViewById(R.id.btn3);
mCamera=getCameraInstance();
//点击拍照按钮后执行的动作,实现自动对焦能后拍照
button_snap.setOnClickListener(new Button.OnClickListener(){
@Override
public void
onClick(View v) {
//
TODO Auto-generated method stub