6102—android摄像头—自定义照相

1—自定义照相

         AndroidManifest.xml添加权限

<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"    />
    <uses-feature android:name="android.hardware.amera.autofocus"   />

  拍照逻辑 

public class MainActivity extends Activity {

    private  Camera _camera;
    private boolean isPreview=false;            //定义非预览状态


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        //判断手机是否拥有SD卡
        if(!android.os.Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED )){
            Toast.makeText(this, "请安装SD卡", Toast.LENGTH_SHORT).show();
        }

        SurfaceView sv=(SurfaceView)findViewById(R.id.surfaceView);
        final SurfaceHolder sh=sv.getHolder();      //获取SurfaceHolder对象
        sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);            //自己不维护缓冲
        ImageButton preview=(ImageButton)findViewById(R.id.preview);
        ImageButton takePicture=(ImageButton)findViewById(R.id.takephoto);

        preview.setOnClickListener(new View.OnClickListener(){  //实现相机预览功能

            @Override
            public void onClick(View v) {
                if(!isPreview){ //如果相机为非预览模式,则打开相机
                    _camera=Camera.open();          //打开相机(默认为后)
                    isPreview=true;
                }
                try{
                    _camera.setPreviewDisplay(sh);      //设置用于显示预览的surfaceVieww
                    Camera.Parameters parms= _camera.getParameters();
                    parms.setPictureFormat(PixelFormat.JPEG);       //指定图片为JPEG篾片
                    parms.set("jpeg-quality",80);               //设置图片的质量
                    _camera.setParameters(parms);
                    _camera.startPreview();                     //开始预览
                    _camera.autoFocus(null) ;               //设置自动对焦

                }catch (IOException e){
                    e.printStackTrace();
                }


            }
        });

        /**
         * 实现相机拍照功能
         */
        takePicture.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                if(_camera!=null){
                    _camera.takePicture(null,null,jpeg);    //进行拍照
                }
            }
        });
    }

    /**
     * 实现将照片保存存系统图库中
     */
    final  Camera.PictureCallback jpeg=new Camera.PictureCallback(){    //照片回调函数

        @Override
        public void onPictureTaken(byte[] data, Camera cam) {
            //根据拍照所得的数据创建位图
            final Bitmap bm=BitmapFactory.decodeByteArray(data,0,data.length);
            cam.stopPreview();  //停止预览
            isPreview=false;            //设置为非预览方式

            //获取SD卡根目录
            File appDir=new File(Environment.getExternalStorageDirectory(),"/DCIM/Camerra/");
            if(!appDir.exists()){   //如果该目录不存在
                appDir.mkdir();
            }

            String fileName=System.currentTimeMillis()+".jpg";  //将当前时间设置为文件名称
            File file=new File(appDir,fileName);

            try{    //保存拍照的图片
                FileOutputStream fos=new FileOutputStream(file);    //创建一个文件输出流对象
                bm.compress(Bitmap.CompressFormat.JPEG,100,fos);    //将图片内容压缩到输出流中
                fos.flush();                //将缓冲区数据全部写出到输出流
                fos.close();                //关闭文件输出流

            }catch (FileNotFoundException e){
                e.printStackTrace();
            }catch (IOException e){
                e.printStackTrace();
            }

            //将图片插入到系统图库
            try{
                MediaStore.Images.Media.insertImage(MainActivity.this.getContentResolver(),
                            file.getAbsolutePath(),fileName,null);
            }catch (FileNotFoundException e){
                e.printStackTrace();
            }

            //通知图库更新
            MainActivity.this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
                    Uri.parse("file://"+"")));
            Toast.makeText(MainActivity.this, "照片保存到:"+file, Toast.LENGTH_SHORT).show();
            resetCamera();
        }
    };

    /**
     * 重新预览方法
     */
    private  void resetCamera(){
        if(!isPreview){
            _camera.startPreview();
            isPreview=true;
        }
    }

    @Override
    protected void onPause() {  //当暂停activity时,停止预览并释放资源
        if(_camera!=null){
            _camera.stopPreview();
            _camera.release();          //释放资源
        }

        super.onPause();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值