android 开发-自定义相机

原创 2018年04月15日 19:07:03

一,调用系统相机

    1,用最简单的方式拍到一张照片返回到当前页面

        a,在布局里添加一个按钮和imageview,可以通过设置按钮的onclick 属性绑定一个方法

        b,在按钮的绑定方法里写如下内容:

            

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQ_1);

            这个intent 可以让我们跳转到系统相机的页面,REQ_1 是自定义的整型变量

        c,在获得返回值方法里,添加下面内容,比较简洁就不做过多解释:

                

if (resultCode == RESULT_OK && requestCode == REQ_1) {
    Bundle bundle = data.getExtras();
    Bitmap bitmap = (Bitmap) bundle.get("data");
    imageView.setImageBitmap(bitmap);
}

        里面出现的data 这个名字应该是系统设定的,运行程序就能看到效果,这里看到的照片实际是真实照片的缩略图

    2, 调用系统相机返回一张清晰的照片,思路是:调用系统相机时,给出一个照片存放的路径,拍完后,按照路径来找到真实的照片。

        a,我们需要提前设置存放照片的路径

            

 String imgpath = Environment.getExternalStorageDirectory().getPath();
imgpath = imgpath + "/" + "temp.png";

        b, 开始跳转,并传入需要设定的路径

        

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri uri = Uri.fromFile(new File(imgpath)); // 用路径生成一个android 包下的Uri
intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);// 设置照片存储路径
startActivityForResult(intent, REQ_2);

        这一步需要添加访问sd卡的权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    c,在获得返回值的方法里,从路径读取照片

    

FileInputStream   fileInputStream = new FileInputStream(imgpath);
Bitmap bitmap = BitmapFactory.decodeStream(fileInputStream);
imageView.setImageBitmap(bitmap);
    这里的imgpath 就是一个字符串变量,里面保存的是之前设置的路径,这里因为设计io流,所以需要抓去异常,包围try/catch就可以了

    然后就可以运行程序试试了,这里可能存在高的安卓系统出现不兼容问题,我在模拟器上可以运行,在手机就会报错

二,一个自定义的相机,能够返回一个清晰的照片

        1, 添加基础元素

            a,在布局文件里,添加surfaceView 布局,ImageView布局,一个按钮

            b,声明一个Camera对象,并进行实例化

                Camera camera = Camera.open();

            c ,建立一些必要的对象,这里需要让activity 实现 SurfaceHolder.Callback接口

                

private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
            
surfaceView = (SurfaceView)findViewById(R.id.preview);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);


            d. 对Camera进行预览:

                

camera.setPreviewDisplay(holder);
//将系统camera 预览角度旋转90度
camera.setDisplayOrientation(90);
camera.startPreview();

        其中的holder就是上文中的surfaceholder

在按钮的绑定方法中添加如下内容

Camera.Parameters parameters = camera.getParameters(); // 利用Parameters对相机的参数进行设置
parameters.setPictureFormat(ImageFormat.JPEG); //设置照片格式
Camera.Size size = parametersset(camera); // 这里利用自定义函数parametersset()获得相机支持的最大图片大小
parameters.setPictureSize(size.width,size.height);// 对图片的大小进行设置,越大则图片越清晰
parameters.setJpegQuality(100);//设置照片质量,1-100,
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);// 设置照片对焦方式
camera.setParameters(parameters);// 让相机的对象完成刚才的设置
camera.autoFocus(new Camera.AutoFocusCallback() {
    @Override
    public void onAutoFocus(boolean b, Camera camera) {
        if (b){
            camera.takePicture(null,null,pictureCallback);
        }
    }
});
public Camera.Size parametersset(Camera camera) { // 获取相机所支持的最大照片大小
    List<Camera.Size> pictureSizes = camera.getParameters().getSupportedPictureSizes();
    Camera.Size psize=null;
    for (int i = 0; i < pictureSizes.size(); i++) {
        psize = pictureSizes.get(i);
    }
    return psize;
}

这里面的pictureCallback对象需要提前声明一下

private Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
    @Override
    public void onPictureTaken(byte[] bytes, Camera camera) {
        File file = new File("/sdcard/temp.png");
        filepath = file.getAbsolutePath();
        try {
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            fileOutputStream.write(bytes);
            fileOutputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
};

最后还需要在程序终止时对相机进行关闭

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        if( camera !=null) {
            camera.setPreviewCallback(null); // 将相机的回调置空,取消surfaceview 和相机的关联操作
            camera.stopPreview();//取消相机的取景功能
            camera.release();//释放相机所占用的系统资源
            camera=null;
        }
    }
}

再就是权限设置了

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />

相机和sd卡的权限

到这里就结束了,如果还不太清楚的可以看我的博客里的源代码,名称为CameraTest


Android实战开发:自定义照相机

之前在公司写了一个自定义CameraView,年代久远,回头看代码时居然有点看不懂了。。。 真是好记性不如烂笔头啊~ 趁着年底不忙有时间,再次重写下Camera,话不多说,开始撸代码。...
  • u011326979
  • u011326979
  • 2016-01-08 16:19:41
  • 1477

Android 自定义相机 CameraDIY源码

  • 2015年10月28日 15:35
  • 10.63MB
  • 下载

Android 自定义相机Demo源码

模仿360相机,图片资源来源于360相机,仅供学习使用。使用过程中遇到问题或Bug可发我邮箱405376689@qq.com。对了,未做兼容性测试不保证所有机型和sdk版本可通用。 截图如下: ...
  • hjksfej
  • hjksfej
  • 2015-06-01 14:09:38
  • 684

android开发——自定义相机(Camera)开发总结

最近这段时间我一直在开发自定义相机,谷歌了些网上的demo,发现有很多各种各样的问题。最终还是从API的camera类开始学习,进行改进。下面对之前的实现进行一些总结。官方camera API: h...
  • zhoubin1992
  • zhoubin1992
  • 2015-08-14 23:46:42
  • 2278

Android相机调用和自定义相机Demo源码

  • 2014年08月30日 22:10
  • 1.01MB
  • 下载

Android实现自定义的相机

使用系统相机android中使用系统相机是很方便的,单这仅仅是简单的使用而已,并不能获得什么特殊的效果。要想让应用有相机的action,咱们就必须在清单文件中做一些声明,好让系统知道,如下 ...
  • Marksinoberg
  • Marksinoberg
  • 2015-11-22 14:05:41
  • 8117

使用android.hardware.camera2打造新的自定义相机

android.hardware.camera2这个包提供了相机设备和安卓设备连接的接口,他的存在弃用了原有的Camera相机。 和原有的旧API中的camera不同的是,camera2大大的提...
  • qq_27512671
  • qq_27512671
  • 2016-03-31 15:17:13
  • 12209

【Android 开发】SufaceView自定义相机拍照

前段时间写了关于一篇关于调用系统相机的博客,最近发现不同手机,调用系统相机效果不太好,所以学习Android 的相机原理,自定义了一个Android相机。看了这篇博客,相信大家都会写一个自己的相机。...
  • u013132758
  • u013132758
  • 2016-04-22 18:34:56
  • 2472

Android Eclipse 自定义相机

  • 2017年09月15日 16:18
  • 523KB
  • 下载
收藏助手
不良信息举报
您举报文章:android 开发-自定义相机
举报原因:
原因补充:

(最多只允许输入30个字)