• Android 拍照 代码实例


    ------- 源自梦想永远是你IT事业的好友、只是勇敢地说出我学到! ----------

    这是我做的一个简单的利用Android手机的摄像头进行拍照的实例。

    在这里我实现了基本的拍照、照片的存储、自动对焦以及闪光灯,后续还需一些工作在以后我会一步步完成。

    首先讲讲布局:


    没错,就是这么简单的布局。我们先来实现拍照的基本功能,之后若是想要其他功能,一点一点加上去就可以了。

    布局文件的代码如下,我们只需放进一个SurfaceView和一个ImageButton就可以了。

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" >
        
        <SurfaceView
            android:id="@+id/picSV"
            android:layout_width="match_parent"
        	android:layout_height="match_parent"
        	>
        </SurfaceView>
        
        <ImageButton
            android:onClick="tackpic"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right|bottom"
            android:src="@android:drawable/ic_menu_camera" />
        
    </FrameLayout>


    既然我们使用到了摄像头,因此要增加权限:

    <uses-permission android:name="android.permission.CAMERA"/>

    由于之后还要把拍摄到的图片存到sdcard中,因此,在这里也一起加上写入sdcard的权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    然后Androimanifest.xml中设置应用为横屏、全屏的:

    Ctrl+点击  @style/AppTheme ,在 AppTheme中增加两行:

    <item name="android:windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
    这样,当我们吧应用发布到手机的时候,布局默认就是横屏、全屏的效果。

    下面就是要实现拍照功能了。为了方便,我就在代码中进行解读和注释:

    package com.dongdong.tackpic;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    import android.hardware.Camera;
    import android.hardware.Camera.AutoFocusCallback;
    import android.hardware.Camera.Parameters;
    import android.hardware.Camera.PictureCallback;
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.SurfaceHolder;
    import android.view.SurfaceHolder.Callback;
    import android.view.SurfaceView;
    import android.view.View;
    
    public class MainActivity extends Activity {
    	
    	private SurfaceView picSV;
    	private Camera camera;
    	
    	@SuppressWarnings("deprecation")
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		picSV = (SurfaceView) findViewById(R.id.picSV);
    		picSV.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);	
    		picSV.getHolder().addCallback(new MyCallback());
    	}
    	
    	private class MyCallback implements Callback{
    
    		
    		@Override
    		public void surfaceCreated(SurfaceHolder holder) {		//我们在SurfaceView创建的时候就要进行打开摄像头、设置预览取景所在的SurfaceView、设置拍照的参数、开启预览取景等操作
    			try {
    				camera = Camera.open();				//打开摄像头
    				camera.setPreviewDisplay(picSV.getHolder());	//设置picSV来进行预览取景
    				
    				Parameters params = camera.getParameters();	//获取照相机的参数
    				params.setPictureSize(800, 480);		//设置照片的大小为800*480
    				params.setPreviewSize(800, 480);		//设置预览取景的大小为800*480
    				params.setFlashMode("on");			//开启闪光灯
    				params.setJpegQuality(50);			//设置图片质量为50
    				
    				camera.setParameters(params);			//设置以上参数为照相机的参数
    				camera.startPreview();
    			} catch (IOException e) {				//开始预览取景,然后我们就可以拍照了
    				e.printStackTrace();
    			}
    		}
    		@Override
    		public void surfaceChanged(SurfaceHolder holder, int format, int width,
    				int height) {
    		}
    		@Override
    		public void surfaceDestroyed(SurfaceHolder holder) {		//当SurfaceView销毁时,我们进行停止预览、释放摄像机、垃圾回收等工作
    			camera.stopPreview();
    			camera.release();
    			camera = null;
    		}
    		
    	}
    	public void tackpic(View v){
    		camera.autoFocus(new MyAutoFocusCallback());			//在我们开始拍照前,实现自动对焦
    	}
    	
    	private class MyAutoFocusCallback implements AutoFocusCallback{
    
    		@Override
    		public void onAutoFocus(boolean success, Camera camera) {
    			
    			 camera.takePicture(null, null, null, new MyPictureCallback());		//开始拍照
    		}
    		
    	}
    	
    	private class MyPictureCallback implements PictureCallback{
    
    		@Override
    		public void onPictureTaken(byte[] data, Camera camera) {	//将拍摄到的图片放到"/mnt/sdcard2/DCIM/Camera/"这个文件夹中
    			try {
    				FileOutputStream fos = new FileOutputStream("/mnt/sdcard2/DCIM/Camera/"+System.currentTimeMillis()+".jpg");
    				fos.write(data);
    				fos.close();
    				camera.startPreview();
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
    		
    	}
    }
    

    以上便实现了所说的功能,利用Android手机里的摄像头进行拍照的具体步骤请见:http://blog.csdn.net/dongdong230/article/details/11480863


    ------- 源自梦想永远是你IT事业的好友、只是勇敢地说出我学到! ----------
    Le王冬冬 博客分享地址: http://www.cnblogs.com/dongdong230/ 每个人都应做一天攻城狮
  • 相关阅读:
    python3.5以上版本,typing模块提高代码健壮性
    psutil模块使用
    不懂前后端分离?这篇就够了
    k8s krew 插件管理工具
    metrics-server 安装问题解决
    k8s dashboard 解决secret自建证书导致浏览器访问限制
    创建私有 Gems 源
    windows10 使用WSL(ubuntu系统,xshell连接)
    将 Oracle VirtualBox 中运行的虚拟机导入 VMware Fusion、Workstation 或 Player
    conflunce安装配置
  • 原文地址:https://www.cnblogs.com/dongdong230/p/4183116.html
Copyright © 2020-2023  润新知