广告
返回顶部
首页 > 资讯 > 精选 >Android怎么自定义Camera实现拍照小功能
  • 553
分享到

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

2023-06-30 14:06:59 553人浏览 泡泡鱼
摘要

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

这篇文章主要介绍“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实现拍照小功能”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Android怎么自定义Camera实现拍照小功能

本文链接: https://www.lsjlt.com/news/329712.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android自定义Camera实现拍照小功能
    本文实例为大家分享了Android自定义Camera实现拍照的具体代码,供大家参考,具体内容如下 本篇文章就项目开发遇到问题记录下; 1.拍照图片被压缩问题2.拍照图片被旋转问题 首...
    99+
    2022-11-13
  • Android怎么自定义Camera实现拍照小功能
    这篇文章主要介绍“Android怎么自定义Camera实现拍照小功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android怎么自定义Camera实现拍照小功能”文章能帮助大家解决问题。首先实现...
    99+
    2023-06-30
  • android中怎么通过自定义Camera实现拍照
    android中怎么通过自定义Camera实现拍照,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、打开相机a.预览拍摄图片,需用到SurfaceView,并且...
    99+
    2023-05-31
    android camera
  • Android自定义相机实现定时拍照功能
    这篇博客为大家介绍Android自定义相机,并且实现倒计时拍照功能。 首先自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件: activity_...
    99+
    2022-06-06
    相机 Android
  • Android中怎么实现拍照功能
    这期内容当中小编将会给大家带来有关Android中怎么实现拍照功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。解析:1)判断是否有摄像头checkCameraHardware(this) 2)获得相机c...
    99+
    2023-05-30
    android
  • Android自定义View实现照片裁剪框与照片裁剪功能
    本文所需要实现的就是这样一种有逼格的效果: 右上角加了个图片框,按下确定可以裁剪正方形区域里的图片并显示在右上角。 实现思路: 1:首先需要自定义一个ZoomImageVie...
    99+
    2022-06-06
    view Android
  • Android中怎么实现微信朋友圈拍照上传功能
    Android中怎么实现微信朋友圈拍照上传功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. PhotoPicker的使用这是一个支持选择多张图片,点击图片放大,图片之间左...
    99+
    2023-05-30
  • Android使用系统自带的相机实现一键拍照功能
    今天分享的是用系统自带的相机实现一键拍照功能。 public class MainActivity extends AppCompatActivity { private s...
    99+
    2022-06-06
    系统 相机 Android
  • 自定义搜索功能Android实现
    先看看效果图: 源码下载:自定义搜索功能 代码: SearchActivity.java package com.bzu.gxs.search.activity; impo...
    99+
    2022-06-06
    自定义 Android
  • Android中怎么实现一个拍照翻译小程序
    本篇文章为大家展示了Android中怎么实现一个拍照翻译小程序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1 开发准备  由于使用了云侧的服务,需要到华为的开发者联盟注册开发者账号,并且在云端开通...
    99+
    2023-06-04
  • Android自定义SurfaceView实现画板功能
    接触了这么久的View,总不能一直停留在View里,现在开始呢,就要学习一个新的知识点:SurfaceView,实际上SurfaceView与View的原理都差不多,只是效率和...
    99+
    2022-06-06
    surfaceview 画板 Android
  • Android自定义View实现时钟功能
    最近在练习自定义view, 想起之前面试的时候笔试有道题是写出自定义一个时钟的关键代码. 今天就来实现一下. 步骤依然是先分析, 再上代码. 实现效果 View分析 时钟主要分为五...
    99+
    2022-11-13
  • Android怎么自定义View实现简易画板功能
    这篇文章主要介绍“Android怎么自定义View实现简易画板功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android怎么自定义View实现简易画板功能”文章能帮助大家解决问题。自定义VIe...
    99+
    2023-06-30
  • Android自定义View实现自动吸附功能
    本文实例为大家分享了Android实现自动吸附功能的具体代码,供大家参考,具体内容如下 1.简述 最近开发app过程中要实现拖动view后要可以自动吸附功能,所以需要自定义vi...
    99+
    2022-06-06
    自动 view Android
  • 怎么在HTML5中实现拍照和摄像机功能
    本篇文章为大家展示了怎么在HTML5中实现拍照和摄像机功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。拍照HTML5的getUserMedia API为用户提供访问硬件设备媒体(摄像头、视频、音频...
    99+
    2023-06-09
  • Android自定义桌面功能代码实现
    先上运行效果图首先我们要把一张自己喜欢的图片放到sdcard中,总之,只要我们可以获取这个图片就可以了。 我这里是放在sdcard中的,可以在eclipse中用鼠标点击导入,比...
    99+
    2022-06-06
    Android
  • 怎么在Android应用中实现一个单击拍照长按录像功能
    怎么在Android应用中实现一个单击拍照长按录像功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在modlue gradle中添加compile '...
    99+
    2023-05-31
    android roi
  • 怎么用Java+OpenCV调用摄像头实现拍照功能
    这篇文章主要介绍了怎么用Java+OpenCV调用摄像头实现拍照功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Java+OpenCV调用摄像头实现拍照功能文章都会有所收获,下面我们一起来看看吧。环境准...
    99+
    2023-06-29
  • Android编程实现自定义title功能示例
    本文实例讲述了Android编程实现自定义title功能。分享给大家供大家参考,具体如下: 这里我在前面加了个logo,而且改变了title的背景和高度。 首先编写title...
    99+
    2022-06-06
    示例 title Android
  • Android自定义View实现简易画板功能
    本文实例为大家分享了Android自定义View实现简易画板的具体代码,供大家参考,具体内容如下 自定义VIew实现简易画板效果,功能包括清空、选择颜色,选择大小,效果如下 画板布...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作