android --相机使用详解概述

private PictureCallback raw = new PictureCallback() {  

    @Override  



    public void onPictureTaken(byte\[\] data, Camera camera) {   

        // TODO Auto-generated method stub 

        Log.d("ddd", "raw");                



    }  

};  



private PictureCallback jpeg = new PictureCallback() {  

        

    @Override   

    public void onPictureTaken(byte\[\] data, Camera camera) {  



        // TODO Auto-generated method stub 

        Log.d("ddd","jpeg");                  

    }  



};  



public MySurfaceView(Context context)  

{   

    super(context);   

    holder \= getHolder();//获得surfaceHolder引用  

     holder.addCallback(this);   

    holder.setType(SurfaceHolder.SURFACE\_TYPE\_PUSH\_BUFFERS);//设置类型   }  



public void tackPicture()  

{  

     myCamera.takePicture(null,null,null);   

}  



public void voerTack()  

{  

     myCamera.startPreview();  

 }  

@Override  



public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  



    myCamera.startPreview();         

 }  



@Override  



public void surfaceCreated(SurfaceHolder holder) {   



    // TODO Auto-generated method stub 

    if(myCamera == null) 

    {  



        myCamera \= Camera.open();//开启相机,不能放在构造函数中,不然不会显示画面.  

         try {  



            myCamera.setPreviewDisplay(holder);  

         } catch (IOException e) {  



            // TODO Auto-generated catch block  



            e.printStackTrace();  



        }   

    }          

}  



@Override  



public void surfaceDestroyed(SurfaceHolder holder) {  





    // TODO Auto-generated method stub 

    myCamera.stopPreview();//停止预览   

    myCamera.release();//释放相机资源  myCamera \= null;  



}  

}




CameraTest\_3.java



import android.app.Activity;

import android.view.View.OnClickListener;

public class CameraTest_3 extends Activity implements OnClickListener {

/\*\* Called when the activity is first created. \*/  



MySurfaceView mySurface;  

boolean isClicked = false;  



@Override  



public void onCreate(Bundle savedInstanceState) {  



    super.onCreate(savedInstanceState);  



    mySurface \= new MySurfaceView(this);  

    setContentView(mySurface);  

    mySurface.setOnClickListener(this);  



}  



@Override  



public void onClick(View v) {  



    // TODO Auto-generated method stub  



    if(!isClicked)  



    {  



    mySurface.tackPicture();  



    isClicked \= true;  



    }else  



    {  



        mySurface.voerTack();  

        isClicked \= false;  



    }        

}  



这样就是实现了拍照的功能,那么怎样要图片保存呢?那么这是就需要在那个参数中的jpeg的  

方法里面进行处理了,那个方法的data参数,就是相片的数据。  

我们通过BitmapFactory.decodeByteArray(data, 0, data.length)来获得图片并通过io处理,将图片保存到想要保存的位置  

下面这段代码,是将照片保存到/sdcard/wjh.jpg;并把一些没有用到的代码全部删掉,剩下一些必须的代码



package com.wjh.camera;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback{

SurfaceHolder holder;   

Camera myCamera;  



private PictureCallback jpeg = new PictureCallback() {  

  @Override  



    public void onPictureTaken(byte\[\] data, Camera camera) {  



        // TODO Auto-generated method stub  



        try  



        {  



            Bitmap bm \= BitmapFactory.decodeByteArray(data, 0, data.length);   

            File file \= new File("/sdcard/wjh.jpg");   

            BufferedOutputStream bos  \= new BufferedOutputStream(new FileOutputStream(file));  

             bm.compress(Bitmap.CompressFormat.JPEG,100,bos);   

            bos.flush();   

            bos.close();  

        }catch(Exception e)  



        {  



            e.printStackTrace();   

        }   

    }  



};  

 public MySurfaceView(Context context)  



{   

    super(context);  

     holder \= getHolder();//获得surfaceHolder引用  

    holder.addCallback(this);  

     holder.setType(SurfaceHolder.SURFACE\_TYPE\_PUSH\_BUFFERS);//设置类型   



}  

 public void tackPicture()  



{  

     myCamera.takePicture(null,null,jpeg);  



}  

public void voerTack()  

{   

    myCamera.startPreview(); 

}  



@Override  

 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  

     myCamera.startPreview();         

}  



@Override  

 public void surfaceCreated(SurfaceHolder holder) {  



    // TODO Auto-generated method stub 

    if(myCamera == null)  



    {  

        myCamera \= Camera.open();//开启相机,不能放在构造函数中,不然不会显示画面.  



        try {  



            myCamera.setPreviewDisplay(holder);  

        } catch (IOException e) {  



            // TODO Auto-generated catch blocke.printStackTrace();   

        }  



    }          

}  

 @Override   



public void surfaceDestroyed(SurfaceHolder holder) {  



    // TODO Auto-generated method stub  



    myCamera.stopPreview();//停止预览   

    myCamera.release();//释放相机资源  myCamera \= null;  



}  

}




CameraTest\_3.java跟上面的一样  

注意,这是必须添加在sd卡上写数据的权限  

<uses-permission android:name="android.permission.WRITE\_EXTERNAL\_STORAGE"/>  

  

(7)能够拍照了,这下子要考虑如何让图片更好看了,这显然是专业人士的强项,但是我们在程序上,也可以做一些处理,  

向上面的那些,因为我直接把surfaceView当做整体布局,就可能出现屏幕被拉开了,不是很好看,所以这时,就可以不要把  

surfaceView弄成整体布局,把他弄到到一个布局管理器,在设置相关的参数.  

  

这是需要注意的是有些参数不能随便乱设,  

