初识安卓之自定义摄像头拍照和调用系统摄像头拍照

使用摄像头拍照时,可以自己写一个拍照软件;

也可以在自己软件里调用系统的摄像头,下面先自己写一个摄像头

public class MainActivity extends Activity {
    private SurfaceView previewSV;
   private Camera camera;
   //回调程序,外观控件对象一加载,创建、销毁、改变时对应执行各个回调函数
    private Callback callback=new Callback() {    
        //一摧毁时:
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            if(camera!=null){}
            //停止预览、释放资源、垃圾回收
            camera.stopPreview();
            camera.release();
            camera=null;
        }        
        //一创建时:
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            try {
                //打开摄像头
                camera=Camera.open();    
                
                
                /*          
          如果想改变摄像头的参数,可以进行自定义设置,打印一下看摄像头有哪些参数,都是可改的
                Parameters params=camera.getParameters();
                //打印所有参数的方法:System.out.println(params.flatten());      
                                           设置图片尺寸
                params.setPictureSize(width, height);
                                           设置预览尺寸
                params.setPreviewSize(width, height);
                设置图片质量
                params.setJpegQuality(quality);
                设置好了,执行一下设置
                camera.setParameters(params);
                */
                
                
                //摄像头把预览结果交给外观控件SurfaceView的控制者 ,显示在外观控件上
                camera.setPreviewDisplay(previewSV.getHolder());
                //开始预览,抓取预览交给外观控件
                camera.startPreview();
            } catch (IOException e) {
                e.printStackTrace();
            }        
        }
        //一改变时:
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            
        }
    };
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);    
       previewSV = (SurfaceView) findViewById(R.id.previewSV);
       //设置外观的类型
       previewSV.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
       //设置回调,创建好了外观控件才打开摄像头
       previewSV.getHolder().addCallback(callback);  

    }
    public void take(View view){
        //拍照时手机先自动对焦,对好了才自动拍照,自动对焦回调程序里,设置对焦完成后执行拍照方法
        camera.autoFocus(new MyAutoFocusCallback());       
    }

    private class MyAutoFocusCallback implements AutoFocusCallback{
        @Override
        public void onAutoFocus(boolean success, Camera camera) {
     //拍照函数需要三个callback,一个是快门按下时怎么样、一个是获取到了原始的预览时怎么样,
    一个是当已经拍了获得了压缩好的图片时怎么样
            camera.takePicture(null, null, new MyPictureCallback());
        }
    }
    private class MyPictureCallback implements PictureCallback{
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            try {    
                FileOutputStream fos=new FileOutputStream
                ("/mnt/sdcard/"+System.currentTimeMillis()+".jpg");        
                fos.write(data);
                fos.close();
                //拍完照后继续预览,准备下次拍照
                camera.startPreview();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }        
    }
}

相关清单文件配置信息:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.itheima.takepicture"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity           
            android:configChanges="orientation"           
            android:screenOrientation="landscape"            
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            
            android:name=".MainActivity"
            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>

</manifest>
 
 
 
 
利用隐式意图调用系统的摄像头为我所用,进行拍照
   public void takeImage(View view) {
       Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 创建意图, 指定action
  // 指定照片的存放路径
       imageUri = Uri.parse("file:///mnt/sdcard/" + System.currentTimeMillis() + ".jpg");
  // 把路径放到intent里面,告诉系统文件的存储路径,让系统帮你按指定路径存储照片 
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 
//启动       
 startActivityForResult(intent, 100);
    }
 
利用隐式意图打开刚拍完的照片
public void showImage(View view) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(imageUri, "image/*");
    startActivity(intent);
}
 
 
原文地址:https://www.cnblogs.com/94007boy/p/2797473.html