第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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • css3中的width:100vh以及calc(100vh + 10px)

    css3中的width:100vh以及calc(100vh + 10px)vh/vwvh:相对于视窗的高度,视窗被均分为100单位的vh;vw:相对于视窗的宽度,视窗被均分为100单位的vw;vmax:相对于视窗的宽度或高度中较大的那个。其中最大的那个被均分为100单位的vmax;vmin:相对于视窗的宽度或高度中较小的那个。其中最小的那个被均分为100单位的vmin;视区所指为浏览器内部的可视区域大小,即window.innerWidth/window.innerHeight大小,不包含任务栏标题栏以及底部工具栏的浏览器区域大小。calccalc是英

    2022年4月29日
    93
  • 优化器Optimizer

    目前最流行的5种优化器:Momentum(动量优化)、NAG(Nesterov梯度加速)、AdaGrad、RMSProp、Adam,所有的优化算法都是在原始梯度下降算法的基础上增加惯性和环境感知因素进

    2021年12月30日
    50
  • python动态心形代码简单_python 心形

    python动态心形代码简单_python 心形0.最终效果1.绘制一条心形曲线最近看到个视频,打算绘制个心型动态的曲线。1.1Matlab确定图像及其函数网上有很多关于心形曲线的资料,各种各样的形状,但是我比较倾心于桃心形。先在Matlab里简单看一下是什么样的。桃心形曲线的方程如下x=16sin^3(t)y=13cos(t)-5cos(2t)-2cos(3t)-cos(4t)Matlab绘制效果如下:Matlab程序如下。clcc…

    2022年9月25日
    2
  • 《Qt 实战一二三》

    《Qt 实战一二三》Qt基础与实战,主要包含:环境搭建、信号槽、事件机制、数据类型、常用部件/布局、对话框、QPainter绘图等内容。

    2022年6月30日
    27
  • bridge桥接模式_透明桥模式

    bridge桥接模式_透明桥模式bridge模式动机案例要点总结笔记动机由于某些类型的固有的实现逻辑,使得他们具有两个变化维度,乃至多个维度的变换如何应对这种”多维度的变化“?如何利用面向对象技术来是使得类型可以轻松地沿着两个乃至多个方向变换而不引入额外地复杂度?案例PC端和Mobile端平台和业务分离朴素class Messager{ public: virtual void Login(string username,string password) = 0; virtual void SendM

    2022年8月9日
    5
  • python之Beautiful Soup库

    1、简介简单来说,BeautifulSoup是python的一个库,最主要的功能是从网页抓取数据。官方解释如下:BeautifulSoup提供一些简单的、python式的函数用来处理导航、搜索

    2021年12月29日
    42

发表回复

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

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