千家信息网

Android怎么自定义Camera实现拍照小功能

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍"Android怎么自定义Camera实现拍照小功能"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Android怎么自定义Camera实现拍照
千家信息网最后更新 2026年10月31日Android怎么自定义Camera实现拍照小功能

这篇文章主要介绍"Android怎么自定义Camera实现拍照小功能"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Android怎么自定义Camera实现拍照小功能"文章能帮助大家解决问题。

首先实现一个自定义拍照功能。

自定义布局

            

初始化控件:

surfaceView = (SurfaceView) findViewById(R.id.surface);holder = surfaceView.getHolder();holder.addCallback(this);holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);btn.setOnCLickListener(new OnClickLister(View v){    if(mCamera == null){        mCamera = Camera.open();    }mCamera.takePicture(null,null,this);}); @Overridepublic void surfaceCreated(SurfaceHolder surfaceHolder) {      initStartCamera(surfaceHolder);}@Overridepublic void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {          mCamera.autoFocus(new Camera.AutoFocusCallback() {            @Override            public void onAutoFocus(boolean success, Camera camera) {                isAutoFocus = success;                initCameraParams();                mCamera.cancelAutoFocus();                mCamera.startPreview();            }        });}@Override   public void surfaceDestroyed(SurfaceHolder surfaceHolder) {       // 当holder被回收时 释放硬件       //   releaseCamera();   }     @Override    protected void onPause() {        super.onPause();        releaseCameraSource();    }  @Override    protected void onResume() {        super.onResume();        // TODO:  看看退出到其他页面是否有黑屏现象        if (surfaceView != null) {            surfaceView.postDelayed(new Runnable() {                @Override                public void run() {                    initCameraParams();                }            }, 50);        }    }  private void initStartCamera(SurfaceHolder surfaceHolder) {        try {            mCamera = Camera.open();            mCamera.setDisplayOrientation(90);            mCamera.setPreviewDisplay(surfaceHolder);            mCamera.startPreview();        } catch (IOException e) {            e.printStackTrace();        }    }private void initCameraParams() {        if (mCamera != null) {            Camera.Parameters parameters = mCamera.getParameters();            parameters.setPictureFormat(ImageFormat.JPEG);            parameters.setJpegQuality(90);            List supportedPictureSizes = parameters.getSupportedPictureSizes();            WindowManager manager = (WindowManager) getSystemService(WINDOW_SERVICE);            Display display = manager.getDefaultDisplay();            Point point = new Point();            display.getSize(point);            int screenWidth = point.x;            int screenHeight = point.y;            // 找到适合的图片的尺寸            if (supportedPictureSizes != null && !supportedPictureSizes.isEmpty()) {                int screenSize = screenHeight * screenWidth;                Camera.Size picSize = null;                for (Camera.Size size : supportedPictureSizes) {                    int value = size.height * size.width;                    if (value <= screenSize) {                        if (picSize == null) {                            picSize = size;                        } else {                            // 取最接近屏幕尺寸的                            if (value > picSize.width * picSize.height) {                                picSize = size;                            }                        }                    }                }                if (picSize == null) {                    picSize = supportedPictureSizes.get(0);                }                parameters.setPictureSize(picSize.width, picSize.height);            }            // 设置对焦模式            List supportedFocusModes = parameters.getSupportedFocusModes();            if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {                // 快速对焦                parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);            } else {                parameters.setFocusMode(Camera.Parameters.FLASH_MODE_AUTO);            }            try {                mCamera.setParameters(parameters);                mCamera.startPreview();            } catch (Exception e) {                e.printStackTrace();            }        }    } private void releaseCameraSource() {        if (mCamera != null) {            mCamera.setPreviewCallback(null);            mCamera.stopPreview();            mCamera.release();            mCamera = null;        }    }

调用相机的拍摄功能:

点击拍照调用camera.takePicture(null,null,this);

获取拍照回调回来的图片数据

public void onPictureTaken(final byte[] bytes,final Camera camera){   // 拍照回掉回来的 图片数据。        final String filePath = Environment.getExternalStorageDirectory().getPath() + "/DCIM/Camera/";        final String picturePath = System.currentTimeMillis() + ".jpg";        final File file = new File(filePath, picturePath);        new Thread(new Runnable() {            @Override            public void run() {                Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);                bitmap = rotateBitmapByDegree(bitmap, 90);                BufferedOutputStream bos = null;                try {                //防止拍照保存图片被压缩                    bos = new BufferedOutputStream(new FileOutputStream(file));                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);                    bos.flush();                    bos.close();                    bitmap.recycle();                    Intent intent = new Intent(TakePhotoActivity.this,TPreViewPicActivity.class);                    intent.putExtra("filePath",filePath);                    intent.putExtra("picturePath",picturePath);                    startActivityForResult(intent,102);                } catch (FileNotFoundException e1) {                    e1.printStackTrace();                } catch (IOException e1) {                    e1.printStackTrace();                }            }        }).start();}

接下来要说的就是我们上面说到的保存图片被旋转的问题:

public Bitmap rotateBitmapByDegree(Bitmap bm,int degree){  Bitmap bitmap ;  Matrix matrix = new Matrix();  matrix.postRotate(degree);  try{  bitmap  = Bitmap.createBitmap(bm,0,bm.getWidth,bm.getHeight,matrix,true);}catch(OutOfMemoryError e){  e.printStackTrace();}if(bitmap == null){bitmap = bm;}if(bm != bitmap){ bm.recycle();}return bitmap;}@Overridepublic void onPause(){super.onPause();if(camera != null){    if(isPrevew){        camera.stopPreview();        camera.release();        camera= null;        isPreView= false;    } }}@Override    protected void onResume() {        super.onResume();        openCamera();    }

*#额外要说明的是,android 6.0权限问题,可能会导致首次进入拍照界面黑屏,解决方案在拍照界面之前请求权限;

最后附上请求权限代码:

public void checkPermission() {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {            requestPermissions(new String[]{Manifest.permission.CAMERA}                    , new TCallPhoneTool.PermissionListener() {                        @Override                        public void onGranted() {//                            openCamera();                        }                        @Override                        public void onRefused(List deniedPermissions) {                            showMissingPermissionDialog();                        }                    });        } else {//            openCamera();        }    }  TCallPhoneTool.PermissionListener mListener ;    final int REQUEST_CODE_STORAGE = 131;    public void requestPermissions(String[] permissions, TCallPhoneTool.PermissionListener listener) {        List deniedPermissions = new ArrayList<>() ;        mListener = listener ;        for (String permission : permissions) {            if (ContextCompat.checkSelfPermission(this,permission) == PackageManager.PERMISSION_DENIED) {                deniedPermissions.add(permission);            }        }        if (deniedPermissions.size() > 0) {            ActivityCompat.requestPermissions(this,deniedPermissions.toArray(new String[deniedPermissions.size()]),REQUEST_CODE_STORAGE);        } else {            mListener.onGranted();        }    }   public void showMissingPermissionDialog() {        android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(this);        builder.setTitle(getString(com.to8to.baselib.R.string.tip_permision_miss));        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                finish();            }        });        builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                startAppSetting();            }        });        builder.setCancelable(false);        builder.show();   public void startAppSetting() {        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);        intent.setData(Uri.parse("package:" + this.getPackageName()));        startActivity(intent);    }

关于"Android怎么自定义Camera实现拍照小功能"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

功能 图片 权限 知识 问题 数据 界面 行业 不同 实用 接下来 代码 内容 实用性 实际 就是 尺寸 布局 控件 文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技有限公司经营范围 互联网科技公司税收优惠 腾讯阿里互联网科技 互联网的科技创新 广州互联网络科技有限公司 多迪互联网科技有限公司 哈尔滨新华互联网科技 互联网和高科技公司 互联网之后的科技是什么 黑科技闪耀互联网之光 苏州五指互联网络科技有限 东莞新华互联网科技学校 深圳市罗太互联网科技有限公司 科技赋能视角下互联网保险发展 南通创西澳互联网科技有限公司 上海同邻互联网科技有限公司规模 互联网科技机房 求路客互联网科技电话 科技互联网经济论坛 广州全民伙伴互联网科技有限公司 上海喔噻互联网科技有限公司 互联网科技工作委员会 互联网科技官网 碳银互联网科技 菲比寻常互联网科技 云创客互联网科技公司 徐州市互联网科技有限公司 上海创道互联网络科技有限公司 宇信科技在杭州互联网排第几 广西泛欧互联网科技有限公司
0