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

第58章、拍照功能实现(从零开始学Android)

2018-03-13 01:28 369 查看
来自:http://blog.csdn.net/jianghuiquan/article/details/8569187

Android有两种拍照方法,一种是直接调用系统的照相Intent,使用 onActivityResult获取图片资源或者指定图片路径,拍照返回成功后去指定路径读取图片;一种是用SurfaceView自定义界面,添加业务个性化功能。

一、第一种方法

1、设计界面

  (1)、布局文件

  打开activity_main.xml文件。

  输入以下代码:

?

[html]?view
plain?copy

<?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">??

??

????<Button??

????????android:id="@+id/bysystem"??

????????android:layout_width="wrap_content"??

????????android:layout_height="wrap_content"??

????????android:text="调用系统相机不返回结果"?/>??

??

????<Button??

????????android:id="@+id/byself"??

????????android:layout_width="wrap_content"??

????????android:layout_height="wrap_content"??

????????android:text="调用系统相机并返回结果"?/>??

??

????<ImageView??

????????android:id="@+id/photo"??

????????android:layout_width="wrap_content"??

????????android:layout_height="wrap_content"?/>??

??

</LinearLayout>??

2、程序文件

  打开“src/com.genwoxue.camera/MainActivity.java”文件。

  然后输入以下代码:

[java]?view
plain?copy

package?com.genwoxue.camera;??

??

??

import?java.io.File;??

import?android.app.Activity;??

import?android.content.Intent;??

import?android.net.Uri;??

import?android.os.Bundle;??

import?android.os.Environment;??

import?android.provider.MediaStore;??

import?android.view.View;??

import?android.view.View.OnClickListener;??

import?android.widget.Button;??

import?android.widget.Toast;??

??

public?class?MainActivity?extends?Activity?{??

??????

????private?Button?btnSystem=null;??

????private?Button?btnSelf=null;??

????private?File?file=null;???

????private?static?final?String?FILENAME="photo.jpg";??

??????

????private?static?String?path="";??

??

????@Override??

????public?void?onCreate(Bundle?savedInstanceState)?{??

????????super.onCreate(savedInstanceState);??

????????setContentView(R.layout.activity_main);??

??????????

????????btnSystem=(Button)super.findViewById(R.id.bysystem);??

????????btnSelf=(Button)super.findViewById(R.id.byself);??

??????????

????????//调用系统照相机,不返回结果??

????????btnSystem.setOnClickListener(new?OnClickListener(){??

????????????public?void?onClick(View?v)??

????????????{???

????????????????Intent?intent?=?new?Intent();????

????????????????intent.setAction("android.media.action.STILL_IMAGE_CAMERA");???

????????????????startActivity(intent);???

????????????}??

????????});??

??????????

????????//调用系统照相机,返回结果??

????????btnSelf.setOnClickListener(new?OnClickListener(){??

????????????public?void?onClick(View?v)??

????????????{????

????????????????//判断外部存储卡是否存在??

????????????????if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){??

????????????????????Toast.makeText(getApplicationContext(),?"读取失败,SD存储卡不存在!",?Toast.LENGTH_LONG).show();????

????????????????????return;??

????????????????}??

??????????????????

????????????????//判断文件是否存在??

????????????????path=Environment.getExternalStorageDirectory().toString()+File.separator+"genwoxue"+File.separator+FILENAME;??

????????????????file=new?File(path);??

????????????????if(!file.exists()){??

????????????????????File?vDirPath?=?file.getParentFile();???

????????????????????vDirPath.mkdirs();???

????????????????????Toast.makeText(getApplicationContext(),?"photo.jpg文件不存在!",?Toast.LENGTH_LONG).show();????

????????????????????return;??

????????????????}??

??????????????????

????????????????Uri?uri?=?Uri.fromFile(file);???

????????????????Intent?intent?=?new?Intent(MediaStore.ACTION_IMAGE_CAPTURE);???

????????????????intent.putExtra(MediaStore.EXTRA_OUTPUT,?uri);??

????????????????startActivityForResult(intent,?1);???

??????????????????

????????????}??

????????});??

??????????

????}??

??????

}??

?3、运行结果

  

 

  


?

二、第二种方法。

1、设计界面

  (1)、布局文件

  打开activity_main.xml文件。

  输入以下代码:

[html]?view
plain?copy

<?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">??

??

??

????<Button??

????????android:id="@+id/byself"??

????????android:layout_width="wrap_content"??

????????android:layout_height="wrap_content"??

????????android:text="拍照(自定义相机)"?/>??

??????

????<SurfaceView??

????????android:id="@+id/photo"??

????????android:layout_width="300dip"??

????????android:layout_height="400dip"?/>??

??

</LinearLayout>??

2、程序文件

  打开“src/com.genwoxue.cameradiy/MainActivity.java”文件。

  然后输入以下代码:

[java]?view
plain?copy

package?com.genwoxue.cameradiy;??

??

??

import?java.io.BufferedOutputStream;??

import?java.io.File;??

import?java.io.FileNotFoundException;??

import?java.io.FileOutputStream;??

import?java.io.IOException;??

import?android.app.Activity;??

import?android.graphics.Bitmap;??

import?android.graphics.BitmapFactory;??

import?android.graphics.PixelFormat;??

import?android.hardware.Camera;??

import?android.hardware.Camera.AutoFocusCallback;??

