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

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

一、第一种方法

1、设计界面

  (1)、布局文件

  打开activity_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">

    <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”文件。

  然后输入以下代码:

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文件。

  输入以下代码:

<?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”文件。

  然后输入以下代码:

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、运行结果

  

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒋会全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值