Android手机实现拍照的2种方法(一)

2014-11-24 09:17:28 · 作者: · 浏览: 0

开发照相功能,实现大致有2种方法,可供大家参考:


1.调用系统摄像头来拍照


首先,找到AndroidManifest.xml文件里加入用户权限





其次,在主类java文件里加入2个控件(button和imageview),是用来触发按钮事件和显示图片的,纯是个人爱好


final int TAKE_PICTURE = 1;//为了表示返回方法中辨识你的程序打开的相机


关键是这里:startActivityForResult(new Intent("android.media.action.IMAGE_CAPTURE"), TAKE_PICTURE);


是打开系统自带相机,以下是处理拍照得到的数据,将数据保存下来


protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == TAKE_PICTURE) {
if (resultCode == RESULT_OK) {
Bitmap bm = (Bitmap) data.getExtras().get("data");
img.setImageBitmap(bm);//想图像显示在ImageView视图上,private ImageView img;
File myCaptureFile = new File("sdcard/123456.jpg");
try {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));

bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);


bos.flush();


bos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}


这样就能实现调用系统自带的摄像头了,很简单的操作。


2.自己写程序来保存照片



照片格局文件lay.xml里要先进行这些定义


< xml version="1.0" encoding="utf-8" >
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="130px"
android:paddingRight="200px"
>
android:id="@+id/mSurfaceView1"
android:visibility="visible"
android:layout_width="320px"
android:layout_height="240px">




其中SurfaceView是用来进行预览的,


在Oncreat函数里初始化一系列的值:


requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.lay);



DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
// mImageView01 = (ImageView) findViewById(R.id.myImageView1);


mSurfaceView01 = (SurfaceView) findViewById(R.id.mSurfaceView1);


mSurfaceHolder01 = mSurfaceView01.getHolder();


mSurfaceHolder01.addCallback(takephoto.this);


mSurfaceHolder01.setType
(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);


首先进行初始化照相机的功能函数和参数设置:


private Camera mCamera01;


mCamera01 = Camera.open();



Camera.Parameters parameters = mCamera01.getParameters();


parameters.setPictureFormat(PixelFormat.JPEG);
Log.i(TAG, "pic is jpeg");


parameters.setPreviewSize(320, 240);
Log.i(TAG, "pic pingmu fenbianlv");


parameters.setPictureSize(1024, 768);
Log.i(TAG, "pic tupian fenbianlv");


mCamera01.setParameters(parameters);


mCamera01.setPreviewDisplay(mSurfaceHolder01);


mCamera01.startPreview();


初始化成功后就可以进行拍照了,拍照函数依然是通过调用camera类的函数来实现


mCamera01.takePicture
(shutterCallback, rawCallback, jpegCallback);


只需实现jpegCallback这个回调函数来就行解码、保存即可,前2个参数可以直接设为null,不过系统一般会自动帮你把这些都写进来的


private PictureCallback jpegCallback = new PictureCallback()
{
public void onPictureTaken(byte[] _data, Camera _camera)
{