第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)

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 关于java代码生成器

    关于java代码生成器讲代码生成器之前先要说说模板,什么叫模板呢,举个例子吧,汇款单都见过吧,你不填写的那些内容都属于模板范畴说到这应该明白了吧,模板就是把共性提取出来反复使用,节约时间、工作量。。。。。那跟代码生成器有什么关系呢,思考一下在编程语言中所有的语言是不是都用共性或者说规范,这些都是固定不变的,在具体点,软件行业也是分主营业务的,比如OA、CRM、ERP、SCM等等,那么各个业务方向的软件

  • java销毁定时器_Java 定时器退出解决方案

    java销毁定时器_Java 定时器退出解决方案项目中用到了Timer每隔一段时间进行一些操作,现在发现有时候莫名其妙地挂在这个计时器上的操作都不做了,用“JConsole”查看其中的线程以后,发现这个定时器线程也不在了(定时器创建的时候带了名字Timertimer=newTimer(“MyTimer”),所以直接能看到),由于日志太多,之前的日志已经找不到了,所以没有办法看是否是有异常发生以及发生在哪里。初步估计,是不是由于T…

  • STL vector用法介绍

    STL vector用法介绍介绍这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作。本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用。通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了。 Vector总览vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种

  • vue解决跨域问题用后端配合吗_vue图片跨域解决

    vue解决跨域问题用后端配合吗_vue图片跨域解决vue解决跨域问题

  • arduino超声波测距_stm32超声波测距lcd显示

    arduino超声波测距_stm32超声波测距lcd显示加入高工智能汽车行业群(自动驾驶行业4群,车联网智能座舱3群,智能商用车行业群),加微信:15818636852,并出示名片,仅限智能网联汽车零部件及OEM厂商。目前为止,特斯拉的Autopilot一共经历了三代硬件的更迭,分别是Autopilot1.0,2.0和2.5。按照目前特斯拉的公开信息,Autopilot3.0硬件将可能在今年底和自主研发的芯片一起推出。此前,《高工智能汽车》陆…

  • 2021goland激活码【在线破解激活】

    2021goland激活码【在线破解激活】,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

发表回复

您的电子邮箱地址不会被公开。

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