文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-30 14:37

关注

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

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

自定义布局

<FrameLayout        android:layout_below="@id/toolbar_layout"        android:layout_width="match_parent"        android:layout_height="match_parent" >        <SurfaceView            android:id="@+id/surface"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:keepScreenOn="true"/>    </FrameLayout>

初始化控件:

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<Camera.Size> 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<String> 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<String> deniedPermissions) {                            showMissingPermissionDialog();                        }                    });        } else {//            openCamera();        }    }  TCallPhoneTool.PermissionListener mListener ;    final int REQUEST_CODE_STORAGE = 131;    public void requestPermissions(String[] permissions, TCallPhoneTool.PermissionListener listener) {        List<String> 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实现拍照小功能”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