您的位置:首页 > 移动开发 > Android开发

[Android] 实现简单的相机程序

2015-01-25 01:46 387 查看
好久没写了,有些东西做过都快忘了,赶紧记一下。

现在来实现一个简单的相机程序。

原文地址/article/5262224.html

当然需要的话可以直接调用系统的camera程序,但自己实现会使用更自由。

呐,既然要用实现相机,那就需要先了解一下调用camera的类android.hardware.camera

<?xml version="1.0" encoding="utf-8"?>
<resources>

<string name="app_name">Demo_camera</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
<string name="camera_btn_back">Back</string>
<string name="camera_btn_takephoto">TakePic</string>
<string name="main_btn_open_camera">Open Camera</string>

<color name="RoyalBlue">#4169E1</color>
</resources>


strings.xml

经过以上步骤,我们的设备就可以用摄像头进行预览了,预览时随意移动设备还可以自动对焦,效果如下图:



不过,这个是用DDMS截的图,如果是拍照,实际画面尺寸会与看到的稍有差别,原因在代码里也有写。

关于拍照takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)的使用也很简单,在回调PictureCallback中重写public void onPictureTaken(byte[] data, Camera camera) {}方法,data就是图片数据,用bitmapfactory来decode一下,再处理一下显示的旋转方向与尺寸就ok了,这部分代码有空再补吧。

好了,又复习一遍这个过程发现还是蛮简单的。多看看官方的文档就好。ok,收工睡觉。

参考资料:

如何实现android手机摄像头的的自动对焦

android sdk docs

Feb.2nd

快放假了,年底略忙,项目需要年前赶个版本出来。

把上次的拍照过程补一下:

主要是拍照的回调方法,也就对拍照得到的数据按自己的需求处理一下,简单地decode成Bitmap就可以,然后加你想要的动画,另外加一些滤镜啊什么的效果,也就是一些数字图像处理算法,这个不在拍照范畴之内。下面的方法我仅仅对照片方向做了处理,然后缩放0.8倍在主界面显示(懒得再写个view放照片了,就用imageview显示,为了有点差别就缩小图片了

private final class MyPictureCallback implements PictureCallback {

@Override
public void onPictureTaken(byte[] data, Camera camera) {
// TODO Auto-generated method stub

try {

Bitmap bitmapRotate = BitmapFactory.decodeByteArray(data, 0, data.length);

Bitmap mBmp = bitmapRotate;
int nDegree = getPictureDegree(mActivity, mCameraInfo);
if (nDegree != 0) {
Matrix matrix = new Matrix();
matrix.preRotate(nDegree);
mBmp = Bitmap.createBitmap(bitmapRotate, 0, 0, bitmapRotate.getWidth(), bitmapRotate.getHeight(), matrix, true);
}

Bitmap bmpScale = Bitmap.createScaledBitmap(mBmp, (int) (mScreenWidth * 0.8), (int) (mScreenHeight * 0.8), true);

if (mListener != null)
mListener.onTakePic(bmpScale);
closeCamera();

} catch (Exception e) {
e.printStackTrace();
}
}
}


写好回调后在takePhoto按钮事件下补充:

if (mCamera != null)
mCamera.takePicture(null, null, new MyPictureCallback());


在back按钮下补充:

takePicCancle();


cameraView最后补充代码:

  public void closeCamera() {
if (mCamera != null) {
mCamera.stopPreview();
mCamera.release(); // 释放照相机
mCamera = null;
mCameraInfo = null;
}
}

public void takePicCancle() {
closeCamera();
// sigCameraCancle.emit();
if (mListener != null)
mListener.onBack();
}


为了让mainActivity能得到在camera里的按钮事件反馈,在cameraView中加两个接口:

public interface CameraViewListener {
public void onTakePic(Bitmap bmp);
public void onBack();
}

private CameraViewListener    mListener;

public void setListener(CameraViewListener listener) {
mListener = listener;
}


然后在MainActivity添加以下代码:

implements CameraViewListener


implements CameraViewListener

mCameraView.setListener(this);

@Override
public void onTakePic(Bitmap bmp) {
// TODO Auto-generated method stub
mVgCamera.setVisibility(View.GONE);
mPhoto.setVisibility(View.VISIBLE);
mPhoto.setImageBitmap(bmp);
}

@Override
public void onBack() {
// TODO Auto-generated method stub
mBtnCamera.setVisibility(View.VISIBLE);

mVgCamera.setVisibility(View.GONE);
}


mPhoto是一个ImageView

<ImageView
android:id="@+id/main_photo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:visibility="gone" />


以上,按下拍照即可在主界面看到拍照得到的画面:



如果还需要完整代码请持续关注,我有空把Github整理好了会发出github的地址~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: