zoukankan      html  css  js  c++  java
  • 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事业的好友、只是勇敢地说出我学到! ----------
  • 相关阅读:
    posix多线程有感线程高级编程(线程属性函数总结)
    posix多线程有感线程高级编程(线程属性pthread_attr_t)
    posix多线程有感线程高级编程(条件变量属性)
    posix多线程有感线程高级编程(线程属性pthread_attr_t)实时调度
    posix多线程有感自旋锁
    posix多线程有感线程高级编程(线程属性函数总结)(代码)
    寒假Day58:javaTreeSetComparator
    Day62:java多线程
    寒假Day58:蓝桥杯2n皇后问题八皇后变形
    寒假Day57:CodeForces1325C Ehab and Pathetic MEXs树统计度思维
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3313416.html
Copyright © 2011-2022 走看看