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

Android手机拍照功能源码

2012-03-29 12:40 295 查看
随着手机技术的快速发展,手机的功能越来越多也越来越完善,现代手机的一个非常重要的功能就是使用内置相机进行拍照,甚至录制视频,这也是很多手机爱好者购机时必考虑的因素。然而对于Android学习者来说如何实现手机拍照功能呢,下面将为大家提供一个简单的例子,来让大家了解如何使用Android的Camera类捕捉图像并将图像保存为文件。

这个例子比较简单,涉及到一个MainActivity及main.xml布局文件,我已经在我的手机上测试过了,暂时没发现什么问题,我的版本是Android1.5的,对于这些设置以及程序中的一些设置,大家可以根据自己的需要进行设置即可,这只是一个简单的例子,大家可以根据自己的需要进行设计与完善。

代码如下:

-------------------------MainActivity-------------------------

package cn.com.pan;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import android.app.Activity;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.PixelFormat;

import android.graphics.Bitmap.CompressFormat;

import android.hardware.Camera;

import android.hardware.Camera.PictureCallback;

import android.os.Bundle;

import android.os.Environment;

import android.util.Log;

import android.view.Display;

import android.view.KeyEvent;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

import android.view.Window;

import android.view.WindowManager;

public class MainActivity extends Activity {

private static final String TAG = "TakeActivity";

private SurfaceView surfaceView;

private Camera camera;

private boolean preview;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Window window = getWindow();

requestWindowFeature(Window.FEATURE_NO_TITLE);// 没有标题

window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏

window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);// 高亮

setContentView(R.layout.main);

surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);

surfaceView.getHolder().setFixedSize(176, 144); // 设置分辨率

// 下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前

surfaceView.getHolder()

.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

surfaceView.getHolder().addCallback(new SurfaceCallback());

}

private final class SurfaceCallback implements SurfaceHolder.Callback {

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height) {

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

try {

camera = Camera.open();

WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);

Display display = wm.getDefaultDisplay();

Camera.Parameters parameters = camera.getParameters();

parameters.setPreviewSize(display.getWidth(),

display.getHeight());// 设置预览照片的大小

parameters.setPreviewFrameRate(3);// 每秒3帧

parameters.setPictureFormat(PixelFormat.JPEG);// 设置照片的输出格式

parameters.set("jpeg-quality", 85);// 照片质量

parameters.setPictureSize(display.getWidth(),

display.getHeight());// 设置照片的大小

camera.setParameters(parameters);

camera.setPreviewDisplay(surfaceView.getHolder());// 通过SurfaceView显示取景画面

camera.startPreview();// 开始预览

preview = true;

} catch (IOException e) {

Log.e(TAG, e.toString());

}

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

if (camera != null) {

if (preview)

camera.stopPreview();

camera.release();

}

}

}

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (camera != null && event.getRepeatCount() == 0) {

switch (keyCode) {

case KeyEvent.KEYCODE_SEARCH:

camera.autoFocus(null);// 自动对焦

break;

case KeyEvent.KEYCODE_CAMERA:

case KeyEvent.KEYCODE_DPAD_CENTER:

camera.takePicture(null, null, new TakePictureCallback());

break;

}

}

return true;

}

private final class TakePictureCallback implements PictureCallback {

@Override

public void onPictureTaken(byte[] data, Camera camera) {

try {

Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,

data.length);

File file = new File(Environment.getExternalStorageDirectory(),

System.currentTimeMillis() + ".jpg");

FileOutputStream outStream = new FileOutputStream(file);

bitmap.compress(CompressFormat.JPEG, 100, outStream);

outStream.close();

camera.stopPreview();

camera.startPreview();// 开始预览

} catch (Exception e) {

Log.e(TAG, e.toString());

}

}

}

}

---------------------------main.xml-------------------------

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical" android:layout_width="fill_parent"

android:layout_height="fill_parent">

<SurfaceView android:layout_width="fill_parent"

android:layout_height="fill_parent" android:id="@+id/surfaceView" />

</LinearLayout>

---------------------AndroidManifest.xml----------------------

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="cn.com.pan" android:versionCode="1" android:versionName="1.0">

<application android:icon="@drawable/icon" android:label="@string/app_name">

<activity android:name=".MainActivity" android:label="@string/app_name">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

</application>

<uses-sdk android:minSdkVersion="3" />

<uses-permission android:name="android.permission.CAMERA" />

<!-- 在SDCard中创建与删除文件权限 -->

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

<!-- 往SDCard写入数据权限 -->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

</manifest>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: