zoukankan      html  css  js  c++  java
  • 初识安卓之自定义摄像头拍照和调用系统摄像头拍照

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

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

    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);
    }
     
     
  • 相关阅读:
    深度css: 层级树及zindex属性
    点“九”切图教程分享
    简析 iOS 程序图标的设计
    网站打开时Waiting(TTFP)时间反应很久的问题解决
    CentOS最小化安装网卡ens33没有IP地址问题解决
    怎么使用XShell远程连接服务器?
    Linux发行版时间线分支图最新版
    pstree命令找不到解决方法
    解决网站出现Error Establishing Database Connection问题
    图片地址
  • 原文地址:https://www.cnblogs.com/94007boy/p/2797473.html
Copyright © 2011-2022 走看看