import?android.hardware.Camera.Parameters;??

import?android.hardware.Camera.PictureCallback;??

import?android.hardware.Camera.ShutterCallback;??

import?android.os.Bundle;??

import?android.os.Environment;??

import?android.util.Log;??

import?android.view.SurfaceHolder;??

import?android.view.SurfaceView;??

import?android.view.View;??

import?android.view.View.OnClickListener;??

import?android.widget.Button;??

import?android.widget.Toast;??

??

public?class?MainActivity?extends?Activity?{??

??????

????private?Button?btnSelf=null;??

????private?Camera?camera=null;??

????private?static?final?String?TAG="PhotoDIY";??

????private?String?path="";??

????private?boolean?previewRuning=true;??

??

????@Override??

????public?void?onCreate(Bundle?savedInstanceState)?{??

????????super.onCreate(savedInstanceState);??

????????setContentView(R.layout.activity_main);??

??????????

????????//初始化SurfaceView??

????????SurfaceView?mpreview?=?(SurfaceView)?this.findViewById(R.id.photo);???

????????SurfaceHolder?mSurfaceHolder?=?mpreview.getHolder();???

????????mSurfaceHolder.addCallback(new?SurfaceViewCallback());???

????????mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);???

??

??????????

????????btnSelf=(Button)super.findViewById(R.id.byself);??

??????????

????????//拍照(自定义相机)??

????????btnSelf.setOnClickListener(new?OnClickListener(){??

????????????public?void?onClick(View?v)??

????????????{????

????????????????if(camera!=null){??

????????????????????camera.autoFocus(new?AutoFocusCallbackimpl());??

????????????????}??

????????????}??

????????});??

??????????

????}??

??????

????public?class?SurfaceViewCallback?implements?SurfaceHolder.Callback{??

??????????

????????@Override??

????????public?void?surfaceChanged(SurfaceHolder?holder,int?format,int?width,int?heith){??

??

????????}??

??????????

????????@Override??

????????public?void?surfaceCreated(SurfaceHolder?holder){??

????????????//现在智能机可能会有多个镜头:一般前置为1;后置为0??

????????????MainActivity.this.camera=Camera.open(0);??

????????????//设置参数??

????????????Parameters?param=camera.getParameters();??

????????????param.setPictureFormat(PixelFormat.JPEG);??

????????????param.set("jpeg-quality",85);??

????????????param.setPreviewFrameRate(5);??

????????????camera.setParameters(param);??

??????????????

????????????try?{??

????????????????camera.setPreviewDisplay(holder);???//成像在SurfaceView??

????????????}?catch?(IOException?e)?{??

????????????????e.printStackTrace();??

????????????}??

??????????????

????????????//开始预览??

????????????camera.startPreview();??

????????????previewRuning=true;??

????????}??

??????????

????????@Override??

????????public?void?surfaceDestroyed(SurfaceHolder?holder){??

????????????if(camera!=null){??

????????????????if(previewRuning){??

????????????????????camera.stopPreview();??

????????????????????previewRuning=false;??

????????????????}??

????????????????camera.release();??

????????????}??

????????}??

????}??

??????

????//调用takePicture()方法时,自动执行pictureCallback回调方法??

????public?PictureCallback?picture=new?PictureCallback(){??

????????@Override??

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

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

????????????//判断外部存储卡是否存在??

????????????if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){??

????????????????Toast.makeText(getApplicationContext(),?"读取失败,SD存储卡不存在!",?Toast.LENGTH_LONG).show();????

????????????????return;??

????????????}??

??????????????

????????????//判断文件是否存在??

????????????path=Environment.getExternalStorageDirectory().toString()??

????????????????????+File.separator??

????????????????????+"genwoxue"??

????????????????????+File.separator??

????????????????????+System.currentTimeMillis()??

????????????????????+".jpg";??

??????????????

????????????File?file=new?File(path);??

????????????if(!file.exists()){??

????????????????File?vDirPath?=?file.getParentFile();???

????????????????vDirPath.mkdirs();???

????????????????Toast.makeText(getApplicationContext(),?"photo.jpg文件不存在!",?Toast.LENGTH_LONG).show();????

????????????????return;??

????????????}??

??????????????

????????????try?{??

????????????????BufferedOutputStream?bos=new?BufferedOutputStream(new?FileOutputStream(file));??

????????????????bmp.compress(Bitmap.CompressFormat.JPEG,?80,?bos);??

????????????????try?{??

????????????????????bos.flush();??

????????????????????bos.close();??

????????????????}?catch?(IOException?e)?{??

????????????????????e.printStackTrace();??

????????????????}??

??????????????????

????????????}?catch?(FileNotFoundException?e)?{??

????????????????e.printStackTrace();??

????????????}??

??????????????

????????????camera.stopPreview();??

????????????camera.startPreview();??

??????????????

????????}??

????};??

??

????//对焦回回调??

????public?class?AutoFocusCallbackimpl?implements?AutoFocusCallback{??

????????public?void?onAutoFocus(boolean?success,Camera?camera){??

??????????????

????????????if(success){??

????????????????camera.takePicture(shutter,?null,?picture);??

????????????????camera.stopPreview();??

????????????}??

????????}??

????}??

??????

????//快门回调??

????public?ShutterCallback?shutter=new?ShutterCallback(){??

????????public?void?onShutter(){??

??????????????

????????}??

????};??

}??

3、运行结果

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