• Android学习之简单的拍照功能


    本博客源码:Android学习之简单的拍照功能      http://download.csdn.net/detail/bq1073100909/7721211
    
    本代码里面有详细注释,就不再进行讲解,按照步骤一步一步来,并不难懂。
    
    图片保存路径因手机不同而不同,我没有使用系统提供的接口来获取路径,而是使用我手机的/mnt/sdcard2,推荐使用系统提供的接口,在前面的Android博客里面已经使用。
    
    
    CameraDemo.java
    
    代码:
    
    [java] view plain copy
    
        package org.dyb.camera;  
          
        import java.io.BufferedOutputStream;  
        import java.io.File;  
        import java.io.FileOutputStream;  
        import java.io.IOException;  
          
        import android.app.Activity;  
        import android.graphics.Bitmap;  
        import android.graphics.BitmapFactory;  
        import android.graphics.ColorMatrixColorFilter;  
        import android.graphics.Matrix;  
        import android.graphics.PixelFormat;  
        import android.hardware.Camera;  
        import android.hardware.Camera.AutoFocusCallback;  
        import android.hardware.Camera.PictureCallback;  
        import android.hardware.Camera.ShutterCallback;  
        import android.os.Bundle;  
        import android.util.Log;  
        import android.view.MotionEvent;  
        import android.view.SurfaceHolder;  
        import android.view.SurfaceView;  
        import android.view.View;  
        import android.view.View.OnClickListener;  
        import android.view.View.OnTouchListener;  
        import android.view.ViewGroup.LayoutParams;  
        import android.view.Window;  
        import android.view.WindowManager;  
        import android.widget.ImageButton;  
        import android.widget.Toast;  
          
        public class CameraDemo extends Activity implements SurfaceHolder.Callback {  
          
            private SurfaceView mPreviewSV = null; //预览SurfaceView  
            private SurfaceHolder mySurfaceHolder = null;  
            private AutoFocusCallback myAutoFocusCallback = null;  
            private ImageButton mPhotoImgBtn = null;  
            private Camera myCamera = null;  
            private boolean isPreview = false;  
            private Bitmap mBitmap = null;  
            private String tag="camera";  
              
            @Override  
            public void onCreate(Bundle savedInstanceState) {  
                super.onCreate(savedInstanceState);  
                //设置全屏无标题  
                requestWindowFeature(Window.FEATURE_NO_TITLE);  
                Window myWindow = this.getWindow();   
                int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN;  
                myWindow.setFlags(flag, flag);  
                  
                setContentView(R.layout.activity_photo);  
                  
                  
                //初始化SurfaceView  
                mPreviewSV = (SurfaceView)findViewById(R.id.previewSV);  
                mySurfaceHolder = mPreviewSV.getHolder();  
                mySurfaceHolder.setFormat(PixelFormat.TRANSLUCENT);//translucent半透明 transparent透明  
                mySurfaceHolder.addCallback(this);  
                mySurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
                //自动聚焦变量回调  
                myAutoFocusCallback = new AutoFocusCallback() {  
                    @Override  
                    public void onAutoFocus(boolean success, Camera camera) {  
                        if(success)//success表示对焦成功  
                        {  
                            Toast.makeText(getApplicationContext(), "autofocus success", Toast.LENGTH_SHORT).show();  
                        }  
                        else  
                        {  
                            Toast.makeText(getApplicationContext(), "autofocus false", Toast.LENGTH_SHORT).show();  
                        }  
          
                    }  
                };  
                  
                  
                mPhotoImgBtn = (ImageButton)findViewById(R.id.photoImgBtn);  
                //手动设置拍照ImageButton的大小为120×120,原图片大小是64×64  
                LayoutParams lp = mPhotoImgBtn.getLayoutParams();  
                lp.width = 120;  
                lp.height = 120;          
                mPhotoImgBtn.setLayoutParams(lp);     
                mPhotoImgBtn.setOnClickListener(new PhotoOnClickListener());  
                mPhotoImgBtn.setOnTouchListener(new MyOnTouchListener());  
            }  
              
              
              
            // SurfaceView启动时/初次实例化,预览界面被创建时,该方法被调用。  
            @Override  
            public void surfaceCreated(SurfaceHolder holder) {  
                myCamera = Camera.open();  
                try {  
                    myCamera.setPreviewDisplay(mySurfaceHolder);  
                } catch (IOException e) {  
                    if(null != myCamera){  
                        myCamera.release();  
                        myCamera = null;  
                    }  
                    e.printStackTrace();  
                }  
            }  
          
            // 当SurfaceView/预览界面的格式和大小发生改变时,该方法被调用  
            @Override  
            public void surfaceChanged(SurfaceHolder holder, int format, int width,  
                    int height) {  
                // TODO Auto-generated method stub  
                initCamera();  
            }  
          
            private void initCamera() {  
                if(isPreview){  
                    myCamera.stopPreview();  
                }  
                  
                if(myCamera != null){  
                    Camera.Parameters myParam = myCamera.getParameters();  
                    //          //查询屏幕的宽和高  
                    //          WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);  
                    //          Display display = wm.getDefaultDisplay();  
                    //          Log.i(tag, "屏幕宽度:"+display.getWidth()+" 屏幕高度:"+display.getHeight());  
                    myParam.setPictureFormat(PixelFormat.JPEG);//设置拍照后存储的图片格式  
                    //查询camera支持的picturesize和previewsize  
                    //          List<Size> pictureSizes = myParam.getSupportedPictureSizes();  
                    //          List<Size> previewSizes = myParam.getSupportedPreviewSizes();  
                    //          for(int i=0; i<pictureSizes.size(); i++){  
                    //              Size size = pictureSizes.get(i);  
                    //              Log.i(tag, "initCamera:摄像头支持的pictureSizes: width = "+size.width+"height = "+size.height);  
                    //          }  
                    //          for(int i=0; i<previewSizes.size(); i++){  
                    //              Size size = previewSizes.get(i);  
                    //              Log.i(tag, "initCamera:摄像头支持的previewSizes: width = "+size.width+"height = "+size.height);  
                    //  
                    //          }  
                    //设置大小和方向等参数  
                    myParam.setPictureSize(1280, 960);  
                    myParam.setPreviewSize(960, 720);     
                    //myParam.set("rotation", 90);                
                    myCamera.setDisplayOrientation(90);    
                    myParam.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);  
                    myCamera.setParameters(myParam);              
                    myCamera.startPreview();  
                    myCamera.autoFocus(myAutoFocusCallback);  
                    isPreview = true;  
                }  
            }  
          
          
            //销毁时被调用  
            @Override  
            public void surfaceDestroyed(SurfaceHolder holder) {  
                // TODO Auto-generated method stub  
                Log.i(tag, "SurfaceHolder.Callback:Surface Destroyed");  
                if(null != myCamera){  
                    myCamera.setPreviewCallback(null); /*在启动PreviewCallback时这个必须在前不然退出出错。这里实际上注释掉也没关系*/  
                    myCamera.stopPreview();   
                    isPreview = false;   
                    myCamera.release();  
                    myCamera = null;       
                }  
            }  
          
              
            private class PhotoOnClickListener implements OnClickListener{  
          
                @Override  
                public void onClick(View v) {  
                    if(isPreview && myCamera!=null){  
                        myCamera.takePicture(myShutterCallback, null, myJpegCallback);    
                    }  
                }  
                  
            }  
            /*为了使图片按钮按下和弹起状态不同,采用过滤颜色的方法.按下的时候让图片颜色变淡*/  
            public class MyOnTouchListener implements OnTouchListener{  
          
                public final  float[] BT_SELECTED=new float[]  
                        { 2, 0, 0, 0, 2,  
                    0, 2, 0, 0, 2,  
                    0, 0, 2, 0, 2,  
                    0, 0, 0, 1, 0 };                  
          
                public final float[] BT_NOT_SELECTED=new float[]  
                        { 1, 0, 0, 0, 0,  
                    0, 1, 0, 0, 0,  
                    0, 0, 1, 0, 0,  
                    0, 0, 0, 1, 0 };  
                public boolean onTouch(View v, MotionEvent event) {  
                    // TODO Auto-generated method stub  
                    if(event.getAction() == MotionEvent.ACTION_DOWN){  
                        v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_SELECTED));  
                        v.setBackgroundDrawable(v.getBackground());  
                    }  
                    else if(event.getAction() == MotionEvent.ACTION_UP){  
                        v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_NOT_SELECTED));  
                        v.setBackgroundDrawable(v.getBackground());  
                          
                    }  
                    return false;  
                }  
          
            }  
              
              
            /*为了实现拍照的快门声音及拍照保存照片需要下面三个回调变量*/  
            ShutterCallback myShutterCallback = new ShutterCallback()   
            //快门按下的回调,在这里我们可以设置类似播放“咔嚓”声之类的操作。默认的就是咔嚓。  
            {  
          
                public void onShutter() {  
                    // TODO Auto-generated method stub  
                    Log.i(tag, "myShutterCallback:onShutter...");  
          
                }  
            };  
            PictureCallback myRawCallback = new PictureCallback()   
            // 拍摄的未压缩原数据的回调,可以为null  
            {  
          
                public void onPictureTaken(byte[] data, Camera camera) {  
                    // TODO Auto-generated method stub  
                    Log.i(tag, "myRawCallback:onPictureTaken...");  
          
                }  
            };  
            PictureCallback myJpegCallback = new PictureCallback()   
            //对jpeg图像数据的回调,最重要的一个回调  
            {  
          
                public void onPictureTaken(byte[] data, Camera camera) {  
                    // TODO Auto-generated method stub  
                    Log.i(tag, "myJpegCallback:onPictureTaken...");  
                    if(null != data){  
                        mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);//data是字节数据,将其解析成位图  
                        myCamera.stopPreview();  
                        isPreview = false;  
                    }  
                    //设置FOCUS_MODE_CONTINUOUS_VIDEO)之后,myParam.set("rotation", 90)失效。图片竟然不能旋转了,故这里要旋转下  
                    Matrix matrix = new Matrix();  
                    matrix.postRotate((float)90.0);  
                    Bitmap rotaBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, false);  
                    //保存图片到sdcard  
                    if(null != rotaBitmap)  
                    {  
                        saveJpeg(rotaBitmap);  
                    }  
                    //再次进入预览  
                    myCamera.startPreview();  
                    isPreview = true;  
                }  
          
                private void saveJpeg(Bitmap rotaBitmap) {  
                    String savePath = "/mnt/sdcard2/rectPhoto/";  
                    File folder = new File(savePath);  
                    if(!folder.exists()) //如果文件夹不存在则创建  
                    {  
                        folder.mkdir();  
                    }  
                    long dataTake = System.currentTimeMillis();  
                    String jpegName = savePath + dataTake +".jpg";  
                    Log.i(tag, "saveJpeg:jpegName--" + jpegName);  
                    //File jpegFile = new File(jpegName);  
                    try {  
                        FileOutputStream fout = new FileOutputStream(jpegName);  
                        BufferedOutputStream bos = new BufferedOutputStream(fout);  
          
                        //          //如果需要改变大小(默认的是宽960×高1280),如改成宽600×高800  
                        //          Bitmap newBM = rotaBitmap.createScaledBitmap(rotaBitmap, 600, 800, false);  
          
                        rotaBitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);  
                        bos.flush();  
                        bos.close();  
                        Log.i(tag, "saveJpeg:存储完毕!");  
                    } catch (IOException e) {  
                        // TODO Auto-generated catch block  
                        Log.i(tag, "saveJpeg:存储失败!");  
                        e.printStackTrace();  
                    }  
                }  
            };  
              
            @Override  
            public void onBackPressed()  
            //无意中按返回键时要释放内存  
            {  
                // TODO Auto-generated method stub  
                super.onBackPressed();  
                CameraDemo.this.finish();  
            }  
          
          
        }  
    
    
    
    
    activity_photo.xml布局文件代码:
    
    [html] view plain copy
    
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
            xmlns:tools="http://schemas.android.com/tools"  
            android:layout_width="fill_parent"  
            android:layout_height="fill_parent"  
            android:orientation="vertical" >  
          
            <TextView  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:text="@string/wish"  
                tools:context=".RectPhoto" />  
            <FrameLayout  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"   
                >  
          
                <SurfaceView  
                    android:id="@+id/previewSV"  
                    android:layout_width="fill_parent"  
                    android:layout_height="800px"/>  
                  
            </FrameLayout>  
              
            <ImageButton  
                android:id="@+id/photoImgBtn"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:background="@drawable/photo_img_btn"  
                android:layout_gravity="center" />  
              
        </LinearLayout>  
    
    
    
    全局配置文件:
    
    AndroidManifest.xml
    
    [html] view plain copy
    
        <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
            package="org.dyb.camera"  
            android:versionCode="1"  
            android:versionName="1.0" >  
          
            <uses-sdk  
                android:minSdkVersion="8"  
                android:targetSdkVersion="18" />  
          
            <application  
                android:allowBackup="true"  
                android:icon="@drawable/ic_launcher"  
                android:label="@string/app_name"  
                android:theme="@style/AppTheme" >  
                <activity  
                    android:name=".CameraDemo"  
                    android:label="@string/title_activity_rect_photo" >  
                    <intent-filter>  
                        <action android:name="android.intent.action.MAIN" />  
                        <category android:name="android.intent.category.LAUNCHER" />  
                    </intent-filter>  
                </activity>  
                  
            </application>  
            <!-- 增加文件存储和访问摄像头的权限 -->  
            <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />  
            <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
            <uses-permission android:name="android.permission.CAMERA" />  
             <uses-feature android:name="android.hardware.camera" />  
        </manifest>  


  • 相关阅读:
    系统引导管理器GRUB,为初学者指南
    PHPBB安装
    python的装饰器
    PIL的问题解决
    python的小技巧
    强烈推荐instagram的ppt
    新的一天
    OpenStack介绍
    ansible自动化运维工具
    .net连oracle的问题
  • 原文地址:https://www.cnblogs.com/miaozhenzhong/p/5931006.html
Copyright © 2020-2023  润新知