如以下代码:Camera.Parameters parames = myCamera.getParameters();//获得参数对象  

parames.setPictureFormat(PixelFormat.JPEG);//设置图片格式  

parames.setPreviewSize(640,480);//这里面的参数只能是几个特定的参数,否则会报错.(176\*144,320\*240,352\*288,480\*360,640\*480)  

myCamera.setParameters(parames);  

  

还有自动对焦,当然有些手机没有这个功能,自动对焦是通过autoFocus()这个方法调用一个自动对焦的接口,并在里面进行处理。  

注意,这个方法必须在startPreview()和stopPreview()中间。  

AutoFocusCallback是自动对焦的接口,实现它必须实现public void onAutoFocus(boolean success, Camera camera)这个方法,  

所以我们可以将拍照方法放在这里面,然后对焦后再进行拍摄。。效果会好很多。  

  

注意自动对焦需要添加<uses-feature android:name="android.hardware.camera.autofocus" />  

下面我叫直接把上面的使用例子直接写出。  

CameraTest\_4.java



import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import android.app.Activity;

import android.content.pm.ActivityInfo;

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.PictureCallback;

import android.os.Bundle;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

import android.view.View;

import android.view.Window;

import android.view.SurfaceHolder.Callback;

import android.view.View.OnClickListener;

public class CameraTest_4 extends Activity implements Callback, OnClickListener, AutoFocusCallback{

SurfaceView mySurfaceView;//surfaceView声明  

 SurfaceHolder holder;//surfaceHolder声明  

 Camera myCamera;//相机声明  

String filePath\="/sdcard/wjh.jpg";//照片保存路径  

 boolean isClicked = false;//是否点击标识  



//创建jpeg图片回调数据对象  



PictureCallback jpeg \= new PictureCallback() {   

      

    @Override  

    public void onPictureTaken(byte\[\] data, Camera camera) {   



        // TODO Auto-generated method stub  

         try  



        {// 获得图片  



        Bitmap bm \= BitmapFactory.decodeByteArray(data, 0, data.length);   

        File file \= new File(filePath);   

        BufferedOutputStream bos \=  new BufferedOutputStream(new FileOutputStream(file));  



        bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);//将图片压缩到流中  

         bos.flush();//输出   

        bos.close();//关闭   

        }catch(Exception e)  



        {   



            e.printStackTrace();  

        } 

    }   

};  



/\*\* Called when the activity is first created. \*/  



@Override 

public void onCreate(Bundle savedInstanceState) {  



    super.onCreate(savedInstanceState);  



    requestWindowFeature(Window.FEATURE\_NO\_TITLE);//无标题            

     //设置拍摄方向  



    this.setRequestedOrientation(ActivityInfo.SCREEN\_ORIENTATION\_LANDSCAPE);  



    setContentView(R.layout.main);  



    //获得控件  mySurfaceView \= (SurfaceView)findViewById(R.id.surfaceView1);  



    //获得句柄  



    holder \= mySurfaceView.getHolder();  



    //添加回调  



    holder.addCallback(this);  



    //设置类型  holder.setType(SurfaceHolder.SURFACE\_TYPE\_PUSH\_BUFFERS);  



    //设置监听   

    mySurfaceView.setOnClickListener(this);  

}  

@Override  



public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {   



    // TODO Auto-generated method stub   

    //设置参数并开始预览  



    Camera.Parameters params \= myCamera.getParameters();  



    params.setPictureFormat(PixelFormat.JPEG);   

    params.setPreviewSize(640,480);   

    myCamera.setParameters(params);   

    myCamera.startPreview();  

       

}  



@Override   



public void surfaceCreated(SurfaceHolder holder) {  

    // TODO Auto-generated method stub  

    //开启相机  



    if(myCamera == null)  



    {   

        myCamera \= Camera.open();  



        try {  



            myCamera.setPreviewDisplay(holder);  

        } catch (IOException e) {  

            // TODO Auto-generated catch block  e.printStackTrace();  

         }  



    }           

}  



@Override   



public void surfaceDestroyed(SurfaceHolder holder) {  



    // TODO Auto-generated method stub   

    //关闭预览并释放资源  



    myCamera.stopPreview();  

    myCamera.release();   

    myCamera \= null;           

}  



@Override  

public void onClick(View v) {  



    // TODO Auto-generated method stub  

    if(!isClicked)  

    {   

        myCamera.autoFocus(this);//自动对焦  isClicked \= true;   

    }else  



    {  

         myCamera.startPreview();//开启预览  

         isClicked \= false;  

    }            

}   

@Override  



public void onAutoFocus(boolean success, Camera camera) {  

    // TODO Auto-generated method stub  



    if(success)  

     {  



        //设置参数,并拍照  

         Camera.Parameters params \= myCamera.getParameters();   

        params.setPictureFormat(PixelFormat.JPEG);  

         params.setPreviewSize(640,480);  

         myCamera.setParameters(params);   

        myCamera.takePicture(null, null, jpeg);  



    }  

     }  

}




 AndroidManifest.xml



<?xml version="1.0" encoding="utf-8"?>
<application android:icon="@drawable/icon" android:label="@string/app\_name">

     <activity android:name=".CameraTest\_4"

               android:label\="@string/app\_name">

        <intent-filter>

             <action android:name="android.intent.action.MAIN" />

             <category android:name="android.intent.category.LAUNCHER" />

         </intent-filter>



    </activity>

 </application>



main.xml



<linearlayout xmlns:android=“http://schemas.android.com/apk/res/android”

androidrientation\="vertical"  

 android:layout\_width\="fill\_parent"  

 android:layout\_height\="fill\_parent"  
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值