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

第58章、拍照功能实现(从零开始学Android)Android有两种拍照方法,一种是直接调用系统的照相Intent,使用onActivityResult获取图片资源或者指定图片路径,拍照返回成功后去指定路径读取图片;一种是用SurfaceView自定义界面,添加业务个性化功能。一、第一种方法1、设计界面  (1)、布局文件  打开activity_main.xml文件。  输入以下代码: 

大家好,又见面了,我是你们的朋友全栈君。

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

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

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

 

二、第二种方法。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150351.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java socket通讯中文乱码问题

    java socket通讯中文乱码问题话不多说上代码publicvoidrun(){//客户端一连接就可以写数据给服务器了newsendMessThread().start();super.run();try{//读Sock里面的数据InputStreams=socket.getInputStream();byte[]buf=newbyte[1024];

    2022年7月26日
    20
  • 计算机病毒的分类

    计算机病毒的分类病毒与木马病毒:指编制或在计算机程序中插入的破坏计算机功能或破坏数据,影响计算机使用并且能够自我复制的一组计算机指令或程序代码。木马:是一种后门程序,被黑客用作控制远程计算机的工具。木马与病毒不同的是,木马不会自我繁殖,并不会刻意地感染其他文件,它的作用就是为黑客打开远程计算机的门户,从而可以让黑客来远程控制计算机,使黑客获取有用的信息。病毒是自动破坏目标计算机,而木马需要人为的去操控…

    2022年5月3日
    47
  • Mybatis中的resultType和resultMap

    一、概述MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对

    2022年4月6日
    35
  • 全012路规律_双元素集合怎么判断

    全012路规律_双元素集合怎么判断堆题目链接将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种:x is the root:x是根结点;x and y are siblings:x和y是兄弟结点;x is the parent of y:x是y的父结点;x is a child of y:x是y的一个子结点。输入格式:每组测试第1行包含2个正整数N(≤ 1000)和M(≤ 20),分别是插入元素的个数、以及需要判断的命题数。下一行给出区间[−10000,10000]内的N个要被

    2022年8月8日
    4
  • HDU 5929 Basic Data Structure 模拟

    HDU 5929 Basic Data Structure 模拟

    2022年3月6日
    37
  • 给在读研究生&未来要读研同学们的一封受益匪浅的信

    给在读研究生&未来要读研同学们的一封受益匪浅的信读研首先要改变的是自己的心理状态,说起来简单,但实际上很困难。不过既然已经上了研,就不要抱怨了,努力想想自己该干啥才是王道。首先需要明确几种好的心态。(仅以此文使自己进步,时时规范自己的行为。谦虚使人进步,骄傲使人落后。)当你上课感觉就像打酱油时,当你对研究生很迷茫时,当你坐在电脑前孜孜不倦时,请看下面的文章,很受用,至少我心里现在没有以前浮躁。好的文章有时能改变一个人的精神状态,下面就是…

    2022年5月15日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号