手机照相程序
package com.icss.test_take_picture;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
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.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.SurfaceHolder.Callback;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
?private SurfaceView sf1;
?private Button bt1;
?private SurfaceView surfaceview;
?private SurfaceHolder surfaceholder;
?
?private Camera camera;
?private boolean isPreview=false;
?@Override
??? public void onCreate(Bundle savedInstanceState) {
??????? super.onCreate(savedInstanceState);
??????? setContentView(R.layout.main);
???????
??????? sf1=(SurfaceView)findViewById(R.id.sf1);
??????? bt1=(Button)findViewById(R.id.bt1);
??????? //设置手机屏幕为全屏
??????? this.requestWindowFeature(Window.FEATURE_NO_TITLE); //无标题
??????? this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
??????? //拍照时,屏幕高亮度
??????? this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
???????
??????? surfaceholder=sf1.getHolder();? //从view中取出holder
??????? surfaceholder.setFixedSize(170, 170);?? //设置分辨率
??????? surfaceholder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);?? //设置不缓冲数据
???????
??????? final PictureCallback jpeg=new PictureCallback() {
???@Override//当你照了一张照片的时候
???public void onPictureTaken(byte[] data, Camera camera) {
????final Bitmap bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);
????//根据dialog的布局文件创建一个视图
????View dialog=getLayoutInflater().inflate(R.layout.dialog, null);
????ImageView imageview=(ImageView)dialog.findViewById(R.id.imageview);
????imageview.setImageBitmap(bitmap);
????
????final EditText filename=(EditText)dialog.findViewById(R.id.filename);
????
????new AlertDialog.Builder(MainActivity.this).setView(dialog).setNegativeButton("取消", null).setPositiveButton("确定保存", new DialogInterface.OnClickListener() {
?????
?????@Override
?????public void onClick(DialogInterface dialog, int which) {
??????//保存图片
??????if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
???????File f=new File(Environment.getExternalStorageDirectory(),filename.getText().toString());
????????? try {
????????FileOutputStream fos=new FileOutputStream(f);
????????bitmap.compress(CompressFormat.JPEG, 100,fos);
????????fos.flush();
????????fos.close();
????????Toast.makeText(MainActivity.this, "保存图片成功", Toast.LENGTH_LONG).show();
???????} catch (FileNotFoundException e) {
????????e.printStackTrace();
???????} catch (IOException e) {
????????e.printStackTrace();
???????}
?????????
??????}
?????}
????}).show();
???}
??};
??bt1.setOnClickListener(new View.OnClickListener() {
???
???@Override
???public void onClick(View v) {
????if(camera!=null){
?????camera.takePicture(null, null, jpeg);
????}
???}
??});
??//设置surfacehodler的回调方法,用来根据srufaceview的状态来控制camera
??
??surfaceholder.addCallback(new Callback(){
???@Override
???public void surfaceChanged(SurfaceHolder holder, int format, int width,
?????int height) {
????
???}
???@Override
???public void surfaceCreated(SurfaceHolder holder) {
????initCamera();
???}
???
???
???
???@Override
???public void surfaceDestroyed(SurfaceHolder holder) {
????if(camera!=null){
?????if(isPreview==true){?? //还在预览状态
??????camera.stopPreview();??? //取消预览
?????}
?????camera.release();
?????camera=null;
????}
???}
???
??});
??? }
? //打开camera
?protected void initCamera() {
???? if(!isPreview){
????? camera=Camera.open();
???? }
???? if(camera!=null&&!isPreview){
????? try {
????//将camera当前拍到图像显示到surfaceview中去
?????? Camera.Parameters parameters=camera.getParameters();?? //取出camera的参数对象
?????? //设置每秒显示多少帧
?????? parameters.setPreviewFrameRate(3);
?????? //设置图片的大小
?????? parameters.setPictureSize(300, 300);
?????? //设置拍出的图片的格式
?????? parameters.setPictureFormat(PixelFormat.JPEG);
?????? parameters.setPreviewSize(300, 300);
??????
?????? //将上面的parameters参数设置到camera中
?????? camera.setParameters(parameters);
??????
?????? //下一步将camera的图像设置到surfaceview中
?????? camera.setPreviewDisplay(surfaceholder);
?????? ///下面开始预览
?????? camera.startPreview();
??????
?????? //自动对焦
?????? camera.autoFocus(null);
???} catch (IOException e) {
????e.printStackTrace();
???}
?????
???? }
?}
}
?
?
?
必须得配权限 重点是3个回调? !
?
?
?
?
?
?
?